diff --git a/.gitignore b/.gitignore
index 7562384..72b2e8c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,6 +14,7 @@
 /out
 /xcodebuild
 /.flaky.log
+/.debug.log
 /*.Makefile
 /*.opensdf
 /*.pyc
diff --git a/client/dart.js b/client/dart.js
index 1777e22..f13841a 100644
--- a/client/dart.js
+++ b/client/dart.js
@@ -2,6 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+var warning = [
+  'WARNING: This page is using a deprecated dart.js file. ',
+  'Please update this page as described here: ',
+  'http://news.dartlang.org/2013/01/big-breaking-change-dartjs-bootstrap-file-moving-to-pub.html'
+].join('');
+console.error(warning);
+
 // Bootstrap support for Dart scripts on the page as this script.
 if (navigator.webkitStartDart) {
   if (!navigator.webkitStartDart()) {
diff --git a/compiler/dart-compiler.gyp b/compiler/dart-compiler.gyp
index 53a2db0..2dd44c0 100644
--- a/compiler/dart-compiler.gyp
+++ b/compiler/dart-compiler.gyp
@@ -53,7 +53,7 @@
             '<(PRODUCT_DIR)/analyzer/util/analyzer/guava/r09/guava-r09.jar',
           ],
           'action' : [
-            '../third_party/apache_ant/v1_7_1/bin/ant<(script_suffix)',
+            '../third_party/apache_ant/1.8.4/bin/ant<(script_suffix)',
             '-f', 'dart_analyzer.xml',
             '-Dbuild.dir=<(INTERMEDIATE_DIR)/<(_target_name)',
             '-Ddist.dir=<(PRODUCT_DIR)/analyzer',
diff --git a/compiler/dart_analyzer.xml b/compiler/dart_analyzer.xml
index 0d3acd6..01a5adc 100644
--- a/compiler/dart_analyzer.xml
+++ b/compiler/dart_analyzer.xml
@@ -74,7 +74,8 @@
            fork="true"
            debug="true"
            source="1.6"
-           target="1.6">
+           target="1.6"
+           includeAntRuntime="false">
       <classpath refid="classpath.compile"/>
     </javac>
     <!--
@@ -99,7 +100,8 @@
            fork="true"
            debug="true"
            source="1.6"
-           target="1.6">
+           target="1.6"
+           includeAntRuntime="false">
       <classpath refid="classpath.compile.tests"/>
     </javac>
     <!--
diff --git a/compiler/dartium.gyp b/compiler/dartium.gyp
index 91f0ec4..3be681b 100644
--- a/compiler/dartium.gyp
+++ b/compiler/dartium.gyp
@@ -23,7 +23,7 @@
             'dummy_target',
           ],
           'action' : [
-            '../third_party/apache_ant/v1_7_1/bin/ant',
+            '../third_party/apache_ant/1.8.4/bin/ant',
             '-Dbuild.dir=<(PRODUCT_DIR)/ant-out',
             'clean',
             'dist',
diff --git a/dart.gyp b/dart.gyp
index 72827a0..4978590 100644
--- a/dart.gyp
+++ b/dart.gyp
@@ -117,19 +117,25 @@
       'target_name': 'samples',
       'type': 'none',
       'conditions': [
-         ['OS=="android"', {
-            'dependencies': [
-              'samples/android_sample/android_sample.gyp:android_sample',
-            ],
+        ['OS=="android"', {
+           'dependencies': [
+             'samples/android_sample/android_sample.gyp:android_sample',
+           ],
           },
         ],
-         ['OS!="android"', {
-            'dependencies': [
-              'samples/sample_extension/sample_extension.gyp:sample_extension',
-            ],
+        ['OS=="win"', {
+           'dependencies': [
+             'samples/sample_extension/sample_extension.gyp:sample_extension',
+           ],
           },
-        ]
-      ],
+        ],
+        ['OS=="mac" or OS=="linux"', {
+           'dependencies': [
+             'samples/sample_extension/sample_extension.gyp:sample_extension',
+           ],
+          },
+        ],
+      ]
     },
     {
       'target_name': 'packages',
diff --git a/pkg/http/lib/src/multipart_request.dart b/pkg/http/lib/src/multipart_request.dart
index 0272a0b..b5ca43c 100644
--- a/pkg/http/lib/src/multipart_request.dart
+++ b/pkg/http/lib/src/multipart_request.dart
@@ -94,7 +94,7 @@
     headers['content-transfer-encoding'] = 'binary';
     super.finalize();
 
-    var controller = new StreamController<List<int>>.singleSubscription();
+    var controller = new StreamController<List<int>>();
 
     void writeAscii(String string) {
       assert(isPlainAscii(string));
@@ -123,7 +123,7 @@
       controller.close();
     });
 
-    return new ByteStream(controller);
+    return new ByteStream(controller.stream);
   }
 
   /// All character codes that are valid in multipart boundaries. From
diff --git a/pkg/http/lib/src/streamed_request.dart b/pkg/http/lib/src/streamed_request.dart
index ded21e0..a87d27b 100644
--- a/pkg/http/lib/src/streamed_request.dart
+++ b/pkg/http/lib/src/streamed_request.dart
@@ -33,13 +33,13 @@
   /// Creates a new streaming request.
   StreamedRequest(String method, Uri url)
     : super(method, url),
-      _controller = new StreamController<List<int>>.singleSubscription();
+      _controller = new StreamController<List<int>>();
 
   /// Freezes all mutable fields other than [stream] and returns a
   /// single-subscription [ByteStream] that emits the data being written to
   /// [sink].
   ByteStream finalize() {
     super.finalize();
-    return new ByteStream(_controller);
+    return new ByteStream(_controller.stream);
   }
 }
diff --git a/pkg/http/lib/src/utils.dart b/pkg/http/lib/src/utils.dart
index bca314d..1449080 100644
--- a/pkg/http/lib/src/utils.dart
+++ b/pkg/http/lib/src/utils.dart
@@ -155,11 +155,11 @@
 ByteStream wrapInputStream(InputStream stream) {
   if (stream.closed) return emptyStream;
 
-  var controller = new StreamController.singleSubscription();
+  var controller = new StreamController();
   stream.onClosed = controller.close;
   stream.onData = () => controller.add(stream.read());
   stream.onError = (e) => controller.signalError(new AsyncError(e));
-  return new ByteStream(controller);
+  return new ByteStream(controller.stream);
 }
 
 // TODO(nweiz): remove this once issue 7785 is fixed.
@@ -242,10 +242,10 @@
 /// Creates a single-subscription stream that emits the items in [iter] and then
 /// ends.
 Stream streamFromIterable(Iterable iter) {
-  var stream = new StreamController.singleSubscription();
-  iter.forEach(stream.add);
-  stream.close();
-  return stream.stream;
+  var controller = new StreamController();
+  iter.forEach(controller.add);
+  controller.close();
+  return controller.stream;
 }
 
 // TODO(nweiz): remove this when issue 7787 is fixed.
@@ -253,8 +253,8 @@
 /// errors from [stream]. This is useful if [stream] is single-subscription but
 /// multiple subscribers are necessary.
 Pair<Stream, Stream> tee(Stream stream) {
-  var controller1 = new StreamController.singleSubscription();
-  var controller2 = new StreamController.singleSubscription();
+  var controller1 = new StreamController();
+  var controller2 = new StreamController();
   stream.listen((value) {
     controller1.add(value);
     controller2.add(value);
diff --git a/pkg/http/test/mock_client_test.dart b/pkg/http/test/mock_client_test.dart
index 02e713b..1ffc373 100644
--- a/pkg/http/test/mock_client_test.dart
+++ b/pkg/http/test/mock_client_test.dart
@@ -35,13 +35,13 @@
   test('handles a streamed request', () {
     var client = new MockClient.streaming((request, bodyStream) {
       return bodyStream.bytesToString().then((bodyString) {
-        var stream = new StreamController<List<int>>.singleSubscription();
+        var controller = new StreamController<List<int>>();
         async.then((_) {
-          stream.add('Request body was "$bodyString"'.charCodes);
-          stream.close();
+          controller.add('Request body was "$bodyString"'.charCodes);
+          controller.close();
         });
 
-        return new http.StreamedResponse(stream, 200, -1);
+        return new http.StreamedResponse(controller.stream, 200, -1);
       });
     });
 
diff --git a/pkg/http/test/multipart_test.dart b/pkg/http/test/multipart_test.dart
index ab6d25a..64fd330 100644
--- a/pkg/http/test/multipart_test.dart
+++ b/pkg/http/test/multipart_test.dart
@@ -156,8 +156,8 @@
 
   test('with a stream file', () {
     var request = new http.MultipartRequest('POST', dummyUrl);
-    var stream = new StreamController.singleSubscription();
-    request.files.add(new http.MultipartFile('file', stream, 5));
+    var controller = new StreamController();
+    request.files.add(new http.MultipartFile('file', controller.stream, 5));
 
     expect(request, bodyMatches('''
         --{{boundary}}
@@ -168,14 +168,14 @@
         --{{boundary}}--
         '''));
 
-    stream.add([104, 101, 108, 108, 111]);
-    stream.close();
+    controller.add([104, 101, 108, 108, 111]);
+    controller.close();
   });
 
   test('with an empty stream file', () {
     var request = new http.MultipartRequest('POST', dummyUrl);
-    var stream = new StreamController.singleSubscription();
-    request.files.add(new http.MultipartFile('file', stream, 0));
+    var controller = new StreamController();
+    request.files.add(new http.MultipartFile('file', controller.stream, 0));
 
     expect(request, bodyMatches('''
         --{{boundary}}
@@ -186,7 +186,7 @@
         --{{boundary}}--
         '''));
 
-    stream.close();
+    controller.close();
   });
 
   test('with a byte file', () {
diff --git a/pkg/http/test/response_test.dart b/pkg/http/test/response_test.dart
index db19f88..252df4a 100644
--- a/pkg/http/test/response_test.dart
+++ b/pkg/http/test/response_test.dart
@@ -44,26 +44,27 @@
 
   group('.fromStream()', () {
     test('sets body', () {
-      var stream = new StreamController.singleSubscription();
-      var streamResponse = new http.StreamedResponse(stream, 200, 13);
+      var controller = new StreamController();
+      var streamResponse = new http.StreamedResponse(
+          controller.stream, 200, 13);
       var future = http.Response.fromStream(streamResponse)
         .then((response) => response.body);
       expect(future, completion(equals("Hello, world!")));
 
-      stream.add([72, 101, 108, 108, 111, 44, 32]);
-      stream.add([119, 111, 114, 108, 100, 33]);
-      stream.close();
+      controller.add([72, 101, 108, 108, 111, 44, 32]);
+      controller.add([119, 111, 114, 108, 100, 33]);
+      controller.close();
     });
 
     test('sets bodyBytes', () {
-      var stream = new StreamController.singleSubscription();
-      var streamResponse = new http.StreamedResponse(stream, 200, 5);
+      var controller = new StreamController();
+      var streamResponse = new http.StreamedResponse(controller.stream, 200, 5);
       var future = http.Response.fromStream(streamResponse)
         .then((response) => response.bodyBytes);
       expect(future, completion(equals([104, 101, 108, 108, 111])));
 
-      stream.add([104, 101, 108, 108, 111]);
-      stream.close();
+      controller.add([104, 101, 108, 108, 111]);
+      controller.close();
     });
   });
 }
diff --git a/pkg/http/test/utils.dart b/pkg/http/test/utils.dart
index 003cf39..66ab824 100644
--- a/pkg/http/test/utils.dart
+++ b/pkg/http/test/utils.dart
@@ -138,7 +138,7 @@
   }
 }
 
-// TODO(nweiz): remove this once it's built in to unittest
+// TODO(nweiz): remove this once it's built in to unittest (issue 7922).
 /// A matcher for StateErrors.
 const isStateError = const _StateError();
 
diff --git a/pkg/intl/test/find_default_locale_browser_test.dart b/pkg/intl/test/find_default_locale_browser_test.dart
index 51fdaf6..1cc177eb 100644
--- a/pkg/intl/test/find_default_locale_browser_test.dart
+++ b/pkg/intl/test/find_default_locale_browser_test.dart
@@ -21,7 +21,11 @@
 
 verifyLocale(_) {
   expect(Intl.systemLocale, isNot(equals("xx_YY")));
+  // Allow either en_US or just en type locales. Windows in particular may
+  // give us just ru for ru_RU
   var pattern = new RegExp(r"\w\w_[A-Z0-9]+");
+  var shortPattern = new RegExp(r"\w\w");
   var match = pattern.hasMatch(Intl.systemLocale);
-  expect(match, isTrue);
+  var shortMatch = shortPattern.hasMatch(Intl.systemLocale);
+  expect(match || shortMatch, isTrue);
 }
diff --git a/pkg/intl/test/find_default_locale_standalone_test.dart b/pkg/intl/test/find_default_locale_standalone_test.dart
index 82ebd28..b27b578 100644
--- a/pkg/intl/test/find_default_locale_standalone_test.dart
+++ b/pkg/intl/test/find_default_locale_standalone_test.dart
@@ -22,6 +22,8 @@
 verifyLocale(_) {
   expect(Intl.systemLocale, isNot(equals("xx_YY")));
   var pattern = new RegExp(r"\w\w_[A-Z0-9]+");
+  var shortPattern = new RegExp(r"\w\w");
   var match = pattern.hasMatch(Intl.systemLocale);
-  expect(match, isTrue);
+  var shortMatch = shortPattern.hasMatch(Intl.systemLocale);
+  expect(match || shortMatch, isTrue);
 }
diff --git a/pkg/serialization/lib/serialization.dart b/pkg/serialization/lib/serialization.dart
index d3e437b..7225476 100644
--- a/pkg/serialization/lib/serialization.dart
+++ b/pkg/serialization/lib/serialization.dart
@@ -87,7 +87,7 @@
  *      addressToMap(a) => {"number" : a.number, "street" : a.street,
  *          "city" : a.city};
  *      createAddress(Map m) => new Address.create(m["number"], m["street"]);
- *      fillInAddress(Map m, Address a) => a.city = m["city"];
+ *      fillInAddress(Address a, Map m) => a.city = m["city"];
  *      var serialization = new Serialization()
  *        ..addRule(
  *            new ClosureRule(anAddress.runtimeType,
diff --git a/pkg/serialization/lib/src/serialization_rule.dart b/pkg/serialization/lib/src/serialization_rule.dart
index d9aed0f..49cd82a 100644
--- a/pkg/serialization/lib/src/serialization_rule.dart
+++ b/pkg/serialization/lib/src/serialization_rule.dart
@@ -446,9 +446,14 @@
   clear() => _throw();
   removeAt(x) => _throw();
   removeLast() => _throw();
+  remove(x) => _throw();
+  removeAll(x) => _throw();
+  retainAll(x) => _throw();
+  removeMatching(x) => _throw();
+  retainMatching(x) => _throw();
   getRange(x, y) => _throw();
   setRange(x, y, z, [a]) => _throw();
   removeRange(x, y) => _throw();
   insertRange(x, y, [z]) => _throw();
   void set length(x) => _throw();
-}
\ No newline at end of file
+}
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index daaa757..c0ca3de 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -453,8 +453,11 @@
   VerifyLoaded(library);
   library = LoadGenericSnapshotCreationScript(Builtin::kCryptoLibrary);
   VerifyLoaded(library);
+  // TODO(regis): Reenable this code for arm and mips when possible.
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
   library = LoadGenericSnapshotCreationScript(Builtin::kIOLibrary);
   VerifyLoaded(library);
+#endif
 }
 
 
diff --git a/runtime/dart-runtime.gyp b/runtime/dart-runtime.gyp
index 435847d..45f4967 100644
--- a/runtime/dart-runtime.gyp
+++ b/runtime/dart-runtime.gyp
@@ -7,7 +7,6 @@
     'tools/gyp/runtime-configurations.gypi',
     'vm/vm.gypi',
     'bin/bin.gypi',
-    'embedders/android/android_embedder.gypi',
     'third_party/double-conversion/src/double-conversion.gypi',
     'third_party/jscre/jscre.gypi',
     '../tools/gyp/source_filter.gypi',
@@ -15,7 +14,19 @@
   'variables': {
     'version_in_cc_file': 'vm/version_in.cc',
     'version_cc_file': '<(SHARED_INTERMEDIATE_DIR)/version.cc',
+
+    # Disable the OpenGLUI embedder by default on desktop OSes.  Note,
+    # to build this on the desktop, you need GLUT installed.
+    'enable_openglui%': 0,
   },
+  'conditions': [
+    ['OS=="android" or enable_openglui==1', {
+        'includes': [
+          'embedders/openglui/openglui_embedder.gypi',
+        ],
+      },
+    ],
+  ],
   'targets': [
     {
       'target_name': 'libdart',
diff --git a/runtime/embedders/android/android_embedder.gypi b/runtime/embedders/android/android_embedder.gypi
deleted file mode 100644
index 629155c..0000000
--- a/runtime/embedders/android/android_embedder.gypi
+++ /dev/null
@@ -1,75 +0,0 @@
-# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-{
-  'conditions': [
-    ['OS=="android"',
-      {
-        'targets': [
-          {
-            # Dart shared library for Android.
-            'target_name': 'android_embedder',
-            'type': 'shared_library',
-            'dependencies': [
-              'libdart_lib_withcore',
-              'libdart_vm',
-              'libjscre',
-              'libdouble_conversion',
-              'generate_version_cc_file',
-            ],
-            'include_dirs': [
-              '../..',
-              '../../../third_party/android_tools/ndk/sources/android/native_app_glue',
-            ],
-            'defines': [
-              'DART_SHARED_LIB'
-            ],
-            'sources': [
-              '../../include/dart_api.h',
-              '../../include/dart_debugger_api.h',
-              '../../vm/dart_api_impl.cc',
-              '../../vm/debugger_api_impl.cc',
-              '../../vm/version.h',
-              'activity_handler.h',
-              'android_extension.cc',
-              'android_extension.h',
-              'context.h',
-              'dart_host.cc',
-              'dart_host.h',
-              'eventloop.cc',
-              'eventloop.h',
-              'graphics.cc',
-              'graphics.h',
-              'input_handler.h',
-              'input_service.cc',
-              'input_service.h',
-              'log.h',
-              'main.cc',
-              'resource.h',
-              'sound_service.cc',
-              'sound_service.h',
-              'support_android.cc',
-              'timer.cc',
-              'timer.h',
-              'types.h',
-              'vm_glue.cc',
-              'vm_glue.h',
-              '<(version_cc_file)',
-            ],
-            'link_settings': {
-              'libraries': [ '-llog', '-lc', '-landroid', '-lEGL', '-lGLESv2', '-lOpenSLES' ],
-              'ldflags': [
-                '-z', 'muldefs'
-              ],
-              'ldflags!': [
-                '-Wl,--exclude-libs=ALL',
-              ],
-            },
-          },
-        ],
-      },
-    ]
-  ],
-}
-
diff --git a/runtime/embedders/android/context.h b/runtime/embedders/android/context.h
deleted file mode 100644
index 560828c..0000000
--- a/runtime/embedders/android/context.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef EMBEDDERS_ANDROID_CONTEXT_H_
-#define EMBEDDERS_ANDROID_CONTEXT_H_
-
-class Graphics;
-class InputHandler;
-class SoundService;
-class Timer;
-class VMGlue;
-
-struct Context {
-  Graphics* graphics;
-  InputHandler* input_handler;
-  SoundService* sound_service;
-  Timer* timer;
-  VMGlue* vm_glue;
-};
-
-#endif  // EMBEDDERS_ANDROID_CONTEXT_H_
diff --git a/runtime/embedders/android/eventloop.cc b/runtime/embedders/android/eventloop.cc
deleted file mode 100644
index a3cdbb5..0000000
--- a/runtime/embedders/android/eventloop.cc
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "embedders/android/eventloop.h"
-#include "embedders/android/log.h"
-
-EventLoop::EventLoop(android_app* application)
-    : enabled_(false),
-      quit_(false),
-      application_(application),
-      activity_handler_(NULL),
-      input_handler_(NULL) {
-  application_->onAppCmd = ActivityCallback;
-  application_->onInputEvent = InputCallback;
-  application_->userData = this;
-}
-
-void EventLoop::Run(ActivityHandler* activity_handler,
-                    Context* context) {
-  int32_t result;
-  int32_t events;
-  android_poll_source* source;
-
-  // TODO(vsm): We need to link in native_app_glue.
-  // app_dummy();
-  activity_handler_ = activity_handler;
-  input_handler_ = context->input_handler;
-  LOGI("Starting event loop");
-  while (true) {
-    // If not enabled, block on events. If enabled, don't block
-    // so we can do useful work in onStep.
-    while ((result = ALooper_pollAll(enabled_ ? 0 : -1,
-                                     NULL,
-                                     &events,
-                                     reinterpret_cast<void**>(&source))) >= 0) {
-      if (source != NULL) {
-        source->process(application_, source);
-      }
-      if (application_->destroyRequested) {
-        return;
-      }
-    }
-    if (enabled_ && !quit_) {
-      LOGI("step");
-      if (activity_handler_->OnStep() != 0) {
-        quit_ = true;
-        ANativeActivity_finish(application_->activity);
-      }
-    }
-  }
-}
-
-// Called when we gain focus.
-void EventLoop::Activate() {
-  LOGI("activate");
-  if (!enabled_ && application_->window != NULL) {
-    quit_ = false;
-    enabled_ = true;
-    if (activity_handler_->OnActivate() != 0) {
-      quit_ = true;
-      ANativeActivity_finish(application_->activity);
-    }
-  }
-}
-
-// Called when we lose focus.
-void EventLoop::Deactivate() {
-  LOGI("deactivate");
-  if (enabled_) {
-    activity_handler_->OnDeactivate();
-    enabled_ = false;
-  }
-}
-
-void EventLoop::ProcessActivityEvent(int32_t command) {
-  switch (command) {
-    case APP_CMD_CONFIG_CHANGED:
-      activity_handler_->OnConfigurationChanged();
-      break;
-    case APP_CMD_INIT_WINDOW:
-      activity_handler_->OnCreateWindow();
-      break;
-    case APP_CMD_DESTROY:
-      activity_handler_->OnDestroy();
-      break;
-    case APP_CMD_GAINED_FOCUS:
-      Activate();
-      activity_handler_->OnGainedFocus();
-      break;
-    case APP_CMD_LOST_FOCUS:
-      activity_handler_->OnLostFocus();
-      Deactivate();
-      break;
-    case APP_CMD_LOW_MEMORY:
-      activity_handler_->OnLowMemory();
-      break;
-    case APP_CMD_PAUSE:
-      activity_handler_->OnPause();
-      Deactivate();
-      break;
-    case APP_CMD_RESUME:
-      activity_handler_->OnResume();
-      break;
-    case APP_CMD_SAVE_STATE:
-      activity_handler_->OnSaveState(&application_->savedState,
-                                    &application_->savedStateSize);
-      break;
-    case APP_CMD_START:
-      activity_handler_->OnStart();
-      break;
-    case APP_CMD_STOP:
-      activity_handler_->OnStop();
-      break;
-    case APP_CMD_TERM_WINDOW:
-      activity_handler_->OnDestroyWindow();
-      Deactivate();
-      break;
-    default:
-      break;
-  }
-}
-
-int32_t EventLoop::ProcessInputEvent(AInputEvent* event) {
-  int32_t event_type = AInputEvent_getType(event);
-  LOGI("Got input event type %d", event_type);
-  switch (event_type) {
-    case AINPUT_EVENT_TYPE_MOTION:
-      if (AInputEvent_getSource(event) == AINPUT_SOURCE_TOUCHSCREEN) {
-          return input_handler_->OnTouchEvent(event);
-      }
-      break;
-    case AINPUT_EVENT_TYPE_KEY:
-      return input_handler_->OnKeyEvent(event);
-  }
-  return 0;
-}
-
-void EventLoop::ActivityCallback(android_app* application, int32_t command) {
-  EventLoop* event_loop = reinterpret_cast<EventLoop*>(application->userData);
-  event_loop->ProcessActivityEvent(command);
-}
-
-int32_t EventLoop::InputCallback(android_app* application,
-                                 AInputEvent* event) {
-  EventLoop* event_loop = reinterpret_cast<EventLoop*>(application->userData);
-  return event_loop->ProcessInputEvent(event);
-}
diff --git a/runtime/embedders/android/eventloop.h b/runtime/embedders/android/eventloop.h
deleted file mode 100644
index ffc52a7..0000000
--- a/runtime/embedders/android/eventloop.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef EMBEDDERS_ANDROID_EVENTLOOP_H_
-#define EMBEDDERS_ANDROID_EVENTLOOP_H_
-
-#include <android_native_app_glue.h>
-#include "embedders/android/activity_handler.h"
-#include "embedders/android/context.h"
-#include "embedders/android/input_handler.h"
-
-class EventLoop {
-  public:
-    explicit EventLoop(android_app* application);
-    void Run(ActivityHandler* activityHandler, Context* context);
-
-  protected:
-    void Activate();
-    void Deactivate();
-    void ProcessActivityEvent(int32_t command);
-    int32_t ProcessInputEvent(AInputEvent* event);
-
-    static void ActivityCallback(android_app* application, int32_t command);
-    static int32_t InputCallback(android_app* application, AInputEvent* event);
-
-  private:
-    bool enabled_;
-    bool quit_;
-    android_app* application_;
-    ActivityHandler* activity_handler_;
-    InputHandler* input_handler_;
-};
-
-#endif  // EMBEDDERS_ANDROID_EVENTLOOP_H_
diff --git a/runtime/embedders/android/graphics.cc b/runtime/embedders/android/graphics.cc
deleted file mode 100644
index 3d73c8b..0000000
--- a/runtime/embedders/android/graphics.cc
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "embedders/android/graphics.h"
-
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-#include "embedders/android/log.h"
-
-extern void CheckGLError(const char *function);
-
-Graphics::Graphics(android_app* application, Timer* timer)
-    : application_(application),
-      timer_(timer),
-      width_(0),
-      height_(0),
-      display_(EGL_NO_DISPLAY),
-      surface_(EGL_NO_SURFACE),
-      context_(EGL_NO_CONTEXT) {
-}
-
-const int32_t& Graphics::height() {
-  return height_;
-}
-
-const int32_t& Graphics::width() {
-  return width_;
-}
-
-int32_t Graphics::Start() {
-  EGLint format, numConfigs;
-  EGLConfig config;
-  const EGLint attributes[] = {
-      EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
-      EGL_NONE
-  };
-  static const EGLint ctx_attribs[] = {
-    EGL_CONTEXT_CLIENT_VERSION, 2,
-    EGL_NONE
-  };
-
-  display_ = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-  if (display_ != EGL_NO_DISPLAY) {
-    LOGI("eglInitialize");
-    if (eglInitialize(display_, NULL, NULL)) {
-      LOGI("eglChooseConfig");
-      if (eglChooseConfig(display_, attributes, &config, 1, &numConfigs) &&
-          numConfigs > 0) {
-        LOGI("eglGetConfigAttrib");
-        if (eglGetConfigAttrib(display_, config,
-                               EGL_NATIVE_VISUAL_ID, &format)) {
-          ANativeWindow_setBuffersGeometry(application_->window, 0, 0, format);
-          surface_ = eglCreateWindowSurface(display_, config,
-                              (EGLNativeWindowType)application_->window, NULL);
-          if (surface_ != EGL_NO_SURFACE) {
-            LOGI("eglCreateContext");
-            context_ = eglCreateContext(display_, config, EGL_NO_CONTEXT,
-                                        ctx_attribs);
-            if (context_ != EGL_NO_CONTEXT) {
-              if (eglMakeCurrent(display_, surface_, surface_, context_) &&
-                  eglQuerySurface(display_, surface_, EGL_WIDTH, &width_) &&
-                  width_ > 0 &&
-                  eglQuerySurface(display_, surface_, EGL_HEIGHT, &height_) &&
-                  height_ > 0) {
-                SetViewport(0, 0, width_, height_);
-                return 0;
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  LOGE("Error starting graphics");
-  Stop();
-  return -1;
-}
-
-void Graphics::Stop() {
-  LOGI("Stopping graphics");
-  if (display_ != EGL_NO_DISPLAY) {
-    eglMakeCurrent(display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
-    if (context_ != EGL_NO_CONTEXT) {
-      eglDestroyContext(display_, context_);
-      context_ = EGL_NO_CONTEXT;
-    }
-    if (surface_ != EGL_NO_SURFACE) {
-      eglDestroySurface(display_, surface_);
-      surface_ = EGL_NO_SURFACE;
-    }
-    eglTerminate(display_);
-    display_ = EGL_NO_DISPLAY;
-  }
-}
-
-int32_t Graphics::Update() {
-  return 0;
-}
-
-void Graphics::SwapBuffers() {
-  EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-  EGLSurface surface = eglGetCurrentSurface(EGL_DRAW);
-  eglSwapBuffers(display, surface);
-}
-
-void Graphics::SetViewport(int left, int top, int width, int height) {
-  glViewport(left, top, width, height);
-  CheckGLError("glViewPort");
-}
-
-int Graphics::BuildProgram(const char* vertexShaderSource,
-                                 const char* fragmentShaderSource) const {
-  int vertexShader = BuildShader(vertexShaderSource, GL_VERTEX_SHADER);
-  int fragmentShader = BuildShader(fragmentShaderSource, GL_FRAGMENT_SHADER);
-  if (vertexShader < 0 || fragmentShader < 0) {
-    return -1;
-  }
-
-  GLuint programHandle = glCreateProgram();
-  glAttachShader(programHandle, static_cast<GLuint>(vertexShader));
-  glAttachShader(programHandle, static_cast<GLuint>(fragmentShader));
-  glLinkProgram(programHandle);
-
-  GLint linkSuccess;
-  glGetProgramiv(programHandle, GL_LINK_STATUS, &linkSuccess);
-  if (linkSuccess == GL_FALSE) {
-    GLint infoLogLength;
-    glGetProgramiv(programHandle, GL_INFO_LOG_LENGTH, &infoLogLength);
-    GLchar* strInfoLog = new GLchar[infoLogLength + 1];
-    glGetProgramInfoLog(programHandle, infoLogLength, NULL, strInfoLog);
-    strInfoLog[infoLogLength] = 0;
-    LOGE("Link failed: %s", strInfoLog);
-    delete[] strInfoLog;
-    return -1;
-  }
-  return static_cast<int>(programHandle);
-}
-
-int Graphics::BuildShader(const char* source, GLenum shaderType) const {
-  GLuint shaderHandle = glCreateShader(shaderType);
-  glShaderSource(shaderHandle, 1, &source, NULL);
-  glCompileShader(shaderHandle);
-
-  GLint compileSuccess;
-  glGetShaderiv(shaderHandle, GL_COMPILE_STATUS, &compileSuccess);
-
-  if (compileSuccess == GL_FALSE) {
-    GLint infoLogLength = 0;
-    glGetShaderiv(shaderHandle, GL_INFO_LOG_LENGTH, &infoLogLength);
-    GLchar* strInfoLog = new GLchar[infoLogLength + 1];
-    glGetShaderInfoLog(shaderHandle, infoLogLength, NULL, strInfoLog);
-    strInfoLog[infoLogLength] = 0;
-    LOGE("Shader compile failed: %s", strInfoLog);
-    delete [] strInfoLog;
-    return -1;
-  }
-  return static_cast<int>(shaderHandle);
-}
-
diff --git a/runtime/embedders/android/graphics.h b/runtime/embedders/android/graphics.h
deleted file mode 100644
index 58e8922..0000000
--- a/runtime/embedders/android/graphics.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef EMBEDDERS_ANDROID_GRAPHICS_H_
-#define EMBEDDERS_ANDROID_GRAPHICS_H_
-
-#include <android_native_app_glue.h>
-#include <EGL/egl.h>
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-#include "embedders/android/timer.h"
-
-class Graphics {
-  public:
-    Graphics(android_app* application, Timer* timer);
-
-    const int32_t& height();
-    const int32_t& width();
-    int32_t Start();
-    void Stop();
-    void SwapBuffers();
-    int32_t Update();
-    void SetViewport(int left, int top, int width, int height);
-    int BuildProgram(const char* vertexShaderSource,
-                        const char* fragmentShaderSource) const;
-    int BuildShader(const char* source, GLenum shaderType) const;
-
-  private:
-    android_app* application_;
-    Timer* timer_;
-    int32_t width_, height_;
-    EGLDisplay display_;
-    EGLSurface surface_;
-    EGLContext context_;
-};
-
-#endif  // EMBEDDERS_ANDROID_GRAPHICS_H_
diff --git a/runtime/embedders/android/input_handler.h b/runtime/embedders/android/input_handler.h
deleted file mode 100644
index b3f80ae..0000000
--- a/runtime/embedders/android/input_handler.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef EMBEDDERS_ANDROID_INPUT_HANDLER_H_
-#define EMBEDDERS_ANDROID_INPUT_HANDLER_H_
-
-#include <android/input.h>
-
-class InputHandler {
-  public:
-    virtual int32_t Start() { return 0; }
-    virtual bool OnTouchEvent(AInputEvent* event) = 0;
-    virtual bool OnKeyEvent(AInputEvent* event) = 0;
-    virtual ~InputHandler() {}
-};
-
-#endif  // EMBEDDERS_ANDROID_INPUT_HANDLER_H_
diff --git a/runtime/embedders/android/input_service.cc b/runtime/embedders/android/input_service.cc
deleted file mode 100644
index 68410f1..0000000
--- a/runtime/embedders/android/input_service.cc
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include <android_native_app_glue.h>
-#include <cmath>
-
-#include "embedders/android/input_service.h"
-#include "embedders/android/log.h"
-
-InputService::InputService(android_app* application,
-                           VMGlue* vm_glue,
-                           const int32_t& width,
-                           const int32_t& height) :
-  application_(application),
-  vm_glue_(vm_glue),
-  width_(width),
-  height_(height) {
-}
-
-int32_t InputService::Start() {
-  if ((width_ == 0) || (height_ == 0)) {
-    return -1;
-  }
-  return 0;
-}
-
-bool InputService::OnTouchEvent(AInputEvent* event) {
-  int32_t type = AMotionEvent_getAction(event);
-  const char *function = NULL;
-  switch (type) {
-    case AMOTION_EVENT_ACTION_DOWN:
-      function = "onMotionDown";
-      break;
-    case AMOTION_EVENT_ACTION_UP:
-      function = "onMotionUp";
-      break;
-    case AMOTION_EVENT_ACTION_MOVE:
-      function = "onMotionMove";
-      break;
-    case AMOTION_EVENT_ACTION_CANCEL:
-      function = "onMotionCancel";
-      break;
-    case AMOTION_EVENT_ACTION_OUTSIDE:
-      function = "onMotionOutside";
-      break;
-    case AMOTION_EVENT_ACTION_POINTER_DOWN:
-      function = "onMotionPointerDown";
-      break;
-    case AMOTION_EVENT_ACTION_POINTER_UP:
-      function = "onMotionPointerUp";
-      break;
-    default:
-      break;
-  }
-  if (function != NULL) {
-    // For now we just get the last coords.
-    float move_x = AMotionEvent_getX(event, 0);
-    float move_y = AMotionEvent_getY(event, 0);
-    int64_t when = AMotionEvent_getEventTime(event);
-    LOGI("Got motion event %d at %f, %f", type, move_x, move_y);
-
-    if (vm_glue_->OnMotionEvent(function, when, move_x, move_y) != 0) {
-      return false;
-    }
-  } else {
-    return false;
-  }
-  return true;
-}
-
-bool InputService::OnKeyEvent(AInputEvent* event) {
-  int32_t type = AKeyEvent_getAction(event);
-  const char *function = NULL;
-  switch (type) {
-    case AKEY_EVENT_ACTION_DOWN:
-      function = "onKeyDown";
-      break;
-    case AKEY_EVENT_ACTION_UP:
-      function = "onKeyUp";
-      break;
-    case AKEY_EVENT_ACTION_MULTIPLE:
-      function = "onKeyMultiple";
-      break;
-  }
-  if (function != NULL) {
-    int32_t flags = AKeyEvent_getFlags(event);
-    /* Get the key code of the key event.
-     * This is the physical key that was pressed, not the Unicode character. */
-    int32_t key_code = AKeyEvent_getKeyCode(event);
-    /* Get the meta key state. */
-    int32_t meta_state = AKeyEvent_getMetaState(event);
-    /* Get the repeat count of the event.
-     * For both key up an key down events, this is the number of times the key
-     * has repeated with the first down starting at 0 and counting up from
-     * there.  For multiple key events, this is the number of down/up pairs
-     * that have occurred. */
-    int32_t repeat = AKeyEvent_getRepeatCount(event);
-
-    /* Get the time of the most recent key down event, in the	
-     * java.lang.System.nanoTime() time base.  If this is a down event,	
-     * this will be the same as eventTime.	
-     * Note that when chording keys, this value is the down time of the most	
-     * recently pressed key, which may not be the same physical key of this	
-     * event. */	
-    // TODO(gram): Use or remove this.
-    // int64_t key_down_time = AKeyEvent_getDownTime(event);
-
-    /* Get the time this event occurred, in the
-     * java.lang.System.nanoTime() time base. */
-    int64_t when = AKeyEvent_getEventTime(event);
-
-    LOGI("Got key event %d %d", type, key_code);
-    if (vm_glue_->OnKeyEvent(function, when, flags, key_code,
-                             meta_state, repeat) != 0) {
-      return false;
-    }
-  } else {
-    return false;
-  }
-  return true;
-}
diff --git a/runtime/embedders/android/input_service.h b/runtime/embedders/android/input_service.h
deleted file mode 100644
index a327db8..0000000
--- a/runtime/embedders/android/input_service.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef EMBEDDERS_ANDROID_INPUT_SERVICE_H_
-#define EMBEDDERS_ANDROID_INPUT_SERVICE_H_
-
-#include <android_native_app_glue.h>
-#include "embedders/android/input_handler.h"
-#include "embedders/android/types.h"
-#include "embedders/android/vm_glue.h"
-
-class InputService : public InputHandler {
-  public:
-    InputService(android_app* application,
-                 VMGlue* vm_glue,
-                 const int32_t& width,
-                 const int32_t& height);
-
-  public:
-    int32_t Start();
-    bool OnTouchEvent(AInputEvent* event);
-    bool OnKeyEvent(AInputEvent* event);
-
-  private:
-    android_app* application_;
-    VMGlue* vm_glue_;
-    const int32_t& width_, &height_;
-};
-
-#endif  // EMBEDDERS_ANDROID_INPUT_SERVICE_H_
diff --git a/runtime/embedders/android/main.cc b/runtime/embedders/android/main.cc
deleted file mode 100644
index a0bca2b..0000000
--- a/runtime/embedders/android/main.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "embedders/android/context.h"
-#include "embedders/android/dart_host.h"
-#include "embedders/android/eventloop.h"
-#include "embedders/android/graphics.h"
-#include "embedders/android/input_service.h"
-#include "embedders/android/vm_glue.h"
-
-SoundService* psound_service;
-
-void android_main(android_app* application) {
-  Timer timer;
-  Graphics graphics(application, &timer);
-  VMGlue vm_glue(&graphics);
-  InputService input_handler(application, &vm_glue,
-      graphics.width(), graphics.height());
-  SoundService sound_service(application);
-  Context app_context;
-  app_context.graphics = &graphics;
-  app_context.input_handler = &input_handler;
-  app_context.sound_service = &sound_service;
-  app_context.timer = &timer;
-  app_context.vm_glue = &vm_glue;
-  EventLoop eventLoop(application);
-  DartHost host(&app_context);
-  eventLoop.Run(&host, &app_context);
-}
-
-int32_t PlayBackgroundSound(const char* path) {
-  return psound_service->PlayBackground(path);
-}
-
-void StopBackgroundSound() {
-  psound_service->StopBackground();
-}
-
-int32_t LoadSoundSample(const char* path) {
-  return psound_service->LoadSample(path);
-}
-
-int32_t PlaySoundSample(const char* path) {
-  return psound_service->PlaySample(path);
-}
diff --git a/runtime/embedders/android/timer.cc b/runtime/embedders/android/timer.cc
deleted file mode 100644
index ccfd18b..0000000
--- a/runtime/embedders/android/timer.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "embedders/android/timer.h"
-
-Timer::Timer() : elapsed_(0.0f), last_time_(0.0) {
-}
-
-void Timer::reset() {
-  elapsed_ = 0.0f;
-  last_time_ = now();
-}
-
-void Timer::update() {
-  double current = now();
-  elapsed_ = (current - last_time_);
-  last_time_ = current;
-}
-
-double Timer::now() {
-  timespec timeval;
-  clock_gettime(CLOCK_MONOTONIC, &timeval);
-  return timeval.tv_sec + (timeval.tv_nsec * 1.0e-9);
-}
-
-float Timer::elapsed() {
-  return elapsed_;
-}
diff --git a/runtime/embedders/openglui/android/android_graphics_handler.cc b/runtime/embedders/openglui/android/android_graphics_handler.cc
new file mode 100644
index 0000000..3c694a7
--- /dev/null
+++ b/runtime/embedders/openglui/android/android_graphics_handler.cc
@@ -0,0 +1,81 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "embedders/openglui/android/android_graphics_handler.h"
+#include "embedders/openglui/common/log.h"
+
+AndroidGraphicsHandler::AndroidGraphicsHandler(android_app* application)
+    : GLGraphicsHandler(),
+      application_(application),
+      display_(EGL_NO_DISPLAY),
+      surface_(EGL_NO_SURFACE),
+      context_(EGL_NO_CONTEXT) {
+}
+
+int32_t AndroidGraphicsHandler::Start() {
+  EGLint format, numConfigs;
+  EGLConfig config;
+  const EGLint attributes[] = {
+      EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
+      EGL_NONE
+  };
+  static const EGLint ctx_attribs[] = {
+    EGL_CONTEXT_CLIENT_VERSION, 2,
+    EGL_NONE
+  };
+
+  display_ = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+  if (display_ != EGL_NO_DISPLAY) {
+    LOGI("eglInitialize");
+    if (eglInitialize(display_, NULL, NULL)) {
+      LOGI("eglChooseConfig");
+      if (eglChooseConfig(display_, attributes, &config, 1, &numConfigs) &&
+          numConfigs > 0) {
+        LOGI("eglGetConfigAttrib");
+        if (eglGetConfigAttrib(display_, config,
+                               EGL_NATIVE_VISUAL_ID, &format)) {
+          ANativeWindow_setBuffersGeometry(application_->window, 0, 0, format);
+          surface_ = eglCreateWindowSurface(display_, config,
+                              (EGLNativeWindowType)application_->window, NULL);
+          if (surface_ != EGL_NO_SURFACE) {
+            LOGI("eglCreateContext");
+            context_ = eglCreateContext(display_, config, EGL_NO_CONTEXT,
+                                        ctx_attribs);
+            if (context_ != EGL_NO_CONTEXT) {
+              if (eglMakeCurrent(display_, surface_, surface_, context_) &&
+                  eglQuerySurface(display_, surface_, EGL_WIDTH, &width_) &&
+                  width_ > 0 &&
+                  eglQuerySurface(display_, surface_, EGL_HEIGHT, &height_) &&
+                  height_ > 0) {
+                SetViewport(0, 0, width_, height_);
+                return 0;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  LOGE("Error starting graphics");
+  Stop();
+  return -1;
+}
+
+void AndroidGraphicsHandler::Stop() {
+  LOGI("Stopping graphics");
+  if (display_ != EGL_NO_DISPLAY) {
+    eglMakeCurrent(display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+    if (context_ != EGL_NO_CONTEXT) {
+      eglDestroyContext(display_, context_);
+      context_ = EGL_NO_CONTEXT;
+    }
+    if (surface_ != EGL_NO_SURFACE) {
+      eglDestroySurface(display_, surface_);
+      surface_ = EGL_NO_SURFACE;
+    }
+    eglTerminate(display_);
+    display_ = EGL_NO_DISPLAY;
+  }
+}
+
diff --git a/runtime/embedders/openglui/android/android_graphics_handler.h b/runtime/embedders/openglui/android/android_graphics_handler.h
new file mode 100644
index 0000000..9684688
--- /dev/null
+++ b/runtime/embedders/openglui/android/android_graphics_handler.h
@@ -0,0 +1,26 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef EMBEDDERS_OPENGLUI_ANDROID_ANDROID_GRAPHICS_HANDLER_H_
+#define EMBEDDERS_OPENGLUI_ANDROID_ANDROID_GRAPHICS_HANDLER_H_
+
+#include <android_native_app_glue.h>
+#include "embedders/openglui/common/gl_graphics_handler.h"
+
+class AndroidGraphicsHandler : public GLGraphicsHandler {
+  public:
+    explicit AndroidGraphicsHandler(android_app* application);
+
+    int32_t Start();
+    void Stop();
+
+  private:
+    android_app* application_;
+    EGLDisplay display_;
+    EGLSurface surface_;
+    EGLContext context_;
+};
+
+#endif  // EMBEDDERS_OPENGLUI_ANDROID_ANDROID_GRAPHICS_HANDLER_H_
+
diff --git a/runtime/embedders/openglui/android/android_input_handler.h b/runtime/embedders/openglui/android/android_input_handler.h
new file mode 100644
index 0000000..b39510a
--- /dev/null
+++ b/runtime/embedders/openglui/android/android_input_handler.h
@@ -0,0 +1,33 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef EMBEDDERS_OPENGLUI_ANDROID_ANDROID_INPUT_HANDLER_H_
+#define EMBEDDERS_OPENGLUI_ANDROID_ANDROID_INPUT_HANDLER_H_
+
+#include "embedders/openglui/common/graphics_handler.h"
+#include "embedders/openglui/common/input_handler.h"
+
+class AndroidInputHandler : public InputHandler {
+  public:
+    AndroidInputHandler(VMGlue* vm_glue,
+                        GraphicsHandler* graphics_handler)
+      : InputHandler(vm_glue),
+        graphics_handler_(graphics_handler) {
+    }
+
+  public:
+    int32_t Start() {
+      if (graphics_handler_->width() == 0 ||
+          graphics_handler_->height() == 0) {
+        return -1;
+      }
+      return 0;
+    }
+
+  private:
+    GraphicsHandler* graphics_handler_;
+};
+
+#endif  // EMBEDDERS_OPENGLUI_ANDROID_ANDROID_INPUT_HANDLER_H_
+
diff --git a/runtime/embedders/android/log.h b/runtime/embedders/openglui/android/android_log.h
similarity index 74%
rename from runtime/embedders/android/log.h
rename to runtime/embedders/openglui/android/android_log.h
index 5ca638f..ff82d0b 100644
--- a/runtime/embedders/android/log.h
+++ b/runtime/embedders/openglui/android/android_log.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef EMBEDDERS_ANDROID_LOG_H_
-#define EMBEDDERS_ANDROID_LOG_H_
+#ifndef EMBEDDERS_OPENGLUI_ANDROID_ANDROID_LOG_H_
+#define EMBEDDERS_OPENGLUI_ANDROID_ANDROID_LOG_H_
 
 #include <android/log.h>
 
@@ -13,4 +13,5 @@
 #define LOGI(...) LOGX(ANDROID_LOG_INFO, __VA_ARGS__)
 #define LOGE(...) LOGX(ANDROID_LOG_ERROR, __VA_ARGS__)
 
-#endif  // EMBEDDERS_ANDROID_LOG_H_
+#endif  // EMBEDDERS_OPENGLUI_ANDROID_ANDROID_LOG_H_
+
diff --git a/runtime/embedders/android/resource.h b/runtime/embedders/openglui/android/android_resource.h
similarity index 69%
rename from runtime/embedders/android/resource.h
rename to runtime/embedders/openglui/android/android_resource.h
index 87c1b48..85e0614 100644
--- a/runtime/embedders/android/resource.h
+++ b/runtime/embedders/openglui/android/android_resource.h
@@ -2,26 +2,20 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef EMBEDDERS_ANDROID_RESOURCE_H_
-#define EMBEDDERS_ANDROID_RESOURCE_H_
+#ifndef EMBEDDERS_OPENGLUI_ANDROID_ANDROID_RESOURCE_H_
+#define EMBEDDERS_OPENGLUI_ANDROID_ANDROID_RESOURCE_H_
 
 #include <android_native_app_glue.h>
 
-#include "embedders/android/log.h"
+#include "embedders/openglui/common/log.h"
+#include "embedders/openglui/common/resource.h"
 
-class Resource {
+class AndroidResource : public Resource {
   public:
-    Resource(android_app* application, const char* path)
-        :  asset_manager_(application->activity->assetManager),
-           path_(path),
-           asset_(NULL),
-           descriptor_(-1),
-           start_(0),
-           length_(-1) {
-    }
-
-    const char* path() {
-      return path_;
+    AndroidResource(android_app* application, const char* path)
+        : Resource(path),
+          asset_manager_(application->activity->assetManager),
+          asset_(NULL) {
     }
 
     int32_t descriptor() {
@@ -35,10 +29,6 @@
       return -1;
     }
 
-    off_t start() {
-      return start_;
-    }
-
     off_t length() {
       if (length_ < 0) {
         length_ = AAsset_getLength(asset_);
@@ -70,11 +60,8 @@
 
   private:
     AAssetManager* asset_manager_;
-    const char* path_;
     AAsset* asset_;
-    int32_t descriptor_;
-    off_t start_;
-    off_t length_;
 };
 
-#endif  // EMBEDDERS_ANDROID_RESOURCE_H_
+#endif  // EMBEDDERS_OPENGLUI_ANDROID_ANDROID_RESOURCE_H_
+
diff --git a/runtime/embedders/android/sound_service.cc b/runtime/embedders/openglui/android/android_sound_handler.cc
similarity index 86%
rename from runtime/embedders/android/sound_service.cc
rename to runtime/embedders/openglui/android/android_sound_handler.cc
index 484397e..6e97833 100644
--- a/runtime/embedders/android/sound_service.cc
+++ b/runtime/embedders/openglui/android/android_sound_handler.cc
@@ -2,13 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "embedders/android/sound_service.h"
+#include "embedders/openglui/android/android_sound_handler.h"
 
-#include "embedders/android/log.h"
-#include "embedders/android/resource.h"
+#include "embedders/openglui/android/android_resource.h"
+#include "embedders/openglui/common/log.h"
 
-SoundService::SoundService(android_app* application)
-    : application_(application),
+AndroidSoundHandler::AndroidSoundHandler(android_app* application)
+    : SoundHandler(),
+      application_(application),
       engine_(NULL),
       engine_if_(NULL),
       output_mix_(NULL),
@@ -17,11 +18,11 @@
       background_player_seek_if_(NULL),
       sample_player_(NULL),
       sample_player_if_(NULL),
-      sample_player_queue_(NULL),
-      samples_() {
+      sample_player_queue_(NULL) {
+  SoundHandler::instance_ = this;
 }
 
-int32_t SoundService::Start() {
+int32_t AndroidSoundHandler::Start() {
   LOGI("Starting SoundService");
 
   const SLInterfaceID k_engine_mix_IIDs[] = { SL_IID_ENGINE };
@@ -53,7 +54,7 @@
   return -1;
 }
 
-void SoundService::Stop() {
+void AndroidSoundHandler::Stop() {
   StopBackground();
   if (output_mix_ != NULL) {
     (*output_mix_)->Destroy(output_mix_);
@@ -73,7 +74,7 @@
   samples_.clear();
 }
 
-int32_t SoundService::CreateAudioPlayer(SLEngineItf engine_if,
+int32_t AndroidSoundHandler::CreateAudioPlayer(SLEngineItf engine_if,
                                         const SLInterfaceID extra_if,
                                         SLDataSource data_source,
                                         SLDataSink data_sink,
@@ -104,10 +105,10 @@
   return -1;
 }
 
-int32_t SoundService::PlayBackground(const char* path) {
+int32_t AndroidSoundHandler::PlayBackground(const char* path) {
   LOGI("Creating audio player");
 
-  Resource resource(application_, path);
+  Resource resource(path);
   int fd = resource.descriptor();
   if (fd < 0) {
     LOGI("Could not open file %s", path);
@@ -169,7 +170,7 @@
   return 0;
 }
 
-void SoundService::StopBackground() {
+void AndroidSoundHandler::StopBackground() {
   if (background_player_if_ != NULL) {
     SLuint32 state;
     (*background_player_)->GetState(background_player_, &state);
@@ -185,7 +186,7 @@
   }
 }
 
-int32_t SoundService::StartSamplePlayer() {
+int32_t AndroidSoundHandler::StartSamplePlayer() {
   SLDataLocator_AndroidSimpleBufferQueue data_locator_in = {
     SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE,
     1
@@ -228,26 +229,7 @@
   return -1;
 }
 
-Sample* SoundService::GetSample(const char* path) {
-  for (samples_t::iterator sp = samples_.begin();
-       sp != samples_.end();
-       ++sp) {
-    Sample* sample = (*sp);
-    if (strcmp(sample->path(), path) == 0) {
-      return sample;
-    }
-  }
-  Sample* sample = new Sample(application_, path);
-  if (sample->Load() != 0) {
-    LOGI("Failed to load sample %s", path);
-    delete sample;
-    return NULL;
-  }
-  samples_.push_back(sample);
-  return sample;
-}
-
-int32_t SoundService::PlaySample(const char* path) {
+int32_t AndroidSoundHandler::PlaySample(const char* path) {
   SLuint32 state;
   (*sample_player_)->GetState(sample_player_, &state);
   if (state != SL_OBJECT_STATE_REALIZED) {
@@ -255,8 +237,8 @@
   } else {
     Sample* sample = GetSample(path);
     if (sample != NULL) {
-      int16_t* buffer = reinterpret_cast<int16_t*>(sample->buffer_);
-      off_t len = sample->length_;
+      int16_t* buffer = reinterpret_cast<int16_t*>(sample->buffer());
+      off_t len = sample->length();
 
       // Remove any current sample.
       int32_t res = (*sample_player_queue_)->Clear(sample_player_queue_);
diff --git a/runtime/embedders/android/sound_service.h b/runtime/embedders/openglui/android/android_sound_handler.h
similarity index 67%
rename from runtime/embedders/android/sound_service.h
rename to runtime/embedders/openglui/android/android_sound_handler.h
index 210fc68..027d644 100644
--- a/runtime/embedders/android/sound_service.h
+++ b/runtime/embedders/openglui/android/android_sound_handler.h
@@ -2,36 +2,31 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef EMBEDDERS_ANDROID_SOUND_SERVICE_H_
-#define EMBEDDERS_ANDROID_SOUND_SERVICE_H_
+#ifndef EMBEDDERS_OPENGLUI_ANDROID_ANDROID_SOUND_HANDLER_H_
+#define EMBEDDERS_OPENGLUI_ANDROID_ANDROID_SOUND_HANDLER_H_
 
 #include <android_native_app_glue.h>
 #include <SLES/OpenSLES.h>
 #include <SLES/OpenSLES_Android.h>
 #include <SLES/OpenSLES_AndroidConfiguration.h>
 #include <vector>
-#include "embedders/android/sample.h"
-#include "embedders/android/types.h"
 
-class SoundService {
+#include "embedders/openglui/common/sample.h"
+#include "embedders/openglui/common/sound_handler.h"
+#include "embedders/openglui/common/types.h"
+
+class AndroidSoundHandler : public SoundHandler {
   public:
-    explicit SoundService(android_app* application);
+    explicit AndroidSoundHandler(android_app* application);
     int32_t Start();
     void Stop();
 
     int32_t PlayBackground(const char* path);
     void StopBackground();
 
-    // Optional, for preloading.
-    int32_t LoadSample(const char* path) {
-       return (GetSample(path) == NULL) ? -1 : 0;
-    }
-
     int32_t PlaySample(const char* path);
 
   private:
-    typedef std::vector<Sample*> samples_t;
-
     int32_t CreateAudioPlayer(SLEngineItf engine_if,
                               const SLInterfaceID extra_if,
                               SLDataSource data_source,
@@ -40,7 +35,6 @@
                               SLPlayItf& player_if_out);
 
     int32_t StartSamplePlayer();
-    Sample* GetSample(const char* path);
 
     android_app* application_;
     SLObjectItf engine_;
@@ -52,9 +46,7 @@
     SLObjectItf sample_player_;
     SLPlayItf sample_player_if_;
     SLBufferQueueItf sample_player_queue_;
-    samples_t samples_;
 };
 
-int32_t PlayBackgroundSound(const char* path);
-void StopBackgroundSound();
-#endif  // EMBEDDERS_ANDROID_SOUND_SERVICE_H_
+#endif  // EMBEDDERS_OPENGLUI_ANDROID_ANDROID_SOUND_HANDLER_H_
+
diff --git a/runtime/embedders/openglui/android/eventloop.cc b/runtime/embedders/openglui/android/eventloop.cc
new file mode 100644
index 0000000..db92107
--- /dev/null
+++ b/runtime/embedders/openglui/android/eventloop.cc
@@ -0,0 +1,238 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "embedders/openglui/android/eventloop.h"
+
+#include "embedders/openglui/common/log.h"
+
+EventLoop::EventLoop(android_app* application)
+    : enabled_(false),
+      quit_(false),
+      application_(application),
+      lifecycle_handler_(NULL),
+      input_handler_(NULL) {
+  application_->onAppCmd = ActivityCallback;
+  application_->onInputEvent = InputCallback;
+  application_->userData = this;
+}
+
+void EventLoop::Run(LifeCycleHandler* lifecycle_handler,
+                    InputHandler* input_handler) {
+  int32_t result;
+  int32_t events;
+  android_poll_source* source;
+
+  lifecycle_handler_ = lifecycle_handler;
+  input_handler_ = input_handler;
+  LOGI("Starting event loop");
+  while (true) {
+    // If not enabled, block on events. If enabled, don't block
+    // so we can do useful work in onStep.
+    while ((result = ALooper_pollAll(enabled_ ? 0 : -1,
+                                     NULL,
+                                     &events,
+                                     reinterpret_cast<void**>(&source))) >= 0) {
+      if (source != NULL) {
+        source->process(application_, source);
+      }
+      if (application_->destroyRequested) {
+        return;
+      }
+    }
+    if (enabled_ && !quit_) {
+      LOGI("step");
+      if (lifecycle_handler_->OnStep() != 0) {
+        quit_ = true;
+        ANativeActivity_finish(application_->activity);
+      }
+    }
+  }
+}
+
+// Called when we gain focus.
+void EventLoop::Activate() {
+  LOGI("activate");
+  if (!enabled_ && application_->window != NULL) {
+    quit_ = false;
+    enabled_ = true;
+    if (lifecycle_handler_->OnActivate() != 0) {
+      quit_ = true;
+      ANativeActivity_finish(application_->activity);
+    }
+  }
+}
+
+// Called when we lose focus.
+void EventLoop::Deactivate() {
+  LOGI("deactivate");
+  if (enabled_) {
+    lifecycle_handler_->OnDeactivate();
+    enabled_ = false;
+  }
+}
+
+void EventLoop::ProcessActivityEvent(int32_t command) {
+  switch (command) {
+    case APP_CMD_CONFIG_CHANGED:
+      lifecycle_handler_->OnConfigurationChanged();
+      break;
+    case APP_CMD_INIT_WINDOW:
+      lifecycle_handler_->OnCreateWindow();
+      break;
+    case APP_CMD_DESTROY:
+      lifecycle_handler_->OnDestroy();
+      break;
+    case APP_CMD_GAINED_FOCUS:
+      Activate();
+      lifecycle_handler_->OnGainedFocus();
+      break;
+    case APP_CMD_LOST_FOCUS:
+      lifecycle_handler_->OnLostFocus();
+      Deactivate();
+      break;
+    case APP_CMD_LOW_MEMORY:
+      lifecycle_handler_->OnLowMemory();
+      break;
+    case APP_CMD_PAUSE:
+      lifecycle_handler_->OnPause();
+      Deactivate();
+      break;
+    case APP_CMD_RESUME:
+      lifecycle_handler_->OnResume();
+      break;
+    case APP_CMD_SAVE_STATE:
+      lifecycle_handler_->OnSaveState(&application_->savedState,
+                                    &application_->savedStateSize);
+      break;
+    case APP_CMD_START:
+      lifecycle_handler_->OnStart();
+      break;
+    case APP_CMD_STOP:
+      lifecycle_handler_->OnStop();
+      break;
+    case APP_CMD_TERM_WINDOW:
+      lifecycle_handler_->OnDestroyWindow();
+      Deactivate();
+      break;
+    default:
+      break;
+  }
+}
+
+bool EventLoop::OnTouchEvent(AInputEvent* event) {
+  int32_t type = AMotionEvent_getAction(event);
+  MotionEvent motion_event;
+  switch (type) {
+    case AMOTION_EVENT_ACTION_DOWN:
+      motion_event = kMotionDown;
+      break;
+    case AMOTION_EVENT_ACTION_UP:
+      motion_event = kMotionUp;
+      break;
+    case AMOTION_EVENT_ACTION_MOVE:
+      motion_event = kMotionMove;
+      break;
+    case AMOTION_EVENT_ACTION_CANCEL:
+      motion_event = kMotionCancel;
+      break;
+    case AMOTION_EVENT_ACTION_OUTSIDE:
+      motion_event = kMotionOutside;
+      break;
+    case AMOTION_EVENT_ACTION_POINTER_DOWN:
+      motion_event = kMotionPointerDown;
+      break;
+    case AMOTION_EVENT_ACTION_POINTER_UP:
+      motion_event = kMotionPointerUp;
+      break;
+    default:
+      return false;
+  }
+  // For now we just get the last coords.
+  float move_x = AMotionEvent_getX(event, 0);
+  float move_y = AMotionEvent_getY(event, 0);
+  int64_t when = AMotionEvent_getEventTime(event);
+  LOGI("Got motion event %d at %f, %f", type, move_x, move_y);
+
+  if (input_handler_->OnMotionEvent(motion_event, when, move_x, move_y) != 0) {
+    return false;
+  }
+  return true;
+}
+
+bool EventLoop::OnKeyEvent(AInputEvent* event) {
+  int32_t type = AKeyEvent_getAction(event);
+  KeyEvent key_event;
+  switch (type) {
+    case AKEY_EVENT_ACTION_DOWN:
+      key_event = kKeyDown;
+      break;
+    case AKEY_EVENT_ACTION_UP:
+      key_event = kKeyUp;
+      break;
+    case AKEY_EVENT_ACTION_MULTIPLE:
+      key_event = kKeyMultiple;
+      break;
+    default:
+      return false;
+  }
+  int32_t flags = AKeyEvent_getFlags(event);
+  /* Get the key code of the key event.
+   * This is the physical key that was pressed, not the Unicode character. */
+  int32_t key_code = AKeyEvent_getKeyCode(event);
+  /* Get the meta key state. */
+  int32_t meta_state = AKeyEvent_getMetaState(event);
+  /* Get the repeat count of the event.
+   * For both key up an key down events, this is the number of times the key
+   * has repeated with the first down starting at 0 and counting up from
+   * there.  For multiple key events, this is the number of down/up pairs
+   * that have occurred. */
+  int32_t repeat = AKeyEvent_getRepeatCount(event);
+
+  /* Get the time of the most recent key down event, in the	
+   * java.lang.System.nanoTime() time base.  If this is a down event,	
+   * this will be the same as eventTime.	
+   * Note that when chording keys, this value is the down time of the most	
+   * recently pressed key, which may not be the same physical key of this	
+   * event. */	
+  // TODO(gram): Use or remove this.
+  // int64_t key_down_time = AKeyEvent_getDownTime(event);
+
+  /* Get the time this event occurred, in the
+   * java.lang.System.nanoTime() time base. */
+  int64_t when = AKeyEvent_getEventTime(event);
+
+  LOGI("Got key event %d %d", type, key_code);
+  if (input_handler_->OnKeyEvent(key_event, when, flags, key_code,
+                             meta_state, repeat) != 0) {
+    return false;
+  }
+  return true;
+}
+
+int32_t EventLoop::ProcessInputEvent(AInputEvent* event) {
+  int32_t event_type = AInputEvent_getType(event);
+  LOGI("Got input event type %d", event_type);
+  switch (event_type) {
+    case AINPUT_EVENT_TYPE_MOTION:
+      if (AInputEvent_getSource(event) == AINPUT_SOURCE_TOUCHSCREEN) {
+          return OnTouchEvent(event);
+      }
+      break;
+    case AINPUT_EVENT_TYPE_KEY:
+      return OnKeyEvent(event);
+  }
+  return 0;
+}
+
+void EventLoop::ActivityCallback(android_app* application, int32_t command) {
+  EventLoop* event_loop = reinterpret_cast<EventLoop*>(application->userData);
+  event_loop->ProcessActivityEvent(command);
+}
+
+int32_t EventLoop::InputCallback(android_app* application,
+                                 AInputEvent* event) {
+  EventLoop* event_loop = reinterpret_cast<EventLoop*>(application->userData);
+  return event_loop->ProcessInputEvent(event);
+}
+
diff --git a/runtime/embedders/openglui/android/eventloop.h b/runtime/embedders/openglui/android/eventloop.h
new file mode 100644
index 0000000..23b16db
--- /dev/null
+++ b/runtime/embedders/openglui/android/eventloop.h
@@ -0,0 +1,39 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef EMBEDDERS_OPENGLUI_ANDROID_EVENTLOOP_H_
+#define EMBEDDERS_OPENGLUI_ANDROID_EVENTLOOP_H_
+
+#include <android_native_app_glue.h>
+#include "embedders/openglui/common/events.h"
+#include "embedders/openglui/common/input_handler.h"
+#include "embedders/openglui/common/lifecycle_handler.h"
+
+class EventLoop {
+  public:
+    explicit EventLoop(android_app* application);
+    void Run(LifeCycleHandler* activity_handler,
+             InputHandler* input_handler);
+
+  protected:
+    void Activate();
+    void Deactivate();
+    void ProcessActivityEvent(int32_t command);
+    int32_t ProcessInputEvent(AInputEvent* event);
+    bool OnTouchEvent(AInputEvent* event);
+    bool OnKeyEvent(AInputEvent* event);
+
+    static void ActivityCallback(android_app* application, int32_t command);
+    static int32_t InputCallback(android_app* application, AInputEvent* event);
+
+  private:
+    bool enabled_;
+    bool quit_;
+    android_app* application_;
+    LifeCycleHandler* lifecycle_handler_;
+    InputHandler* input_handler_;
+};
+
+#endif  // EMBEDDERS_OPENGLUI_ANDROID_EVENTLOOP_H_
+
diff --git a/runtime/embedders/openglui/android/main.cc b/runtime/embedders/openglui/android/main.cc
new file mode 100644
index 0000000..4cd8790
--- /dev/null
+++ b/runtime/embedders/openglui/android/main.cc
@@ -0,0 +1,30 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "embedders/openglui/android/android_graphics_handler.h"
+#include "embedders/openglui/android/android_input_handler.h"
+#include "embedders/openglui/android/android_sound_handler.h"
+#include "embedders/openglui/android/eventloop.h"
+#include "embedders/openglui/common/context.h"
+#include "embedders/openglui/common/dart_host.h"
+#include "embedders/openglui/common/vm_glue.h"
+
+void android_main(android_app* application) {
+  app_dummy();  // Link in native_app_glue.
+  AndroidGraphicsHandler graphics_handler(application);
+  VMGlue vm_glue(&graphics_handler, "/data/data/com.google.dartndk/app_dart");
+  AndroidInputHandler input_handler(&vm_glue, &graphics_handler);
+  AndroidSoundHandler sound_handler(application);
+  Timer timer;
+  Context app_context;
+  app_context.graphics_handler = &graphics_handler;
+  app_context.input_handler = &input_handler;
+  app_context.sound_handler = &sound_handler;
+  app_context.timer = &timer;
+  app_context.vm_glue = &vm_glue;
+  EventLoop eventLoop(application);
+  DartHost host(&app_context);
+  eventLoop.Run(&host, &input_handler);
+}
+
diff --git a/runtime/embedders/android/support_android.cc b/runtime/embedders/openglui/android/support_android.cc
similarity index 100%
rename from runtime/embedders/android/support_android.cc
rename to runtime/embedders/openglui/android/support_android.cc
diff --git a/runtime/embedders/openglui/common/context.h b/runtime/embedders/openglui/common/context.h
new file mode 100644
index 0000000..54148fc
--- /dev/null
+++ b/runtime/embedders/openglui/common/context.h
@@ -0,0 +1,23 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef EMBEDDERS_OPENGLUI_COMMON_CONTEXT_H_
+#define EMBEDDERS_OPENGLUI_COMMON_CONTEXT_H_
+
+#include "embedders/openglui/common/graphics_handler.h"
+#include "embedders/openglui/common/input_handler.h"
+#include "embedders/openglui/common/sound_handler.h"
+#include "embedders/openglui/common/timer.h"
+#include "embedders/openglui/common/vm_glue.h"
+
+struct Context {
+  GraphicsHandler* graphics_handler;
+  InputHandler* input_handler;
+  SoundHandler* sound_handler;
+  Timer* timer;
+  VMGlue* vm_glue;
+};
+
+#endif  // EMBEDDERS_OPENGLUI_COMMON_CONTEXT_H_
+
diff --git a/runtime/embedders/android/dart_host.cc b/runtime/embedders/openglui/common/dart_host.cc
similarity index 80%
rename from runtime/embedders/android/dart_host.cc
rename to runtime/embedders/openglui/common/dart_host.cc
index 8dfb574..fae2eb4 100644
--- a/runtime/embedders/android/dart_host.cc
+++ b/runtime/embedders/openglui/common/dart_host.cc
@@ -2,17 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "embedders/android/dart_host.h"
+#include "embedders/openglui/common/dart_host.h"
 
 #include <math.h>
 #include <unistd.h>
 
-#include "embedders/android/log.h"
+#include "embedders/openglui/common/log.h"
 
 DartHost::DartHost(Context *context)
-    : graphics_(context->graphics),
+    : graphics_handler_(context->graphics_handler),
       input_handler_(context->input_handler),
-      sound_service_(context->sound_service),
+      sound_handler_(context->sound_handler),
       timer_(context->timer),
       vm_glue_(context->vm_glue),
       active_(false) {
@@ -30,10 +30,10 @@
 int32_t DartHost::Activate() {
   if (!active_) {
     LOGI("Activating DartHost");
-    if (graphics_->Start() != 0) {
+    if (graphics_handler_->Start() != 0) {
       return -1;
     }
-    if (sound_service_->Start() != 0) {
+    if (sound_handler_->Start() != 0) {
       return -1;
     }
     if (input_handler_->Start() != 0) {
@@ -61,15 +61,16 @@
     active_ = false;
     vm_glue_->FinishMainIsolate();
     LOGI("Deactivating DartHost");
-    sound_service_->Stop();
-    graphics_->Stop();
+    input_handler_->Stop();
+    sound_handler_->Stop();
+    graphics_handler_->Stop();
   }
 }
 
 int32_t DartHost::OnStep() {
   timer_->update();
   vm_glue_->CallUpdate();
-  if (graphics_->Update() != 0) {
+  if (graphics_handler_->Update() != 0) {
     return -1;
   }
   return 0;
@@ -95,7 +96,7 @@
   LOGI("Destroying DartHost");
 }
 
-void DartHost::OnSaveState(void** data, size_t size) {
+void DartHost::OnSaveState(void** data, size_t* size) {
   LOGI("Saving DartHost state");
 }
 
@@ -123,7 +124,3 @@
   LOGI("DartHost lost focus");
 }
 
-void DartHost::Clear() {
-  memset(window_buffer_.bits, 0,
-         window_buffer_.stride * window_buffer_.height * sizeof(int32_t));
-}
diff --git a/runtime/embedders/android/dart_host.h b/runtime/embedders/openglui/common/dart_host.h
similarity index 63%
rename from runtime/embedders/android/dart_host.h
rename to runtime/embedders/openglui/common/dart_host.h
index d77500f..7c85d15 100644
--- a/runtime/embedders/android/dart_host.h
+++ b/runtime/embedders/openglui/common/dart_host.h
@@ -2,18 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef EMBEDDERS_ANDROID_DART_HOST_H_
-#define EMBEDDERS_ANDROID_DART_HOST_H_
+#ifndef EMBEDDERS_OPENGLUI_COMMON_DART_HOST_H_
+#define EMBEDDERS_OPENGLUI_COMMON_DART_HOST_H_
 
-#include <android_native_app_glue.h>
+#include "embedders/openglui/common/context.h"
+#include "embedders/openglui/common/graphics_handler.h"
+#include "embedders/openglui/common/input_handler.h"
+#include "embedders/openglui/common/lifecycle_handler.h"
+#include "embedders/openglui/common/sound_handler.h"
+#include "embedders/openglui/common/timer.h"
+#include "embedders/openglui/common/vm_glue.h"
 #include "include/dart_api.h"
-#include "embedders/android/activity_handler.h"
-#include "embedders/android/context.h"
-#include "embedders/android/graphics.h"
-#include "embedders/android/input_service.h"
-#include "embedders/android/sound_service.h"
-#include "embedders/android/timer.h"
-#include "embedders/android/vm_glue.h"
 
 // Currently the life cycle management is very crude. We conservatively
 // shutdown the main isolate when we lose focus and create a new one when
@@ -21,42 +20,39 @@
 // and we need some hooks to tell the Dart script to save/restore state
 // (and an API that will support that).
 
-class DartHost : public ActivityHandler {
+class DartHost : public LifeCycleHandler {
  public:
   explicit DartHost(Context* context);
   virtual ~DartHost();
 
- protected:
-  int32_t OnActivate();
-  void OnDeactivate();
-  int32_t OnStep();
-
   void OnStart();
   void OnResume();
   void OnPause();
   void OnStop();
   void OnDestroy();
-
-  void OnSaveState(void** data, size_t size);
+  void OnSaveState(void** data, size_t* size);
   void OnConfigurationChanged();
   void OnLowMemory();
   void OnCreateWindow();
   void OnDestroyWindow();
   void OnGainedFocus();
   void OnLostFocus();
+  int32_t OnActivate();
+  void OnDeactivate();
+  int32_t OnStep();
 
  private:
   void Clear();
   int32_t Activate();
   void Deactivate();
 
-  ANativeWindow_Buffer window_buffer_;
-  Graphics* graphics_;
+  GraphicsHandler* graphics_handler_;
   InputHandler* input_handler_;
-  SoundService* sound_service_;
+  SoundHandler* sound_handler_;
   Timer* timer_;
   VMGlue* vm_glue_;
   bool active_;
 };
 
-#endif  // EMBEDDERS_ANDROID_DART_HOST_H_
+#endif  // EMBEDDERS_OPENGLUI_COMMON_DART_HOST_H_
+
diff --git a/runtime/embedders/openglui/common/events.h b/runtime/embedders/openglui/common/events.h
new file mode 100644
index 0000000..64c6951
--- /dev/null
+++ b/runtime/embedders/openglui/common/events.h
@@ -0,0 +1,39 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef EMBEDDERS_OPENGLUI_COMMON_EVENTS_H_
+#define EMBEDDERS_OPENGLUI_COMMON_EVENTS_H_
+
+typedef enum {
+  kStart,
+  kStop,
+  kGainedFocus,
+  kLostFocus,
+  kPause,
+  kResume,
+  kSaveState,
+  kConfigChanged,
+  kInitWindow,
+  kTermWindow,
+  kDestroy
+} LifecycleEvent;
+
+typedef enum {
+  kKeyDown,
+  kKeyUp,
+  kKeyMultiple
+} KeyEvent;
+
+typedef enum {
+  kMotionDown,
+  kMotionUp,
+  kMotionMove,
+  kMotionCancel,
+  kMotionOutside,
+  kMotionPointerDown,
+  kMotionPointerUp
+} MotionEvent;
+
+#endif  // EMBEDDERS_OPENGLUI_COMMON_EVENTS_H_
+
diff --git a/runtime/embedders/android/android_extension.cc b/runtime/embedders/openglui/common/extension.cc
similarity index 95%
rename from runtime/embedders/android/android_extension.cc
rename to runtime/embedders/openglui/common/extension.cc
index 48d76c0..2f3b90d 100644
--- a/runtime/embedders/android/android_extension.cc
+++ b/runtime/embedders/openglui/common/extension.cc
@@ -2,19 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "embedders/android/android_extension.h"
+#include "embedders/openglui/common/extension.h"
 
-#include <android/log.h>
-#include <EGL/egl.h>
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-#include <jni.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
+#include "embedders/openglui/common/log.h"
+#include "embedders/openglui/common/opengl.h"
 #include "include/dart_api.h"
-#include "embedders/android/log.h"
 
 Dart_Handle HandleError(Dart_Handle handle) {
   if (Dart_IsError(handle)) Dart_PropagateError(handle);
@@ -103,7 +99,7 @@
                           int* len_out) {
   Dart_Handle argHandle = HandleError(Dart_GetNativeArgument(arguments, index));
   if (Dart_IsList(argHandle)) {
-    int len;
+    intptr_t len;
     HandleError(Dart_ListLength(argHandle, &len));
     GLint* list = new GLint[len];
     for (int i = 0; i < len; i++) {
@@ -130,7 +126,7 @@
   Dart_Handle argHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
 
   if (Dart_IsList(argHandle)) {
-    int len;
+    intptr_t len;
     HandleError(Dart_ListLength(argHandle, &len));
     GLfloat* list = new GLfloat[len];
     for (int i = 0; i < len; i++) {
@@ -164,13 +160,13 @@
 
 void Log(Dart_NativeArguments arguments) {
   Dart_EnterScope();
-  LOGI(GetArgAsString(arguments, 0));
+  LOGI("%s", GetArgAsString(arguments, 0));
   Dart_ExitScope();
 }
 
 void LogError(Dart_NativeArguments arguments) {
   Dart_EnterScope();
-  LOGE(GetArgAsString(arguments, 0));
+  LOGE("%s", GetArgAsString(arguments, 0));
   Dart_ExitScope();
 }
 
@@ -198,15 +194,11 @@
   Dart_ExitScope();
 }
 
-void EGLSwapBuffers(Dart_NativeArguments arguments) {
-  LOGI("GLSwapBuffers");
+void SwapBuffers(Dart_NativeArguments arguments) {
+  LOGI("SwapBuffers");
   Dart_EnterScope();
-
-  EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-  EGLSurface surface = eglGetCurrentSurface(EGL_DRAW);
-  eglSwapBuffers(display, surface);
-
-  CheckGLError("eglSwapBuffers");
+  GLSwapBuffers();
+  CheckGLError("GLSwapBuffers");
   Dart_ExitScope();
 }
 
@@ -244,7 +236,7 @@
   intptr_t size;
   HandleError(Dart_ListLength(dataHandle, &size));
 
-  LOGI("Size: %d", size);
+  LOGI("Size: %d", static_cast<int>(size));
 
   // TODO(vsm): No guarantee that this is a float!
   float* data = new float[size];
@@ -315,6 +307,7 @@
   glDrawArrays(mode, first, count);
   CheckGLError("glDrawArrays");
   Dart_ExitScope();
+  LOGI("Done GLDrawArrays");
 }
 
 void GLEnableVertexAttribArray(Dart_NativeArguments arguments) {
@@ -393,7 +386,6 @@
 
   GLint infoLogLength = 0;
   glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
-
   GLchar* strInfoLog = new GLchar[infoLogLength + 1];
   glGetShaderInfoLog(shader, infoLogLength, NULL, strInfoLog);
   strInfoLog[infoLogLength] = 0;
@@ -460,10 +452,10 @@
   Dart_Handle sourceHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
   intptr_t length[1];
   HandleError(Dart_StringLength(sourceHandle, length));
-  LOGI("Source length is %d", length[0]);
+  LOGI("Source length is %d", static_cast<int>(length[0]));
   uint8_t* str[1];
   HandleError(Dart_StringToUTF8(sourceHandle, &str[0], length));
-  LOGI("Converted length is %d", length[0]);
+  LOGI("Converted length is %d", static_cast<int>(length[0]));
   str[0][*length] = 0;
 
   const GLchar* source =
@@ -736,8 +728,12 @@
   LOGI("GLClearDepth");
   Dart_EnterScope();
   double depth = GetArgAsDouble(arguments, 0);
+#if defined(__ANDROID__)
   glClearDepthf(depth);
-  CheckGLError("glClearDepthf");
+#else
+  glClearDepth(depth);
+#endif
+  CheckGLError("glClearDepth");
   Dart_ExitScope();
 }
 
@@ -770,6 +766,10 @@
   ReturnGLIntConstant(arguments, GL_COMPILE_STATUS);
 }
 
+void GLDeleteStatus(Dart_NativeArguments arguments) {
+  ReturnGLIntConstant(arguments, GL_DELETE_STATUS);
+}
+
 void GLDepthBufferBit(Dart_NativeArguments arguments) {
   ReturnGLIntConstant(arguments, GL_DEPTH_BUFFER_BIT);
 }
@@ -802,6 +802,10 @@
   ReturnGLIntConstant(arguments, GL_TRUE);
 }
 
+void GLValidateStatus(Dart_NativeArguments arguments) {
+  ReturnGLIntConstant(arguments, GL_VALIDATE_STATUS);
+}
+
 void GLVertexShader(Dart_NativeArguments arguments) {
   ReturnGLIntConstant(arguments, GL_VERTEX_SHADER);
 }
@@ -906,7 +910,7 @@
     {"LogError", LogError},
     {"SystemRand", SystemRand},
     {"SystemSrand", SystemSrand},
-    {"EGLSwapBuffers", EGLSwapBuffers},
+    {"SwapBuffers", SwapBuffers},
     {"GLAttachShader", GLAttachShader},
     {"GLBindBuffer", GLBindBuffer},
     {"GLBufferData", GLBufferData},
@@ -948,6 +952,7 @@
     {"GLArrayBuffer", GLArrayBuffer},
     {"GLColorBufferBit", GLColorBufferBit},
     {"GLCompileStatus", GLCompileStatus},
+    {"GLDeleteStatus", GLDeleteStatus},
     {"GLDepthBufferBit", GLDepthBufferBit},
     {"GLFloat", GLFloat},
     {"GLFragmentShader", GLFragmentShader},
@@ -956,6 +961,7 @@
     {"GLTriangles", GLTriangles},
     {"GLTrue", GLTrue},
     {"GLStaticDraw", GLStaticDraw},
+    {"GLValidateStatus", GLValidateStatus},
     {"GLVertexShader", GLVertexShader},
     {"GLGetShaderInfoLog", GLGetShaderInfoLog},
     {"GLGetProgramInfoLog", GLGetProgramInfoLog},
@@ -984,3 +990,4 @@
   Dart_ExitScope();
   return result;
 }
+
diff --git a/runtime/embedders/android/android_extension.h b/runtime/embedders/openglui/common/extension.h
similarity index 67%
rename from runtime/embedders/android/android_extension.h
rename to runtime/embedders/openglui/common/extension.h
index 76f7d95..4825d90 100644
--- a/runtime/embedders/android/android_extension.h
+++ b/runtime/embedders/openglui/common/extension.h
@@ -1,9 +1,9 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef EMBEDDERS_ANDROID_ANDROID_EXTENSION_H_
-#define EMBEDDERS_ANDROID_ANDROID_EXTENSION_H_
+#ifndef EMBEDDERS_OPENGLUI_COMMON_EXTENSION_H_
+#define EMBEDDERS_OPENGLUI_COMMON_EXTENSION_H_
 
 #include "include/dart_api.h"
 
@@ -14,4 +14,5 @@
 extern int32_t LoadSoundSample(const char* path);
 extern int32_t PlaySoundSample(const char* path);
 
-#endif  // EMBEDDERS_ANDROID_ANDROID_EXTENSION_H_
+#endif  // EMBEDDERS_OPENGLUI_COMMON_EXTENSION_H_
+
diff --git a/runtime/embedders/openglui/common/gl.dart b/runtime/embedders/openglui/common/gl.dart
new file mode 100644
index 0000000..a916726
--- /dev/null
+++ b/runtime/embedders/openglui/common/gl.dart
@@ -0,0 +1,186 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library android_extension;
+
+// The simplest way to call native code: top-level functions.
+int systemRand() native "SystemRand";
+void systemSrand(int seed) native "SystemSrand";
+void log(String what) native "Log";
+
+// EGL functions.
+void glSwapBuffers() native "SwapBuffers";
+
+// GL functions.
+void glAttachShader(int program, int shader) native "GLAttachShader";
+void glBindBuffer(int target, int buffer) native "GLBindBuffer";
+void glBufferData(int target, List data, int usage) native "GLBufferData";
+void glClearColor(num r, num g, num b, num alpha) native "GLClearColor";
+void glClearDepth(num depth) native "GLClearDepth";
+void glClear(int mask) native "GLClear";
+void glCompileShader(int shader) native "GLCompileShader";
+int glCreateBuffer() native "GLCreateBuffer";
+int glCreateProgram() native "GLCreateProgram";
+int glCreateShader(int shaderType) native "GLCreateShader";
+void glDrawArrays(int mode, int first, int count) native "GLDrawArrays";
+void glEnableVertexAttribArray(int index) native "GLEnableVertexAttribArray";
+int glGetAttribLocation(int program, String name) native "GLGetAttribLocation";
+int glGetError() native "GLGetError";
+int glGetProgramParameter(int program, int param)
+    native "GLGetProgramParameter";
+int glGetShaderParameter(int shader, int param) native "GLGetShaderParameter";
+int glGetUniformLocation(int program, String name)
+    native "GLGetUniformLocation";
+void glLinkProgram(int program) native "GLLinkProgram";
+void glShaderSource(int shader, String source) native "GLShaderSource";
+void glUniform1f(int location, double v0) native "GLUniform1f";
+void glUniform2f(int location, double v0, double v1) native "GLUniform2f";
+void glUniform3f(int location, double v0, double v1, double v2)
+    native "GLUniform3f";
+void glUniform4f(int location, double v0, double v1, double v2, double v3)
+    native "GLUniform4f";
+void glUniform1i(int location, int v0) native "GLUniform1i";
+void glUniform2i(int location, int v0, int v1) native "GLUniform2i";
+void glUniform3i(int location, int v0, int v1, int v2) native "GLUniform3i";
+void glUniform4i(int location, int v0, int v1, int v2, int v3)
+    native "GLUniform4i";
+void glUniform1fv(int location, List values) native "GLUniform1fv";
+void glUniform2fv(int location, List values) native "GLUniform2fv";
+void glUniform3fv(int location, List values) native "GLUniform3fv";
+void glUniform4fv(int location, List values) native "GLUniform4fv";
+void glUniform1iv(int location, List values) native "GLUniform1iv";
+void glUniform2iv(int location, List values) native "GLUniform2iv";
+void glUniform3iv(int location, List values) native "GLUniform3iv";
+void glUniform4iv(int location, List values) native "GLUniform4iv";
+void glUseProgram(int program) native "GLUseProgram";
+void glVertexAttribPointer(int index, int size, int type, bool normalized,
+    int stride, int pointer) native "GLVertexAttribPointer";
+void glViewport(int x, int y, int width, int height) native "GLViewport";
+
+int glArrayBuffer() native "GLArrayBuffer";
+int glColorBufferBit() native "GLColorBufferBit";
+int glCompileStatus() native "GLCompileStatus";
+int glDeleteStatus() native "GLDeleteStatus";
+int glDepthBufferBit() native "GLDepthBufferBit";
+int glFloat() native "GLFloat";
+int glFragmentShader() native "GLFragmentShader";
+int glLinkStatus() native "GLLinkStatus";
+int glStaticDraw() native "GLStaticDraw";
+int glTriangleStrip() native "GLTriangleStrip";
+int glTriangles() native "GLTriangles";
+int glTrue() native "GLTrue";
+int glValidateStatus() native "GLValidateStatus";
+int glVertexShader() native "GLVertexShader";
+
+String glGetShaderInfoLog(int shader) native "GLGetShaderInfoLog";
+String glGetProgramInfoLog(int program) native "GLGetProgramInfoLog";
+
+class WebGLRenderingContext {
+  WebGLRenderingContext();
+
+  static get ARRAY_BUFFER => glArrayBuffer();
+  static get COLOR_BUFFER_BIT => glColorBufferBit();
+  static get COMPILE_STATUS => glCompileStatus();
+  static get DELETE_STATUS => glDeleteStatus();
+  static get DEPTH_BUFFER_BIT => glDepthBufferBit();
+  static get FLOAT => glFloat();
+  static get FRAGMENT_SHADER => glFragmentShader();
+  static get LINK_STATUS => glLinkStatus();
+  static get STATIC_DRAW => glStaticDraw();
+  static get TRUE => glTrue();
+  static get TRIANGLE_STRIP => glTriangleStrip();
+  static get TRIANGLES => glTriangles();
+  static get VALIDATE_STATUS => glValidateStatus();
+  static get VERTEX_SHADER => glVertexShader();
+
+  attachShader(program, shader) => glAttachShader(program, shader);
+  bindBuffer(target, buffer) => glBindBuffer(target, buffer);
+  bufferData(target, data, usage) => glBufferData(target, data, usage);
+  clearColor(r, g, b, alpha) => glClearColor(r, g, b, alpha);
+  clearDepth(depth) => glClearDepth(depth);
+  clear(mask) => glClear(mask);
+  compileShader(shader) => glCompileShader(shader);
+  createBuffer() => glCreateBuffer();
+  createProgram() => glCreateProgram();
+  createShader(shaderType) => glCreateShader(shaderType);
+  drawArrays(mode, first, count) => glDrawArrays(mode, first, count);
+  enableVertexAttribArray(index) => glEnableVertexAttribArray(index);
+  getAttribLocation(program, name) => glGetAttribLocation(program, name);
+  getError() => glGetError();
+  getProgramParameter(program, name) {
+    var rtn = glGetProgramParameter(program, name);
+    if (name == DELETE_STATUS ||
+        name == LINK_STATUS ||
+        name == VALIDATE_STATUS) {
+      return (rtn == 0) ? false : true;
+    }
+    return rtn;
+  }
+  getShaderParameter(shader, name) {
+    var rtn = glGetShaderParameter(shader, name);
+    if (name == DELETE_STATUS || name == COMPILE_STATUS) {
+      return (rtn == 0) ? false : true;
+    }
+    return rtn;
+  }
+  getUniformLocation(program, name) => glGetUniformLocation(program, name);
+  linkProgram(program) => glLinkProgram(program);
+  shaderSource(shader, source) => glShaderSource(shader, source);
+  uniform1f(location, v0) => glUniform1f(location, v0);
+  uniform2f(location, v0, v1) => glUniform2f(location, v0, v1);
+  uniform3f(location, v0, v1, v2) => glUniform3f(location, v0, v1, v2);
+  uniform4f(location, v0, v1, v2, v3) => glUniform4f(location, v0, v1, v2, v3);
+  uniform1i(location, v0) => glUniform1i(location, v0);
+  uniform2i(location, v0, v1) => glUniform2i(location, v0, v1);
+  uniform3i(location, v0, v1, v2) => glUniform3i(location, v0, v1, v2);
+  uniform4i(location, v0, v1, v2, v3) => glUniform4i(location, v0, v1, v2, v3);
+  uniform1fv(location, values) => glUniform1fv(location, values);
+  uniform2fv(location, values) => glUniform2fv(location, values);
+  uniform3fv(location, values) => glUniform3fv(location, values);
+  uniform4fv(location, values) => glUniform4fv(location, values);
+  uniform1iv(location, values) => glUniform1iv(location, values);
+  uniform2iv(location, values) => glUniform2iv(location, values);
+  uniform3iv(location, values) => glUniform3iv(location, values);
+  uniform4iv(location, values) => glUniform4iv(location, values);
+  useProgram(program) => glUseProgram(program);
+  vertexAttribPointer(index, size, type, normalized, stride, pointer) =>
+    glVertexAttribPointer(index, size, type, normalized, stride, pointer);
+  viewport(x, y, width, height) => glViewport(x, y, width, height);
+  getShaderInfoLog(shader) => glGetShaderInfoLog(shader);
+  getProgramInfoLog(program) => glGetProgramInfoLog(program);
+
+  // TODO(vsm): Kill.
+  noSuchMethod(invocation) {
+      throw new Exception('Unimplemented ${invocation.memberName}');
+  }
+}
+
+var gl = new WebGLRenderingContext();
+
+//------------------------------------------------------------------
+// Simple audio support.
+
+void playBackground(String path) native "PlayBackground";
+void stopBackground() native "StopBackground";
+
+//-------------------------------------------------------------------
+// Set up print().
+
+get _printClosure => (s) {
+  try {
+    log(s);
+  } catch (_) {
+    throw(s);
+  }
+};
+
+//------------------------------------------------------------------
+// Temp hack for compat with WebGL.
+
+class Float32Array extends List<double> {
+  Float32Array.fromList(List a) {
+    addAll(a);
+  }
+}
+
diff --git a/runtime/embedders/openglui/common/gl_graphics_handler.cc b/runtime/embedders/openglui/common/gl_graphics_handler.cc
new file mode 100644
index 0000000..5208b06
--- /dev/null
+++ b/runtime/embedders/openglui/common/gl_graphics_handler.cc
@@ -0,0 +1,64 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "embedders/openglui/common/gl_graphics_handler.h"
+#include "embedders/openglui/common/log.h"
+
+extern void CheckGLError(const char *function);
+
+void GLGraphicsHandler::SetViewport(int left, int top, int width, int height) {
+  glViewport(left, top, width, height);
+  CheckGLError("glViewPort");
+}
+
+int GLGraphicsHandler::BuildProgram(const char* vertexShaderSource,
+                                 const char* fragmentShaderSource) const {
+  int vertexShader = BuildShader(vertexShaderSource, GL_VERTEX_SHADER);
+  int fragmentShader = BuildShader(fragmentShaderSource, GL_FRAGMENT_SHADER);
+  if (vertexShader < 0 || fragmentShader < 0) {
+    return -1;
+  }
+
+  GLuint programHandle = glCreateProgram();
+  glAttachShader(programHandle, static_cast<GLuint>(vertexShader));
+  glAttachShader(programHandle, static_cast<GLuint>(fragmentShader));
+  glLinkProgram(programHandle);
+
+  GLint linkSuccess;
+  glGetProgramiv(programHandle, GL_LINK_STATUS, &linkSuccess);
+  if (linkSuccess == GL_FALSE) {
+    GLint infoLogLength;
+    glGetProgramiv(programHandle, GL_INFO_LOG_LENGTH, &infoLogLength);
+    GLchar* strInfoLog = new GLchar[infoLogLength + 1];
+    glGetProgramInfoLog(programHandle, infoLogLength, NULL, strInfoLog);
+    strInfoLog[infoLogLength] = 0;
+    LOGE("Link failed: %s", strInfoLog);
+    delete[] strInfoLog;
+    return -1;
+  }
+  return static_cast<int>(programHandle);
+}
+
+int GLGraphicsHandler::BuildShader(const char* source,
+                                   GLenum shaderType) const {
+  GLuint shaderHandle = glCreateShader(shaderType);
+  glShaderSource(shaderHandle, 1, &source, NULL);
+  glCompileShader(shaderHandle);
+
+  GLint compileSuccess;
+  glGetShaderiv(shaderHandle, GL_COMPILE_STATUS, &compileSuccess);
+
+  if (compileSuccess == GL_FALSE) {
+    GLint infoLogLength = 0;
+    glGetShaderiv(shaderHandle, GL_INFO_LOG_LENGTH, &infoLogLength);
+    GLchar* strInfoLog = new GLchar[infoLogLength + 1];
+    glGetShaderInfoLog(shaderHandle, infoLogLength, NULL, strInfoLog);
+    strInfoLog[infoLogLength] = 0;
+    LOGE("Shader compile failed: %s", strInfoLog);
+    delete [] strInfoLog;
+    return -1;
+  }
+  return static_cast<int>(shaderHandle);
+}
+
diff --git a/runtime/embedders/openglui/common/gl_graphics_handler.h b/runtime/embedders/openglui/common/gl_graphics_handler.h
new file mode 100644
index 0000000..ca8b54f
--- /dev/null
+++ b/runtime/embedders/openglui/common/gl_graphics_handler.h
@@ -0,0 +1,40 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef EMBEDDERS_OPENGLUI_COMMON_GL_GRAPHICS_HANDLER_H_
+#define EMBEDDERS_OPENGLUI_COMMON_GL_GRAPHICS_HANDLER_H_
+
+#include "embedders/openglui/common/graphics_handler.h"
+#include "embedders/openglui/common/opengl.h"
+#include "embedders/openglui/common/timer.h"
+
+class GLGraphicsHandler : public GraphicsHandler {
+  public:
+    GLGraphicsHandler()
+      : GraphicsHandler() {
+    }
+
+    virtual int32_t Start() = 0;
+    virtual void Stop() = 0;
+
+    void SwapBuffers() {
+      GLSwapBuffers();
+    }
+
+    virtual int32_t Update() {
+      SwapBuffers();
+      return 0;
+    }
+
+    void SetViewport(int left, int top, int width, int height);
+    int BuildProgram(const char* vertexShaderSource,
+                     const char* fragmentShaderSource) const;
+    int BuildShader(const char* source, GLenum shaderType) const;
+
+    virtual ~GLGraphicsHandler() {
+    }
+};
+
+#endif  // EMBEDDERS_OPENGLUI_COMMON_GL_GRAPHICS_HANDLER_H_
+
diff --git a/runtime/embedders/openglui/common/graphics_handler.h b/runtime/embedders/openglui/common/graphics_handler.h
new file mode 100644
index 0000000..1d02089
--- /dev/null
+++ b/runtime/embedders/openglui/common/graphics_handler.h
@@ -0,0 +1,47 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef EMBEDDERS_OPENGLUI_COMMON_GRAPHICS_HANDLER_H_
+#define EMBEDDERS_OPENGLUI_COMMON_GRAPHICS_HANDLER_H_
+
+#include <stdint.h>
+
+#include "embedders/openglui/common/isized.h"
+#include "embedders/openglui/common/timer.h"
+
+class GraphicsHandler : public ISized {
+  public:
+    GraphicsHandler()
+      : width_(0),
+        height_(0) {
+    }
+
+    const int32_t& height() {
+      return height_;
+    }
+
+    const int32_t& width() {
+      return width_;
+    }
+
+    virtual int32_t Start() = 0;
+    virtual void Stop() = 0;
+
+    virtual void SwapBuffers() = 0;
+
+    virtual int32_t Update() {
+      return 0;
+    }
+
+    virtual void SetViewport(int left, int top, int width, int height) = 0;
+
+    virtual ~GraphicsHandler() {
+    }
+
+  protected:
+    int32_t width_, height_;
+};
+
+#endif  // EMBEDDERS_OPENGLUI_COMMON_GRAPHICS_HANDLER_H_
+
diff --git a/runtime/embedders/openglui/common/input_handler.cc b/runtime/embedders/openglui/common/input_handler.cc
new file mode 100644
index 0000000..6213de7
--- /dev/null
+++ b/runtime/embedders/openglui/common/input_handler.cc
@@ -0,0 +1,68 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "embedders/openglui/common/input_handler.h"
+#include "embedders/openglui/common/log.h"
+
+InputHandler::InputHandler(VMGlue* vm_glue)
+  : vm_glue_(vm_glue) {
+}
+
+int InputHandler::OnMotionEvent(MotionEvent event,
+                                int64_t when,
+                                float x,
+                                float y) {
+  const char *function = NULL;
+  switch (event) {
+    case kMotionDown:
+      function = "onMotionDown";
+      break;
+    case kMotionUp:
+      function = "onMotionUp";
+      break;
+    case kMotionMove:
+      function = "onMotionMove";
+      break;
+    case kMotionCancel:
+      function = "onMotionCancel";
+      break;
+    case kMotionOutside:
+      function = "onMotionOutside";
+      break;
+    case kMotionPointerDown:
+      function = "onMotionPointerDown";
+      break;
+    case kMotionPointerUp:
+      function = "onMotionPointerUp";
+      break;
+    default:
+      return -1;
+  }
+  return vm_glue_->OnMotionEvent(function, when, x, y);
+}
+
+int InputHandler::OnKeyEvent(KeyEvent event,
+                             int64_t when,
+                             int32_t flags,
+                             int32_t key_code,
+                             int32_t meta_state,
+                             int32_t repeat) {
+  const char *function = NULL;
+  switch (event) {
+    case kKeyDown:
+      function = "onKeyDown";
+      break;
+    case kKeyUp:
+      function = "onKeyUp";
+      break;
+    case kKeyMultiple:
+      function = "onKeyMultiple";
+      break;
+    default:
+      return -1;
+  }
+  return vm_glue_->OnKeyEvent(function, when, flags, key_code,
+                              meta_state, repeat);
+}
+
diff --git a/runtime/embedders/openglui/common/input_handler.h b/runtime/embedders/openglui/common/input_handler.h
new file mode 100644
index 0000000..2750d39
--- /dev/null
+++ b/runtime/embedders/openglui/common/input_handler.h
@@ -0,0 +1,27 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef EMBEDDERS_OPENGLUI_COMMON_INPUT_HANDLER_H_
+#define EMBEDDERS_OPENGLUI_COMMON_INPUT_HANDLER_H_
+
+#include "embedders/openglui/common/events.h"
+#include "embedders/openglui/common/vm_glue.h"
+
+class InputHandler {
+  public:
+    explicit InputHandler(VMGlue* vm_glue);
+    virtual int32_t Start() { return 0; }
+    virtual void Stop() { }
+    virtual int OnMotionEvent(MotionEvent event, int64_t when,
+                    float move_x, float move_y);
+    virtual int OnKeyEvent(KeyEvent event, int64_t when, int32_t flags,
+             int32_t key_code, int32_t meta_state, int32_t repeat);
+    virtual ~InputHandler() {}
+
+  protected:
+    VMGlue* vm_glue_;
+};
+
+#endif  // EMBEDDERS_OPENGLUI_COMMON_INPUT_HANDLER_H_
+
diff --git a/runtime/embedders/openglui/common/isized.h b/runtime/embedders/openglui/common/isized.h
new file mode 100644
index 0000000..c29ba93
--- /dev/null
+++ b/runtime/embedders/openglui/common/isized.h
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef EMBEDDERS_OPENGLUI_COMMON_ISIZED_H_
+#define EMBEDDERS_OPENGLUI_COMMON_ISIZED_H_
+
+// An interface for objects that have a size. VMGlue needs the window
+// size when calling setup() (and eventually resize()) but it does not
+// need to know anything else about the window, so we use this interface.
+class ISized {
+  public:
+    virtual const int32_t& height() = 0;
+    virtual const int32_t& width() = 0;
+    virtual ~ISized() {}
+};
+
+#endif  // EMBEDDERS_OPENGLUI_COMMON_ISIZED_H_
+
diff --git a/runtime/embedders/android/activity_handler.h b/runtime/embedders/openglui/common/lifecycle_handler.h
similarity index 76%
rename from runtime/embedders/android/activity_handler.h
rename to runtime/embedders/openglui/common/lifecycle_handler.h
index d19aaaa..801e6d8 100644
--- a/runtime/embedders/android/activity_handler.h
+++ b/runtime/embedders/openglui/common/lifecycle_handler.h
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef EMBEDDERS_ANDROID_ACTIVITY_HANDLER_H_
-#define EMBEDDERS_ANDROID_ACTIVITY_HANDLER_H_
+#ifndef EMBEDDERS_OPENGLUI_COMMON_LIFECYCLE_HANDLER_H_
+#define EMBEDDERS_OPENGLUI_COMMON_LIFECYCLE_HANDLER_H_
 
-class ActivityHandler {
+class LifeCycleHandler {
   public:
     virtual int32_t OnActivate() = 0;
     virtual void OnDeactivate() = 0;
@@ -22,7 +22,8 @@
     virtual void OnDestroyWindow() {}
     virtual void OnGainedFocus() {}
     virtual void OnLostFocus() {}
-    virtual ~ActivityHandler() {}
+    virtual ~LifeCycleHandler() {}
 };
 
-#endif  // EMBEDDERS_ANDROID_ACTIVITY_HANDLER_H_
+#endif  // EMBEDDERS_OPENGLUI_COMMON_LIFECYCLE_HANDLER_H_
+
diff --git a/runtime/embedders/openglui/common/log.h b/runtime/embedders/openglui/common/log.h
new file mode 100644
index 0000000..5bfa782
--- /dev/null
+++ b/runtime/embedders/openglui/common/log.h
@@ -0,0 +1,17 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef EMBEDDERS_OPENGLUI_COMMON_LOG_H_
+#define EMBEDDERS_OPENGLUI_COMMON_LOG_H_
+
+#ifndef ANDROID
+#include <stdio.h>
+#define LOGI(...)       fprintf(stdout, __VA_ARGS__)
+#define LOGE(...)       fprintf(stderr, __VA_ARGS__)
+#else
+#include "embedders/openglui/android/android_log.h"
+#endif
+
+#endif  // EMBEDDERS_OPENGLUI_COMMON_LOG_H_
+
diff --git a/runtime/embedders/openglui/common/opengl.h b/runtime/embedders/openglui/common/opengl.h
new file mode 100644
index 0000000..ac7b485
--- /dev/null
+++ b/runtime/embedders/openglui/common/opengl.h
@@ -0,0 +1,43 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// A semi-generic header file that can be used to isolate platform differences
+// for OpenGL headers.
+#ifndef EMBEDDERS_OPENGLUI_COMMON_OPENGL_H_
+#define EMBEDDERS_OPENGLUI_COMMON_OPENGL_H_
+
+#if defined(__APPLE__)
+#  ifdef GL_ES_VERSION_2_0
+#    include <OpenGLES/ES2/gl.h>
+#  else
+#    include <Glut/glut.h>
+#    include <OpenGL/gl.h>
+#  endif
+#  define GLSwapBuffers()    glutSwapBuffers()
+#elif defined(_WIN32) || defined(_WIN64)
+#  include <GL/glew.h>
+#  include <GL/wglew.h>
+#  include <GLUT/glut.h>
+#  include <Windows.h>
+#  define GLSwapBuffers()    glutSwapBuffers()
+#elif defined(__ANDROID__)
+#  include <EGL/egl.h>
+#  include <GLES2/gl2.h>
+#  include <GLES2/gl2ext.h>
+#  define GLSwapBuffers() \
+    do {\
+      EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); \
+      EGLSurface surface = eglGetCurrentSurface(EGL_DRAW); \
+      eglSwapBuffers(display, surface); \
+    } while (0);
+#else  // Linux.
+#  define GL_GLEXT_PROTOTYPES 1
+#  include <GL/gl.h>
+#  include <GL/glext.h>
+#  include <GL/glut.h>
+#  define GLSwapBuffers()    glutSwapBuffers()
+#endif
+
+#endif  // EMBEDDERS_OPENGLUI_COMMON_OPENGL_H_
+
diff --git a/runtime/embedders/openglui/common/resource.h b/runtime/embedders/openglui/common/resource.h
new file mode 100644
index 0000000..445d2d1
--- /dev/null
+++ b/runtime/embedders/openglui/common/resource.h
@@ -0,0 +1,57 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef EMBEDDERS_OPENGLUI_COMMON_RESOURCE_H_
+#define EMBEDDERS_OPENGLUI_COMMON_RESOURCE_H_
+
+#include <stdlib.h>
+
+class Resource {
+  public:
+    explicit Resource(const char* path)
+        :  path_(path),
+           descriptor_(-1),
+           start_(0),
+           length_(-1) {
+    }
+
+    const char* path() {
+      return path_;
+    }
+
+    virtual int32_t descriptor() {
+      return descriptor_;
+    }
+
+    virtual off_t start() {
+      return start_;
+    }
+
+    virtual off_t length() {
+      return length_;
+    }
+
+    virtual int32_t Open() {
+      return -1;
+    }
+
+    virtual void Close() {
+    }
+
+    virtual int32_t Read(void* buffer, size_t count) {
+      return -1;
+    }
+
+    virtual ~Resource() {
+    }
+
+  protected:
+    const char* path_;
+    int32_t descriptor_;
+    off_t start_;
+    off_t length_;
+};
+
+#endif  // EMBEDDERS_OPENGLUI_COMMON_RESOURCE_H_
+
diff --git a/runtime/embedders/openglui/common/sample.h b/runtime/embedders/openglui/common/sample.h
new file mode 100644
index 0000000..d88f52f
--- /dev/null
+++ b/runtime/embedders/openglui/common/sample.h
@@ -0,0 +1,60 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef EMBEDDERS_OPENGLUI_COMMON_SAMPLE_H_
+#define EMBEDDERS_OPENGLUI_COMMON_SAMPLE_H_
+
+#include "embedders/openglui/common/resource.h"
+
+class Sample {
+  public:
+    explicit Sample(const char* path)
+        : resource_(path),
+          buffer_(NULL),
+          length_(0) {
+    }
+
+    ~Sample() {
+      Unload();
+    }
+
+    const char* path() {
+      return resource_.path();
+    }
+
+    uint8_t* buffer() {
+      return buffer_;
+    }
+
+    off_t length() {
+      return length_;
+    }
+
+    int32_t Load() {
+      int32_t rtn = -1;
+      if (resource_.Open() == 0) {
+        buffer_ = new uint8_t[length_ = resource_.length()];
+        rtn = resource_.Read(buffer_, length_);
+        resource_.Close();
+      }
+      return rtn;
+    }
+
+    void Unload() {
+      if (buffer_ != NULL) {
+        delete[] buffer_;
+        buffer_ = NULL;
+      }
+      length_ = 0;
+    }
+
+  private:
+    friend class SoundService;
+    Resource resource_;
+    uint8_t* buffer_;
+    off_t length_;
+};
+
+#endif  // EMBEDDERS_OPENGLUI_COMMON_SAMPLE_H_
+
diff --git a/runtime/embedders/openglui/common/sound_handler.cc b/runtime/embedders/openglui/common/sound_handler.cc
new file mode 100644
index 0000000..1412b7f
--- /dev/null
+++ b/runtime/embedders/openglui/common/sound_handler.cc
@@ -0,0 +1,52 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "embedders/openglui/common/sound_handler.h"
+
+#include <string.h>
+
+#include "embedders/openglui/common/log.h"
+
+SoundHandler* SoundHandler::instance_ = NULL;
+
+SoundHandler::SoundHandler()
+    : samples_() {
+}
+
+Sample* SoundHandler::GetSample(const char* path) {
+  for (samples_t::iterator sp = samples_.begin();
+       sp != samples_.end();
+       ++sp) {
+    Sample* sample = (*sp);
+    if (strcmp(sample->path(), path) == 0) {
+      return sample;
+    }
+  }
+  Sample* sample = new Sample(path);
+  if (sample->Load() != 0) {
+    LOGI("Failed to load sample %s", path);
+    delete sample;
+    return NULL;
+  }
+  samples_.push_back(sample);
+  return sample;
+}
+
+
+int32_t PlayBackgroundSound(const char* path) {
+  return SoundHandler::instance()->PlayBackground(path);
+}
+
+void StopBackgroundSound() {
+  SoundHandler::instance()->StopBackground();
+}
+
+int32_t LoadSoundSample(const char* path) {
+  return SoundHandler::instance()->LoadSample(path);
+}
+
+int32_t PlaySoundSample(const char* path) {
+  return SoundHandler::instance()->PlaySample(path);
+}
+
diff --git a/runtime/embedders/openglui/common/sound_handler.h b/runtime/embedders/openglui/common/sound_handler.h
new file mode 100644
index 0000000..100d0a5
--- /dev/null
+++ b/runtime/embedders/openglui/common/sound_handler.h
@@ -0,0 +1,63 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef EMBEDDERS_OPENGLUI_COMMON_SOUND_HANDLER_H_
+#define EMBEDDERS_OPENGLUI_COMMON_SOUND_HANDLER_H_
+
+#include <stdint.h>
+#include <vector>
+
+#include "embedders/openglui/common/sample.h"
+
+class SoundHandler {
+  public:
+    SoundHandler();
+
+    virtual ~SoundHandler() {
+    }
+
+    virtual int32_t Start() {
+      return 0;
+    }
+
+    virtual void Stop() {
+    }
+
+    virtual int32_t PlayBackground(const char* path) {
+      return 0;
+    }
+
+    virtual void StopBackground() {
+    }
+
+    // Optional, for preloading.
+    int32_t LoadSample(const char* path) {
+       return (GetSample(path) == NULL) ? -1 : 0;
+    }
+
+    virtual int32_t PlaySample(const char* path) {
+      return 0;
+    }
+
+    static SoundHandler* instance() {
+      return instance_;
+    }
+
+  protected:
+    typedef std::vector<Sample*> samples_t;
+
+    Sample* GetSample(const char* path);
+
+    samples_t samples_;
+
+    static SoundHandler* instance_;
+};
+
+int32_t PlayBackgroundSound(const char* path);
+void StopBackgroundSound();
+int32_t LoadSoundSample(const char* path);
+int32_t PlaySoundSample(const char* path);
+
+#endif  // EMBEDDERS_OPENGLUI_COMMON_SOUND_HANDLER_H_
+
diff --git a/runtime/embedders/openglui/common/timer.cc b/runtime/embedders/openglui/common/timer.cc
new file mode 100644
index 0000000..f5c1e0f
--- /dev/null
+++ b/runtime/embedders/openglui/common/timer.cc
@@ -0,0 +1,66 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "embedders/openglui/common/timer.h"
+
+#define NANO (+1.0E-9)
+
+#ifdef __MACH__
+#include <mach/mach.h>
+#include <mach/mach_time.h>
+#include <sys/time.h>
+
+#define GIGA UINT64_C(1000000000)
+
+#define CLOCK_REALTIME    0
+#define CLOCK_MONOTONIC   1
+
+double timebase = 0.0;
+uint64_t timestart = 0;
+
+void clock_gettime(int type, timespec* t) {
+  if (!timestart) {
+    mach_timebase_info_data_t tb = { 0, 1 };
+    mach_timebase_info(&tb);
+    timebase = tb.numer;
+    timebase /= tb.denom;
+    timestart = mach_absolute_time();
+  }
+  if (type == CLOCK_MONOTONIC) {
+    double diff = (mach_absolute_time() - timestart) * timebase;
+    t->tv_sec = diff * NANO;
+    t->tv_nsec = diff - (t->tv_sec * GIGA);
+  } else {  // type == CLOCK_REALTIME
+    struct timeval now;
+    gettimeofday(&now, NULL);
+    t->tv_sec  = now.tv_sec;
+    t->tv_nsec = now.tv_usec * 1000;
+  }
+}
+#endif
+
+Timer::Timer() : elapsed_(0.0f), last_time_(0.0) {
+}
+
+void Timer::reset() {
+  elapsed_ = 0.0f;
+  last_time_ = now();
+}
+
+void Timer::update() {
+  double current = now();
+  elapsed_ = (current - last_time_);
+  last_time_ = current;
+}
+
+double Timer::now() {
+  timespec timeval;
+  clock_gettime(CLOCK_MONOTONIC, &timeval);
+  return timeval.tv_sec + (timeval.tv_nsec * NANO);
+}
+
+float Timer::elapsed() {
+  return elapsed_;
+}
+
diff --git a/runtime/embedders/android/timer.h b/runtime/embedders/openglui/common/timer.h
similarity index 74%
rename from runtime/embedders/android/timer.h
rename to runtime/embedders/openglui/common/timer.h
index d38027a..db7f50a 100644
--- a/runtime/embedders/android/timer.h
+++ b/runtime/embedders/openglui/common/timer.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef EMBEDDERS_ANDROID_TIMER_H_
-#define EMBEDDERS_ANDROID_TIMER_H_
+#ifndef EMBEDDERS_OPENGLUI_COMMON_TIMER_H_
+#define EMBEDDERS_OPENGLUI_COMMON_TIMER_H_
 
 #include <time.h>
 
@@ -20,4 +20,5 @@
   double last_time_;
 };
 
-#endif  // EMBEDDERS_ANDROID_TIMER_H_
+#endif  // EMBEDDERS_OPENGLUI_COMMON_TIMER_H_
+
diff --git a/runtime/embedders/android/types.h b/runtime/embedders/openglui/common/types.h
similarity index 78%
rename from runtime/embedders/android/types.h
rename to runtime/embedders/openglui/common/types.h
index 413b91d..8acbe8c 100644
--- a/runtime/embedders/android/types.h
+++ b/runtime/embedders/openglui/common/types.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef EMBEDDERS_ANDROID_TYPES_H_
-#define EMBEDDERS_ANDROID_TYPES_H_
+#ifndef EMBEDDERS_OPENGLUI_COMMON_TYPES_H_
+#define EMBEDDERS_OPENGLUI_COMMON_TYPES_H_
 
 struct Location {
   Location() : pos_x_(0), pos_y_(0) {
@@ -19,4 +19,6 @@
 
   float pos_x_, pos_y_;
 };
-#endif  // EMBEDDERS_ANDROID_TYPES_H_
+
+#endif  // EMBEDDERS_OPENGLUI_COMMON_TYPES_H_
+
diff --git a/runtime/embedders/android/vm_glue.cc b/runtime/embedders/openglui/common/vm_glue.cc
similarity index 79%
rename from runtime/embedders/android/vm_glue.cc
rename to runtime/embedders/openglui/common/vm_glue.cc
index 56ed3c3..b0a82bd 100644
--- a/runtime/embedders/android/vm_glue.cc
+++ b/runtime/embedders/openglui/common/vm_glue.cc
@@ -3,24 +3,44 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include <math.h>
+#include <stdarg.h>
 #include <stdio.h>
-#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
 #include <sys/stat.h>
+#include <unistd.h>
 
+#include "embedders/openglui/common/extension.h"
+#include "embedders/openglui/common/log.h"
+#include "embedders/openglui/common/vm_glue.h"
 #include "include/dart_api.h"
-#include "embedders/android/android_extension.h"
-#include "embedders/android/log.h"
-#include "embedders/android/vm_glue.h"
+
+char* VMGlue::extension_script_ = NULL;
 
 // snapshot_buffer points to a snapshot if we link in a snapshot otherwise
 // it is initialized to NULL.
 
-VMGlue::VMGlue(Graphics* graphics)
-    : graphics_(graphics),
+VMGlue::VMGlue(ISized* surface,
+               const char* script_path,
+               const char* extension_script,
+               const char* main_script)
+    : surface_(surface),
       isolate_(NULL),
       initialized_vm_(false),
       initialized_script_(false) {
   LOGI("Creating VMGlue");
+  if (main_script == NULL) {
+    main_script = "main.dart";
+  }
+  if (extension_script == NULL) {
+    extension_script = "gl.dart";
+  }
+  size_t len = strlen(script_path) + strlen(main_script) + 2;
+  main_script_ = new char[len];
+  snprintf(main_script_, len, "%s/%s", script_path, main_script);
+  len = strlen(script_path) + strlen(extension_script) + 2;
+  extension_script_ = new char[len];
+  snprintf(extension_script_, len, "%s/%s", script_path, extension_script);
 }
 
 int VMGlue::ErrorExit(const char* format, ...) {
@@ -45,7 +65,7 @@
 #define CHECK_RESULT(result)                   \
   if (Dart_IsError(result)) {                  \
     *error = strdup(Dart_GetError(result));    \
-    LOGE(*error);                              \
+    LOGE("%s", *error);                        \
     Dart_ExitScope();                          \
     Dart_ShutdownIsolate();                    \
     return false;                              \
@@ -62,9 +82,9 @@
   // TODO(vsm): Split this up into separate libraries for 3D, 2D,
   // Touch, Audio, etc.  All builtin libraries should be handled here
   // (or moved into a snapshot).
-  if (strcmp(url, "android_extension.dart") == 0) {
-    Dart_Handle source = VMGlue::LoadSourceFromFile(
-        "/data/data/com.google.dartndk/app_dart/android_extension.dart");
+  if (strcmp(url, "gl.dart") == 0) {
+    Dart_Handle source =
+        VMGlue::LoadSourceFromFile(extension_script_);
     Dart_Handle library = CheckError(Dart_LoadLibrary(urlHandle, source));
     CheckError(Dart_SetNativeResolver(library, ResolveName));
     return library;
@@ -107,9 +127,6 @@
                                      error);
 }
 
-#define VMHOSTNAME  "android_dart_host"
-#define MAINSCRIPT  "/data/data/com.google.dartndk/app_dart/main.dart"
-
 const char* VM_FLAGS[] = {
   "--enable_type_checks",  // TODO(gram): This should be an option!
   "--trace_isolates",
@@ -173,7 +190,7 @@
 
   // Create an isolate and loads up the application script.
   char* error = NULL;
-  if (!CreateIsolateAndSetup(MAINSCRIPT, "main", NULL, &error)) {
+  if (!CreateIsolateAndSetup(main_script_, "main", NULL, &error)) {
     LOGE("CreateIsolateAndSetup: %s\n", error);
     free(error);
     return -1;
@@ -182,8 +199,8 @@
   isolate_ = Dart_CurrentIsolate();
   Dart_EnterScope();
 
-  Dart_Handle url = CheckError(Dart_NewStringFromCString(MAINSCRIPT));
-  Dart_Handle source = LoadSourceFromFile(MAINSCRIPT);
+  Dart_Handle url = CheckError(Dart_NewStringFromCString(main_script_));
+  Dart_Handle source = LoadSourceFromFile(main_script_);
   CheckError(Dart_LoadScript(url, source));
 
   Dart_ExitScope();
@@ -194,13 +211,28 @@
 int VMGlue::CallSetup() {
   if (!initialized_script_) {
     initialized_script_ = true;
-    LOGI("Invoking setup(0,0,%d,%d)", graphics_->width(), graphics_->height());
+    LOGI("Invoking setup(0,0,%d,%d)", surface_->width(), surface_->height());
     Dart_EnterIsolate(isolate_);
     Dart_EnterScope();
     Dart_Handle args[2];
-    args[0] = CheckError(Dart_NewInteger(graphics_->width()));
-    args[1] = CheckError(Dart_NewInteger(graphics_->height()));
+    args[0] = CheckError(Dart_NewInteger(surface_->width()));
+    args[1] = CheckError(Dart_NewInteger(surface_->height()));
     int rtn = Invoke("setup", 2, args);
+
+    if (rtn == 0) {
+      // Plug in the print handler. It would be nice if we could do this
+      // before calling setup, but the call to GetField blows up if we
+      // haven't run anything yet.
+      Dart_Handle library = CheckError(Dart_LookupLibrary(
+          Dart_NewStringFromCString("gl.dart")));
+      Dart_Handle print = CheckError(
+          Dart_GetField(library, Dart_NewStringFromCString("_printClosure")));
+      Dart_Handle corelib = CheckError(Dart_LookupLibrary(
+          Dart_NewStringFromCString("dart:core")));
+      CheckError(Dart_SetField(corelib,
+        Dart_NewStringFromCString("_printClosure"), print));
+    }
+
     Dart_ExitScope();
     Dart_ExitIsolate();
     LOGI("Done setup");
@@ -309,3 +341,4 @@
   isolate_ = NULL;
   initialized_script_ = false;
 }
+
diff --git a/runtime/embedders/android/vm_glue.h b/runtime/embedders/openglui/common/vm_glue.h
similarity index 67%
rename from runtime/embedders/android/vm_glue.h
rename to runtime/embedders/openglui/common/vm_glue.h
index bcabd8c..7efa02e 100644
--- a/runtime/embedders/android/vm_glue.h
+++ b/runtime/embedders/openglui/common/vm_glue.h
@@ -2,25 +2,33 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef EMBEDDERS_ANDROID_VM_GLUE_H_
-#define EMBEDDERS_ANDROID_VM_GLUE_H_
+#ifndef EMBEDDERS_OPENGLUI_COMMON_VM_GLUE_H_
+#define EMBEDDERS_OPENGLUI_COMMON_VM_GLUE_H_
 
-#include <android_native_app_glue.h>
+#include <stdlib.h>
 
+#include "embedders/openglui/common/events.h"
+#include "embedders/openglui/common/isized.h"
 #include "include/dart_api.h"
-#include "embedders/android/graphics.h"
 
 class VMGlue {
  public:
-  explicit VMGlue(Graphics* graphics);
+  explicit VMGlue(ISized* surface,
+                  const char* script_path,
+                  const char* extension_script = NULL,
+                  const char* main_script = NULL);
+  ~VMGlue() {
+    delete[] main_script_;
+    delete[] extension_script_;
+  }
 
   int InitializeVM();
   int StartMainIsolate();
   int CallSetup();
   int CallUpdate();
-  int OnMotionEvent(const char* function, int64_t when,
+  int OnMotionEvent(const char* funtion, int64_t when,
                     float move_x, float move_y);
-  int OnKeyEvent(const char* function, int64_t when, int32_t flags,
+  int OnKeyEvent(const char* funtion, int64_t when, int32_t flags,
              int32_t key_code, int32_t meta_state, int32_t repeat);
   void FinishMainIsolate();
 
@@ -44,10 +52,13 @@
   static Dart_Handle LoadSourceFromFile(const char* url);
   static void ShutdownIsolate(void* callback_data);
 
-  Graphics* graphics_;
+  ISized* surface_;
   Dart_Isolate isolate_;
   bool initialized_vm_;
   bool initialized_script_;
+  char* main_script_;
+  static char* extension_script_;
 };
 
-#endif  // EMBEDDERS_ANDROID_VM_GLUE_H_
+#endif  // EMBEDDERS_OPENGLUI_COMMON_VM_GLUE_H_
+
diff --git a/runtime/embedders/openglui/emulator/emulator_embedder.cc b/runtime/embedders/openglui/emulator/emulator_embedder.cc
new file mode 100644
index 0000000..371de7b
--- /dev/null
+++ b/runtime/embedders/openglui/emulator/emulator_embedder.cc
@@ -0,0 +1,73 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "embedders/openglui/emulator/emulator_embedder.h"
+
+#include <string.h>
+
+#include "embedders/openglui/common/context.h"
+#include "embedders/openglui/common/dart_host.h"
+#include "embedders/openglui/common/events.h"
+#include "embedders/openglui/common/input_handler.h"
+#include "embedders/openglui/common/sound_handler.h"
+#include "embedders/openglui/common/vm_glue.h"
+#include "embedders/openglui/emulator/emulator_graphics_handler.h"
+
+InputHandler* input_handler_ptr;
+LifeCycleHandler* lifecycle_handler_ptr;
+
+void display() {
+    glClearColor(1.0, 1.0, 1.0, 1.0);
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+    lifecycle_handler_ptr->OnStep();
+    glutSwapBuffers();
+}
+
+void reshape(int width, int height) {
+    glViewport(0, 0, width, height);
+    glMatrixMode(GL_PROJECTION);
+    glLoadIdentity();
+    glOrtho(0, width, 0, height, -1, 1);
+    glMatrixMode(GL_MODELVIEW);
+    glutPostRedisplay();
+}
+
+void keyboard(unsigned char key, int x, int y) {
+  input_handler_ptr->OnKeyEvent(kKeyDown, time(0), 0, key, 0, 0);
+  input_handler_ptr->OnKeyEvent(kKeyUp, time(0), 0, key, 0, 0);
+  if (key == 27) {
+      exit(0);
+  }
+}
+
+DART_EXPORT void emulator_main(int argc, char** argv, const char* script) {
+  EmulatorGraphicsHandler graphics_handler(argc, argv);
+  if (argc > 0) {
+    int i = argc - 1;
+    size_t len = strlen(argv[i]);
+    if (len > 5 && strcmp(".dart", argv[i] + len - 5) == 0) {
+      script = argv[i];
+    }
+  }
+  VMGlue vm_glue(&graphics_handler, ".", "gl.dart", script);
+  InputHandler input_handler(&vm_glue);
+  input_handler_ptr = &input_handler;
+  SoundHandler sound_handler;
+  Timer timer;
+  Context app_context;
+  app_context.graphics_handler = &graphics_handler;
+  app_context.input_handler = &input_handler;
+  app_context.sound_handler = &sound_handler;
+  app_context.timer = &timer;
+  app_context.vm_glue = &vm_glue;
+  DartHost host(&app_context);
+  lifecycle_handler_ptr = &host;
+  lifecycle_handler_ptr->OnActivate();
+  glutReshapeFunc(reshape);
+  glutDisplayFunc(display);
+  glutKeyboardFunc(keyboard);
+  glutIdleFunc(display);
+  glutMainLoop();
+}
+
diff --git a/runtime/embedders/openglui/emulator/emulator_embedder.h b/runtime/embedders/openglui/emulator/emulator_embedder.h
new file mode 100644
index 0000000..f0f0638
--- /dev/null
+++ b/runtime/embedders/openglui/emulator/emulator_embedder.h
@@ -0,0 +1,14 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef EMBEDDERS_OPENGLUI_EMULATOR_EMULATOR_EMBEDDER_H_
+#define EMBEDDERS_OPENGLUI_EMULATOR_EMULATOR_EMBEDDER_H_
+
+#include "include/dart_api.h"
+
+DART_EXPORT void emulator_main(int argc, char** argv,
+                               const char* script);
+
+#endif  // EMBEDDERS_OPENGLUI_EMULATOR_EMULATOR_EMBEDDER_H_
+
diff --git a/runtime/embedders/openglui/emulator/emulator_graphics_handler.cc b/runtime/embedders/openglui/emulator/emulator_graphics_handler.cc
new file mode 100644
index 0000000..e1a5ae0
--- /dev/null
+++ b/runtime/embedders/openglui/emulator/emulator_graphics_handler.cc
@@ -0,0 +1,38 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "embedders/openglui/emulator/emulator_graphics_handler.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+EmulatorGraphicsHandler::EmulatorGraphicsHandler(int argc,
+                                                 char** argv)
+  : GLGraphicsHandler() {
+  glutInit(&argc, argv);
+  width_ = 480;
+  height_ = 800;
+  for (int i = 1; i < argc; i++) {
+    if (argv[i][0] == '-') {
+      int next_arg = i + 1;
+      if (next_arg < argc && strcmp(argv[i], "-w") == 0) {
+        width_ = static_cast<size_t>(atoi(argv[i = next_arg]));
+      } else if (next_arg < argc && strcmp(argv[i], "-h") == 0) {
+        height_ = static_cast<size_t>(atoi(argv[i = next_arg]));
+      }
+    }
+  }
+}
+
+int32_t EmulatorGraphicsHandler::Start() {
+  glutInitWindowSize(width_, height_);
+  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
+  glutCreateWindow("Dart");
+  return 0;
+}
+
+void EmulatorGraphicsHandler::Stop() {
+  exit(0);
+}
+
diff --git a/runtime/embedders/openglui/emulator/emulator_graphics_handler.h b/runtime/embedders/openglui/emulator/emulator_graphics_handler.h
new file mode 100644
index 0000000..c7dcdaa
--- /dev/null
+++ b/runtime/embedders/openglui/emulator/emulator_graphics_handler.h
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef EMBEDDERS_OPENGLUI_EMULATOR_EMULATOR_GRAPHICS_HANDLER_H_
+#define EMBEDDERS_OPENGLUI_EMULATOR_EMULATOR_GRAPHICS_HANDLER_H_
+
+#include "embedders/openglui/common/gl_graphics_handler.h"
+
+class EmulatorGraphicsHandler : public GLGraphicsHandler {
+  public:
+    EmulatorGraphicsHandler(int argc, char** argv);
+
+    int32_t Start();
+    void Stop();
+};
+
+#endif  // EMBEDDERS_OPENGLUI_EMULATOR_EMULATOR_GRAPHICS_HANDLER_H_
+
diff --git a/runtime/embedders/openglui/emulator/emulator_resource.h b/runtime/embedders/openglui/emulator/emulator_resource.h
new file mode 100644
index 0000000..bceebd6
--- /dev/null
+++ b/runtime/embedders/openglui/emulator/emulator_resource.h
@@ -0,0 +1,63 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef EMBEDDERS_OPENGLUI_EMULATOR_EMULATOR_RESOURCE_H_
+#define EMBEDDERS_OPENGLUI_EMULATOR_EMULATOR_RESOURCE_H_
+
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "embedders/openglui/common/log.h"
+#include "embedders/openglui/common/resource.h"
+
+class EmulatorResource : public Resource {
+  public:
+    explicit EmulatorResource(const char* path)
+      : base(path),
+        fd_(-1) {
+    }
+
+    int32_t descriptor() {
+      if (fd_ < 0) {
+        Open();
+      }
+      return fd_;
+    }
+
+    off_t length() {
+      if (length_ < 0) {
+        length_ = lseek(fd), 0, SEEK_END);
+        lseek(fd), 0, SEEK_START);
+      }
+      return length_;
+    }
+
+    int32_t Open() {
+      fd_ = open(path_, 0);
+      if (fd_ >= 0) {
+        return 0;
+      }
+      LOGE("Could not open asset %s", path_);
+      return -1;
+    }
+
+    void Close() {
+      if (fd_ >= 0) {
+        close(fd_);
+        fd_ = -1;
+      }
+    }
+
+    int32_t Read(void* buffer, size_t count) {
+      size_t actual = read(asset_, buffer, count);
+      return (actual == count) ? 0 : -1;
+    }
+
+  private:
+    int fd_;
+};
+
+#endif  // EMBEDDERS_OPENGLUI_EMULATOR_EMULATOR_RESOURCE_H_
+
diff --git a/runtime/embedders/openglui/openglui_embedder.gypi b/runtime/embedders/openglui/openglui_embedder.gypi
new file mode 100644
index 0000000..6057f6e
--- /dev/null
+++ b/runtime/embedders/openglui/openglui_embedder.gypi
@@ -0,0 +1,156 @@
+# Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+{
+  'conditions': [
+    ['OS=="android"',
+      {
+        'targets': [
+          {
+            # Dart shared library for Android.
+            'target_name': 'android_embedder',
+            'type': 'shared_library',
+            'dependencies': [
+              'libdart_lib_withcore',
+              'libdart_vm',
+              'libjscre',
+              'libdouble_conversion',
+              'generate_version_cc_file',
+            ],
+            'include_dirs': [
+              '../..',
+              '../../../third_party/android_tools/ndk/sources/android/native_app_glue',
+            ],
+            'defines': [
+              'DART_SHARED_LIB',
+              '__ANDROID__'
+            ],
+            'sources': [
+              '../../include/dart_api.h',
+              '../../include/dart_debugger_api.h',
+              '../../vm/dart_api_impl.cc',
+              '../../vm/debugger_api_impl.cc',
+              '../../vm/version.h',
+              '../../../third_party/android_tools/ndk/sources/android/native_app_glue/android_native_app_glue.h',
+              '../../../third_party/android_tools/ndk/sources/android/native_app_glue/android_native_app_glue.c',
+              'android/android_graphics_handler.cc',
+              'android/android_graphics_handler.h',
+              'android/android_input_handler.h',
+              'android/android_resource.h',
+              'android/android_sound_handler.cc',
+              'android/android_sound_handler.h',
+              'android/eventloop.cc',
+              'android/eventloop.h',
+              'android/log.h',
+              'android/main.cc',
+              'android/support_android.cc',
+              'common/context.h',
+              'common/dart_host.cc',
+              'common/dart_host.h',
+              'common/events.h',
+              'common/extension.cc',
+              'common/extension.h',
+              'common/gl_graphics_handler.cc',
+              'common/gl_graphics_handler.h',
+              'common/graphics_handler.h',
+              'common/input_handler.cc',
+              'common/input_handler.h',
+              'common/isized.h',
+              'common/life_cycle_handler.h',
+              'common/log.h',
+              'common/opengl.h',
+              'common/resource.h',
+              'common/sample.h',
+              'common/sound_handler.cc',
+              'common/sound_handler.h',
+              'common/timer.cc',
+              'common/timer.h',
+              'common/types.h',
+              'common/vm_glue.cc',
+              'common/vm_glue.h',
+              '<(version_cc_file)',
+            ],
+            'link_settings': {
+              'libraries': [ '-llog', '-lc', '-landroid', '-lEGL', '-lGLESv2', '-lOpenSLES', '-landroid' ],
+              'ldflags': [
+                '-z', 'muldefs'
+              ],
+              'ldflags!': [
+                '-Wl,--exclude-libs=ALL',
+              ],
+            },
+          },
+        ],
+      },
+    ],
+    ['OS=="mac" or OS=="linux"',
+      {
+        'targets': [
+          {
+            'target_name': 'emulator_embedder',
+            'type': 'shared_library',
+            'dependencies': [
+              'libdart_lib_withcore',
+              'libdart_vm',
+              'libjscre',
+              'libdouble_conversion',
+              'generate_version_cc_file',
+            ],
+            'include_dirs': [
+              '../..',
+            ],
+            'defines': [
+              'DART_SHARED_LIB'
+            ],
+            'sources': [
+              '../../include/dart_api.h',
+              '../../include/dart_debugger_api.h',
+              '../../vm/dart_api_impl.cc',
+              '../../vm/debugger_api_impl.cc',
+              '../../vm/version.h',
+              'common/context.h',
+              'common/dart_host.cc',
+              'common/dart_host.h',
+              'common/events.h',
+              'common/extension.cc',
+              'common/extension.h',
+              'common/gl_graphics_handler.cc',
+              'common/gl_graphics_handler.h',
+              'common/graphics_handler.h',
+              'common/input_handler.cc',
+              'common/input_handler.h',
+              'common/isized.h',
+              'common/life_cycle_handler.h',
+              'common/log.h',
+              'common/opengl.h',
+              'common/resource.h',
+              'common/sample.h',
+              'common/sound_handler.cc',
+              'common/sound_handler.h',
+              'common/timer.cc',
+              'common/timer.h',
+              'common/types.h',
+              'common/vm_glue.cc',
+              'common/vm_glue.h',
+              'emulator/emulator_embedder.cc',
+              'emulator/emulator_embedder.h',
+              'emulator/emulator_graphics_handler.cc',
+              'emulator/emulator_graphics_handler.h',
+              'emulator/emulator_resource.h',
+              '<(version_cc_file)',
+            ],
+            'conditions': [
+              ['OS=="mac"', {
+                'xcode_settings' : {
+                  'OTHER_LDFLAGS': [ '-framework OpenGL', '-framework GLUT', '-L /usr/X11/lib' ]
+                },
+              }],
+            ]
+          },
+        ],
+      },
+    ],
+  ],
+}
+
diff --git a/runtime/lib/array.dart b/runtime/lib/array.dart
index f5e8ec3..d7fac3a 100644
--- a/runtime/lib/array.dart
+++ b/runtime/lib/array.dart
@@ -29,6 +29,31 @@
         "Cannot remove element of a non-extendable array");
   }
 
+  void remove(Object element) {
+    throw new UnsupportedError(
+        "Cannot remove element of a non-extendable array");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError(
+        "Cannot remove element of a non-extendable array");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError(
+        "Cannot remove element of a non-extendable array");
+  }
+
+  void removeMatching(bool test(E element)) {
+    throw new UnsupportedError(
+        "Cannot remove element of a non-extendable array");
+  }
+
+  void retainMatching(bool test(E element)) {
+    throw new UnsupportedError(
+        "Cannot remove element of a non-extendable array");
+  }
+
   void setRange(int start, int length, List<E> from, [int startFrom = 0]) {
     if (length < 0) {
       throw new ArgumentError("negative length $length");
@@ -62,63 +87,63 @@
   // Collection interface.
 
   bool contains(E element) {
-    return Collections.contains(this, element);
+    return IterableMixinWorkaround.contains(this, element);
   }
 
   void forEach(f(E element)) {
-    Collections.forEach(this, f);
+    IterableMixinWorkaround.forEach(this, f);
   }
 
   String join([String separator]) {
-    return Collections.join(this, separator);
+    return IterableMixinWorkaround.joinList(this, separator);
   }
 
   List mappedBy(f(E element)) {
-    return new MappedList<E, dynamic>(this, f);
+    return IterableMixinWorkaround.mappedByList(this, f);
   }
 
   reduce(initialValue, combine(previousValue, E element)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
   Iterable<E> where(bool f(E element)) {
-    return new WhereIterable<E>(this, f);
+    return IterableMixinWorkaround.where(this, f);
   }
 
   List<E> take(int n) {
-    return new ListView<E>(this, 0, n);
+    return IterableMixinWorkaround.takeList(this, n);
   }
 
   Iterable<E> takeWhile(bool test(E value)) {
-    return new TakeWhileIterable<E>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
   List<E> skip(int n) {
-    return new ListView<E>(this, n, null);
+    return IterableMixinWorkaround.skipList(this, n);
   }
 
   Iterable<E> skipWhile(bool test(E value)) {
-    return new SkipWhileIterable<E>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   bool every(bool f(E element)) {
-    return Collections.every(this, f);
+    return IterableMixinWorkaround.every(this, f);
   }
 
   bool any(bool f(E element)) {
-    return Collections.any(this, f);
+    return IterableMixinWorkaround.any(this, f);
   }
 
   E firstMatching(bool test(E value), {E orElse()}) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   E lastMatching(bool test(E value), {E orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   E singleMatching(bool test(E value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   E elementAt(int index) {
@@ -130,8 +155,7 @@
   }
 
   void sort([int compare(E a, E b)]) {
-    if (compare == null) compare = Comparable.compare;
-    _Sort.sort(this, compare);
+    IterableMixinWorkaround.sortList(this, compare);
   }
 
   int indexOf(E element, [int start = 0]) {
@@ -192,9 +216,9 @@
     throw new StateError("More than one element");
   }
 
-  E min([int compare(E a, E b)]) => Collections.min(this, compare);
+  E min([int compare(E a, E b)]) => IterableMixinWorkaround.min(this, compare);
 
-  E max([int compare(E a, E b)]) => Collections.max(this, compare);
+  E max([int compare(E a, E b)]) => IterableMixinWorkaround.max(this, compare);
 
   List<E> toList() {
     return new List<E>.from(this);
@@ -234,6 +258,31 @@
         "Cannot modify an immutable array");
   }
 
+  void remove(Object element) {
+    throw new UnsupportedError(
+        "Cannot modify an immutable array");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError(
+        "Cannot modify an immutable array");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError(
+        "Cannot modify an immutable array");
+  }
+
+  void removeMatching(bool test(E element)) {
+    throw new UnsupportedError(
+        "Cannot modify an immutable array");
+  }
+
+  void retainMatching(bool test(E element)) {
+    throw new UnsupportedError(
+        "Cannot modify an immutable array");
+  }
+
   void copyFrom(List src, int srcStart, int dstStart, int count) {
     throw new UnsupportedError(
         "Cannot modify an immutable array");
@@ -266,63 +315,63 @@
   // Collection interface.
 
   bool contains(E element) {
-    return Collections.contains(this, element);
+    return IterableMixinWorkaround.contains(this, element);
   }
 
   void forEach(f(E element)) {
-    Collections.forEach(this, f);
+    IterableMixinWorkaround.forEach(this, f);
   }
 
   List mappedBy(f(E element)) {
-    return new MappedList<E, dynamic>(this, f);
+    return IterableMixinWorkaround.mappedByList(this, f);
   }
 
   String join([String separator]) {
-    return Collections.join(this, separator);
+    return IterableMixinWorkaround.joinList(this, separator);
   }
 
   reduce(initialValue, combine(previousValue, E element)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
   Iterable<E> where(bool f(E element)) {
-    return new WhereIterable<E>(this, f);
+    return IterableMixinWorkaround.where(this, f);
   }
 
   List<E> take(int n) {
-    return new ListView<E>(this, 0, n);
+    return IterableMixinWorkaround.takeList(this, n);
   }
 
   Iterable<E> takeWhile(bool test(E value)) {
-    return new TakeWhileIterable<E>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
   List<E> skip(int n) {
-    return new ListView<E>(this, n, null);
+    return IterableMixinWorkaround.skipList(this, n);
   }
 
   Iterable<E> skipWhile(bool test(E value)) {
-    return new SkipWhileIterable<E>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   bool every(bool f(E element)) {
-    return Collections.every(this, f);
+    return IterableMixinWorkaround.every(this, f);
   }
 
   bool any(bool f(E element)) {
-    return Collections.any(this, f);
+    return IterableMixinWorkaround.any(this, f);
   }
 
   E firstMatching(bool test(E value), {E orElse()}) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   E lastMatching(bool test(E value), {E orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   E singleMatching(bool test(E value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   E elementAt(int index) {
@@ -400,9 +449,9 @@
     throw new StateError("More than one element");
   }
 
-  E min([int compare(E a, E b)]) => Collections.min(this, compare);
+  E min([int compare(E a, E b)]) => IterableMixinWorkaround.min(this, compare);
 
-  E max([int compare(E a, E b)]) => Collections.max(this, compare);
+  E max([int compare(E a, E b)]) => IterableMixinWorkaround.max(this, compare);
 
   List<E> toList() {
     return new List<E>.from(this);
diff --git a/runtime/lib/byte_array.cc b/runtime/lib/byte_array.cc
index 553d63c..f34c56b 100644
--- a/runtime/lib/byte_array.cc
+++ b/runtime/lib/byte_array.cc
@@ -119,7 +119,7 @@
 #define INTEGER_TO_UINT64(integer, uint64)                                     \
   if (integer.IsBigint()) {                                                    \
     Bigint& bigint = Bigint::Handle();                                         \
-    bigint ^= integer.raw();                                                   \
+    bigint |= integer.raw();                                                   \
     ASSERT(BigintOperations::FitsIntoUint64(bigint));                          \
     value = BigintOperations::AbsToUint64(bigint);                             \
   } else {                                                                     \
diff --git a/runtime/lib/byte_array.dart b/runtime/lib/byte_array.dart
index 6af5f2f..941d818 100644
--- a/runtime/lib/byte_array.dart
+++ b/runtime/lib/byte_array.dart
@@ -187,7 +187,7 @@
 
   // Methods implementing the Collection interface.
 
-  bool contains(element) => Collections.contains(this, element);
+  bool contains(element) => IterableMixinWorkaround.contains(this, element);
 
   void forEach(void f(element)) {
     var len = this.length;
@@ -197,56 +197,56 @@
   }
 
   List mappedBy(f(int element)) {
-    return new MappedList<int, dynamic>(this, f);
+    return IterableMixinWorkaround.mappedByList(this, f);
   }
 
   String join([String separator]) {
-    return Collections.join(this, separator);
+    return IterableMixinWorkaround.join(this, separator);
   }
 
   dynamic reduce(dynamic initialValue,
                  dynamic combine(dynamic initialValue, element)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
   Collection where(bool f(element)) {
-    return new WhereIterable<int>(this, f);
+    return IterableMixinWorkaround.where(this, f);
   }
 
   List<int> take(int n) {
-    return new ListView<int>(this, 0, n);
+    return IterableMixinWorkaround.takeList(this, n);
   }
 
   Iterable<int> takeWhile(bool test(int value)) {
-    return new TakeWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
   List<int> skip(int n) {
-    return new ListView<int>(this, n, null);
+    return IterableMixinWorkaround.skipList(this, n);
   }
 
   Iterable<int> skipWhile(bool test(int value)) {
-    return new SkipWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   bool every(bool f(element)) {
-    return Collections.every(this, f);
+    return IterableMixinWorkaround.every(this, f);
   }
 
   bool any(bool f(element)) {
-    return Collections.any(this, f);
+    return IterableMixinWorkaround.any(this, f);
   }
 
   int firstMatching(bool test(int value), {int orElse()}) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   int lastMatching(bool test(int value), {int orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   int singleMatching(bool test(int value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   int elementAt(int index) {
@@ -284,8 +284,7 @@
   }
 
   void sort([int compare(var a, var b)]) {
-    if (compare == null) compare = Comparable.compare;
-    coreSort(this, compare);
+    return IterableMixinWorkaround.sortList(this, compare);
   }
 
   int indexOf(element, [int start = 0]) {
@@ -307,6 +306,31 @@
         "Cannot remove from a non-extendable array");
   }
 
+  void remove(Object element) {
+    throw new UnsupportedError(
+        "Cannot remove from a non-extendable array");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError(
+        "Cannot remove from a non-extendable array");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError(
+        "Cannot remove from a non-extendable array");
+  }
+
+  void removeMatching(bool test(int element)) {
+    throw new UnsupportedError(
+        "Cannot remove from a non-extendable array");
+  }
+
+  void retainMatching(bool test(int element)) {
+    throw new UnsupportedError(
+        "Cannot remove from a non-extendable array");
+  }
+
   int get first {
     if (length > 0) return this[0];
     throw new StateError("No elements");
@@ -323,9 +347,9 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) => Collections.min(this, compare);
+  int min([int compare(int a, int b)]) => IterableMixinWorkaround.min(this, compare);
 
-  int max([int compare(int a, int b)]) => Collections.max(this, compare);
+  int max([int compare(int a, int b)]) => IterableMixinWorkaround.max(this, compare);
 
   void removeRange(int start, int length) {
     throw new UnsupportedError(
@@ -1963,8 +1987,7 @@
   }
 
   void sort([int compare(var a, var b)]) {
-    if (compare == null) compare = Comparable.compare;
-    coreSort(this, compare);
+    return IterableMixinWorkaround.sortList(this, compare);
   }
 
   int indexOf(element, [int start = 0]) {
@@ -1986,6 +2009,36 @@
         "Cannot remove from a non-extendable array");
   }
 
+  int removeAt(int index) {
+    throw new UnsupportedError(
+        "Cannot remove from a non-extendable array");
+  }
+
+  void remove(Object element) {
+    throw new UnsupportedError(
+        "Cannot remove from a non-extendable array");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError(
+        "Cannot remove from a non-extendable array");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError(
+        "Cannot remove from a non-extendable array");
+  }
+
+  void removeMatching(bool test(int element)) {
+    throw new UnsupportedError(
+        "Cannot remove from a non-extendable array");
+  }
+
+  void retainMatching(bool test(int element)) {
+    throw new UnsupportedError(
+        "Cannot remove from a non-extendable array");
+  }
+
   int get first {
     if (length > 0) return this[0];
     throw new StateError("No elements");
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index 0b384a8..ce650cc 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.dart
@@ -21,6 +21,21 @@
     return result;
   }
 
+  void remove(Object element) {
+    for (int i = 0; i < this.length; i++) {
+      if (this[i] == element) {
+        int newLength = this.length - 1;
+        Arrays.copy(this,
+                    index + 1,
+                    this,
+                    index,
+                    newLength - index);
+        this.length = newLength;
+        return;
+      }
+    }
+  }
+
   void setRange(int start, int length, List<T> from, [int startFrom = 0]) {
     if (length < 0) {
       throw new ArgumentError("negative length $length");
@@ -163,9 +178,9 @@
     throw new StateError("More than one element");
   }
 
-  T min([int compare(T a, T b)]) => Collections.min(this, compare);
+  T min([int compare(T a, T b)]) => IterableMixinWorkaround.min(this, compare);
 
-  T max([int compare(T a, T b)]) => Collections.max(this, compare);
+  T max([int compare(T a, T b)]) => IterableMixinWorkaround.max(this, compare);
 
   int indexOf(T element, [int start = 0]) {
     return Arrays.indexOf(this, element, start, length);
@@ -187,11 +202,11 @@
   // Collection interface.
 
   bool contains(T element) {
-    return Collections.contains(this, element);
+    return IterableMixinWorkaround.contains(this, element);
   }
 
   void forEach(f(T element)) {
-    // TODO(srdjan): Use Collections.forEach(this, f);
+    // TODO(srdjan): Use IterableMixinWorkaround.forEach(this, f);
     // Accessing the list directly improves DeltaBlue performance by 25%.
     for (int i = 0; i < length; i++) {
       f(this[i]);
@@ -217,51 +232,51 @@
   }
 
   List mappedBy(f(T element)) {
-    return new MappedList<T, dynamic>(this, f);
+    return IterableMixinWorkaround.mappedByList(this, f);
   }
 
   reduce(initialValue, combine(previousValue, T element)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
   Iterable<T> where(bool f(T element)) {
-    return new WhereIterable<T>(this, f);
+    return IterableMixinWorkaround.where(this, f);
   }
 
   List<T> take(int n) {
-    return new ListView<T>(this, 0, n);
+    return IterableMixinWorkaround.takeList(this, n);
   }
 
   Iterable<T> takeWhile(bool test(T value)) {
-    return new TakeWhileIterable<T>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
   List<T> skip(int n) {
-    return new ListView<T>(this, n, null);
+    return IterableMixinWorkaround.skipList(this, n);
   }
 
   Iterable<T> skipWhile(bool test(T value)) {
-    return new SkipWhileIterable<T>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   bool every(bool f(T element)) {
-    return Collections.every(this, f);
+    return IterableMixinWorkaround.every(this, f);
   }
 
   bool any(bool f(T element)) {
-    return Collections.any(this, f);
+    return IterableMixinWorkaround.any(this, f);
   }
 
   T firstMatching(bool test(T value), {T orElse()}) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   T lastMatching(bool test(T value), {T orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   T singleMatching(bool test(T value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   T elementAt(int index) {
@@ -277,8 +292,7 @@
   }
 
   void sort([int compare(T a, T b)]) {
-    if (compare == null) compare = Comparable.compare;
-    _Sort.sort(this, compare);
+    IterableMixinWorkaround.sortList(this, compare);
   }
 
   String toString() {
diff --git a/runtime/lib/integers.cc b/runtime/lib/integers.cc
index 5a8fd2e..87fdff4 100644
--- a/runtime/lib/integers.cc
+++ b/runtime/lib/integers.cc
@@ -23,13 +23,13 @@
 static bool CheckInteger(const Integer& i) {
   if (i.IsBigint()) {
     Bigint& bigint = Bigint::Handle();
-    bigint ^= i.raw();
+    bigint |= i.raw();
     return !BigintOperations::FitsIntoSmi(bigint) &&
         !BigintOperations::FitsIntoMint(bigint);
   }
   if (i.IsMint()) {
     Mint& mint = Mint::Handle();
-    mint ^= i.raw();
+    mint |= i.raw();
     return !Smi::IsValid64(mint.value());
   }
   return true;
@@ -218,7 +218,7 @@
   }
   if (value.IsSmi()) {
     Smi& smi_value = Smi::Handle();
-    smi_value ^= value.raw();
+    smi_value |= value.raw();
     return smi_value.ShiftOp(kind, amount);
   }
   Bigint& big_value = Bigint::Handle();
@@ -240,7 +240,7 @@
     }
   } else {
     ASSERT(value.IsBigint());
-    big_value ^= value.raw();
+    big_value |= value.raw();
   }
   switch (kind) {
     case Token::kSHL:
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index d65246b..ede0fc3 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -45,7 +45,7 @@
 static void StoreError(Isolate* isolate, const Object& obj) {
   ASSERT(obj.IsError());
   Error& error = Error::Handle();
-  error ^= obj.raw();
+  error |= obj.raw();
   isolate->object_store()->set_sticky_error(error);
 }
 
@@ -62,12 +62,15 @@
     ASSERT(!isolate_lib.IsNull());
     const String& class_name =
         String::Handle(isolate_lib.PrivateName(Symbols::_ReceivePortImpl()));
+    const String& function_name =
+        String::Handle(isolate_lib.PrivateName(Symbols::_get_or_create()));
     func = Resolver::ResolveStatic(isolate_lib,
                                    class_name,
-                                   Symbols::_get_or_create(),
+                                   function_name,
                                    kNumArguments,
                                    Object::empty_array(),
                                    Resolver::kIsQualified);
+    ASSERT(!func.IsNull());
     isolate->object_store()->set_receive_port_create_function(func);
   }
   const Array& args = Array::Handle(isolate, Array::New(kNumArguments));
@@ -189,7 +192,7 @@
     return false;
   } else if (obj.IsString()) {
     String& string_obj = String::Handle();
-    string_obj ^= obj.raw();
+    string_obj |= obj.raw();
     *canonical_uri = zone->MakeCopyOfString(string_obj.ToCString());
     return true;
   } else {
@@ -374,7 +377,7 @@
     }
     ASSERT(result.IsFunction());
     Function& func = Function::Handle(isolate);
-    func ^= result.raw();
+    func |= result.raw();
     result = DartEntry::InvokeStatic(func, Object::empty_array());
     if (result.IsError()) {
       StoreError(isolate, result);
@@ -419,7 +422,7 @@
   bool throw_exception = false;
   Function& func = Function::Handle();
   if (closure.IsClosure()) {
-    func ^= Closure::function(closure);
+    func |= Closure::function(closure);
     const Class& cls = Class::Handle(func.Owner());
     if (!func.IsClosureFunction() || !func.is_static() || !cls.IsTopLevel()) {
       throw_exception = true;
@@ -437,7 +440,7 @@
   GET_NATIVE_ARGUMENT(Instance, callback, arguments->NativeArgAt(1));
   Function& callback_func = Function::Handle();
   if (callback.IsClosure()) {
-    callback_func ^= Closure::function(callback);
+    callback_func |= Closure::function(callback);
     const Class& cls = Class::Handle(callback_func.Owner());
     if (!callback_func.IsClosureFunction() || !callback_func.is_static() ||
         !cls.IsTopLevel()) {
diff --git a/runtime/lib/string.cc b/runtime/lib/string.cc
index c636a8b..54d1017 100644
--- a/runtime/lib/string.cc
+++ b/runtime/lib/string.cc
@@ -124,7 +124,7 @@
 static int32_t StringValueAt(const String& str, const Integer& index) {
   if (index.IsSmi()) {
     Smi& smi = Smi::Handle();
-    smi ^= index.raw();
+    smi |= index.raw();
     int32_t index = smi.Value();
     if ((index < 0) || (index >= str.Length())) {
       const Array& args = Array::Handle(Array::New(1));
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index 99e07c3..0e352c6 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -85,15 +85,21 @@
 #elif defined(__ARMEL__)
 #define HOST_ARCH_ARM 1
 #define ARCH_IS_32_BIT 1
+#elif defined(__MIPSEL__)
+#define HOST_ARCH_MIPS 1
+#define ARCH_IS_32_BIT 1
 #else
 #error Architecture was not detected as supported by Dart.
 #endif
 
+#if !defined(TARGET_ARCH_MIPS)
 #if !defined(TARGET_ARCH_ARM)
 #if !defined(TARGET_ARCH_X64)
 #if !defined(TARGET_ARCH_IA32)
 // No target architecture specified pick the one matching the host architecture.
-#if defined(HOST_ARCH_ARM)
+#if defined(HOST_ARCH_MIPS)
+#define TARGET_ARCH_MIPS 1
+#elif defined(HOST_ARCH_ARM)
 #define TARGET_ARCH_ARM 1
 #elif defined(HOST_ARCH_X64)
 #define TARGET_ARCH_X64 1
@@ -105,6 +111,7 @@
 #endif
 #endif
 #endif
+#endif
 
 // Verify that host and target architectures match, we cannot
 // have a 64 bit Dart VM generating 32 bit code or vice-versa.
@@ -112,7 +119,9 @@
 #if !defined(ARCH_IS_64_BIT)
 #error Mismatched Host/Target architectures.
 #endif
-#elif defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM)
+#elif defined(TARGET_ARCH_IA32) ||                                             \
+      defined(TARGET_ARCH_ARM) ||                                              \
+      defined(TARGET_ARCH_MIPS)
 #if !defined(ARCH_IS_32_BIT)
 #error Mismatched Host/Target architectures.
 #endif
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index aac342b..2444f50 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -33,6 +33,10 @@
 dart/byte_array_test: Skip # compilers not aware of byte arrays
 dart/isolate_unhandled*: Skip
 
+[ $compiler == dart2js && $minified ]
+# Methods in stack traces are renamed.
+dart/inline_stack_frame_test: Fail # Issue 7953.
+
 [ $runtime == ff || $runtime == ie9 ]
 dart/inline_stack_frame_test: Skip
 
diff --git a/runtime/vm/allocation.h b/runtime/vm/allocation.h
index 86d825c..99a00b5 100644
--- a/runtime/vm/allocation.h
+++ b/runtime/vm/allocation.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -25,8 +25,7 @@
 
  private:
   DISALLOW_ALLOCATION();
-  // TODO(5411081): Add DISALLOW_COPY_AND_ASSIGN(ValueObject) once the mac
-  // build issue is resolved.
+  DISALLOW_COPY_AND_ASSIGN(ValueObject);
 };
 
 
diff --git a/runtime/vm/assembler.h b/runtime/vm/assembler.h
index 581133a..1d24788 100644
--- a/runtime/vm/assembler.h
+++ b/runtime/vm/assembler.h
@@ -200,6 +200,8 @@
 #include "vm/assembler_x64.h"
 #elif defined(TARGET_ARCH_ARM)
 #include "vm/assembler_arm.h"
+#elif defined(TARGET_ARCH_MIPS)
+#include "vm/assembler_mips.h"
 #else
 #error Unknown architecture.
 #endif
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
new file mode 100644
index 0000000..4a64fc3
--- /dev/null
+++ b/runtime/vm/assembler_arm.cc
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_ARM)
+
+#include "vm/assembler.h"
+
+namespace dart {
+
+DEFINE_FLAG(bool, print_stop_message, true, "Print stop message.");
+DEFINE_FLAG(bool, code_comments, false,
+            "Include comments into code and disassembly");
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_ARM
+
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index 6e2e4c7..0661a8a 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -14,6 +14,51 @@
 
 namespace dart {
 
+class Operand : public ValueObject {
+ public:
+  Operand(const Operand& other) : ValueObject() {
+    UNIMPLEMENTED();
+  }
+
+  Operand& operator=(const Operand& other) {
+    UNIMPLEMENTED();
+    return *this;
+  }
+
+ protected:
+  Operand() { }  // Needed by subclass Address.
+};
+
+
+class Address : public Operand {
+ public:
+  Address(Register base, int32_t disp) {
+    UNIMPLEMENTED();
+  }
+
+  Address(const Address& other) : Operand(other) { }
+
+  Address& operator=(const Address& other) {
+    Operand::operator=(other);
+    return *this;
+  }
+};
+
+
+class FieldAddress : public Address {
+ public:
+  FieldAddress(Register base, int32_t disp)
+      : Address(base, disp - kHeapObjectTag) { }
+
+  FieldAddress(const FieldAddress& other) : Address(other) { }
+
+  FieldAddress& operator=(const FieldAddress& other) {
+    Address::operator=(other);
+    return *this;
+  }
+};
+
+
 class Label : public ValueObject {
  public:
   Label() : position_(0) { }
@@ -58,13 +103,26 @@
 };
 
 
-class Assembler {
+class CPUFeatures : public AllStatic {
  public:
-  Assembler() { }
+  static void InitOnce() { }
+  static bool double_truncate_round_supported() {
+    UNIMPLEMENTED();
+    return false;
+  }
+};
+
+
+class Assembler : public ValueObject {
+ public:
+  Assembler() { UNIMPLEMENTED(); }
   ~Assembler() { }
 
-  // Macros for High-level operations.
-  void AddConstant(Register reg, int value, Condition cond = AL) {
+  void PopRegister(Register r) {
+    UNIMPLEMENTED();
+  }
+
+  void Bind(Label* label) {
     UNIMPLEMENTED();
   }
 
@@ -95,6 +153,25 @@
     UNIMPLEMENTED();
   }
 
+  void Comment(const char* format, ...) PRINTF_ATTRIBUTE(2, 3) {
+    UNIMPLEMENTED();
+  }
+
+  const Code::Comments& GetCodeComments() const {
+    UNIMPLEMENTED();
+    return Code::Comments::New(0);
+  }
+
+  static const char* RegisterName(Register reg) {
+    UNIMPLEMENTED();
+    return NULL;
+  }
+
+  static const char* FpuRegisterName(FpuRegister reg) {
+    UNIMPLEMENTED();
+    return NULL;
+  }
+
  private:
   ZoneGrowableArray<int>* pointer_offsets_;
   DISALLOW_ALLOCATION();
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index a75941a..271d43c 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -2095,7 +2095,7 @@
 };
 
 
-const char* Assembler::XmmRegisterName(XmmRegister reg) {
+const char* Assembler::FpuRegisterName(FpuRegister reg) {
   ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters));
   return xmm_reg_names[reg];
 }
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index e377e70..5c0c1cb 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -22,6 +22,8 @@
  public:
   explicit Immediate(int32_t value) : value_(value) { }
 
+  Immediate(const Immediate& other) : ValueObject(), value_(other.value_) { }
+
   int32_t value() const { return value_; }
 
   bool is_int8() const { return Utils::IsInt(8, value_); }
@@ -33,6 +35,7 @@
 
   // TODO(5411081): Add DISALLOW_COPY_AND_ASSIGN(Immediate) once the mac
   // build issue is resolved.
+  // And remove the unnecessary copy constructor.
 };
 
 
@@ -68,14 +71,18 @@
     return bit_copy<int32_t>(encoding_[length_ - 4]);
   }
 
-  bool IsRegister(Register reg) const {
-    return ((encoding_[0] & 0xF8) == 0xC0)  // Addressing mode is register only.
-        && ((encoding_[0] & 0x07) == reg);  // Register codes match.
+  Operand(const Operand& other) : ValueObject(), length_(other.length_) {
+    memmove(&encoding_[0], &other.encoding_[0], other.length_);
+  }
+
+  Operand& operator=(const Operand& other) {
+    length_ = other.length_;
+    memmove(&encoding_[0], &other.encoding_[0], other.length_);
+    return *this;
   }
 
  protected:
-  // Operand can be sub classed (e.g: Address).
-  Operand() : length_(0) { }
+  Operand() : length_(0) { }  // Needed by subclass Address.
 
   void SetModRM(int mod, Register rm) {
     ASSERT((mod & ~3) == 0);
@@ -115,10 +122,14 @@
     return encoding_[index];
   }
 
-  friend class Assembler;
+  // Returns whether or not this operand is really the given register in
+  // disguise. Used from the assembler to generate better encodings.
+  bool IsRegister(Register reg) const {
+    return ((encoding_[0] & 0xF8) == 0xC0)  // Addressing mode is register only.
+        && ((encoding_[0] & 0x07) == reg);  // Register codes match.
+  }
 
-  // TODO(5411081): Add DISALLOW_COPY_AND_ASSIGN(Operand) once the mac
-  // build issue is resolved.
+  friend class Assembler;
 };
 
 
@@ -162,6 +173,13 @@
     }
   }
 
+  Address(const Address& other) : Operand(other) { }
+
+  Address& operator=(const Address& other) {
+    Operand::operator=(other);
+    return *this;
+  }
+
   static Address Absolute(const uword addr) {
     Address result;
     result.SetModRM(0, EBP);
@@ -170,19 +188,24 @@
   }
 
  private:
-  Address() {}
-
-  // TODO(5411081): Add DISALLOW_COPY_AND_ASSIGN(Address) once the mac
-  // build issue is resolved.
+  Address() { }  // Needed by Address::Absolute.
 };
 
 
 class FieldAddress : public Address {
  public:
   FieldAddress(Register base, int32_t disp)
-      : Address(base, disp - kHeapObjectTag) {}
+      : Address(base, disp - kHeapObjectTag) { }
+
   FieldAddress(Register base, Register index, ScaleFactor scale, int32_t disp)
-      : Address(base, index, scale, disp - kHeapObjectTag) {}
+      : Address(base, index, scale, disp - kHeapObjectTag) { }
+
+  FieldAddress(const FieldAddress& other) : Address(other) { }
+
+  FieldAddress& operator=(const FieldAddress& other) {
+    Address::operator=(other);
+    return *this;
+  }
 };
 
 
@@ -260,6 +283,7 @@
   static void InitOnce();
   static bool sse2_supported();
   static bool sse4_1_supported();
+  static bool double_truncate_round_supported() { return sse4_1_supported(); }
 
  private:
   static const uint64_t kSSE2BitMask = static_cast<uint64_t>(1) << 26;
@@ -636,7 +660,7 @@
   const Code::Comments& GetCodeComments() const;
 
   static const char* RegisterName(Register reg);
-  static const char* XmmRegisterName(XmmRegister reg);
+  static const char* FpuRegisterName(FpuRegister reg);
 
  private:
   AssemblerBuffer buffer_;
diff --git a/runtime/vm/assembler_macros.h b/runtime/vm/assembler_macros.h
index 5f6a3c5..a4a4e31 100644
--- a/runtime/vm/assembler_macros.h
+++ b/runtime/vm/assembler_macros.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -10,7 +10,9 @@
 #elif defined(TARGET_ARCH_X64)
 #include "vm/assembler_macros_x64.h"
 #elif defined(TARGET_ARCH_ARM)
-// Not yet implemented.
+#include "vm/assembler_macros_arm.h"
+#elif defined(TARGET_ARCH_MIPS)
+#include "vm/assembler_macros_mips.h"
 #else
 #error Unknown architecture.
 #endif
diff --git a/runtime/vm/assembler_macros_arm.cc b/runtime/vm/assembler_macros_arm.cc
new file mode 100644
index 0000000..f2266c2
--- /dev/null
+++ b/runtime/vm/assembler_macros_arm.cc
@@ -0,0 +1,34 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_ARM)
+
+#include "vm/assembler_macros.h"
+
+namespace dart {
+
+void AssemblerMacros::TryAllocate(Assembler* assembler,
+                                  const Class& cls,
+                                  Label* failure,
+                                  bool near_jump,
+                                  Register instance_reg) {
+  UNIMPLEMENTED();
+}
+
+
+void AssemblerMacros::EnterDartFrame(Assembler* assembler,
+                                     intptr_t frame_size) {
+  UNIMPLEMENTED();
+}
+
+
+void AssemblerMacros::EnterStubFrame(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_ARM
+
diff --git a/runtime/vm/assembler_macros_arm.h b/runtime/vm/assembler_macros_arm.h
new file mode 100644
index 0000000..5bf1427
--- /dev/null
+++ b/runtime/vm/assembler_macros_arm.h
@@ -0,0 +1,54 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// The class 'AssemblerMacros' contains assembler instruction groups that
+// are used in Dart.
+
+#ifndef VM_ASSEMBLER_MACROS_ARM_H_
+#define VM_ASSEMBLER_MACROS_ARM_H_
+
+#ifndef VM_ASSEMBLER_MACROS_H_
+#error Do not include assembler_macros_arm.h directly; use assembler_macros.h.
+#endif
+
+#include "vm/allocation.h"
+#include "vm/constants_arm.h"
+
+namespace dart {
+
+// Forward declarations.
+class Assembler;
+class Class;
+class Label;
+
+class AssemblerMacros : public AllStatic {
+ public:
+  // Inlined allocation of an instance of class 'cls', code has no runtime
+  // calls. Jump to 'failure' if the instance cannot be allocated here.
+  // Allocated instance is returned in 'instance_reg'.
+  // Only the tags field of the object is initialized.
+  static void TryAllocate(Assembler* assembler,
+                          const Class& cls,
+                          Label* failure,
+                          bool near_jump,
+                          Register instance_reg);
+
+  // Set up a dart frame on entry with a frame pointer and PC information to
+  // enable easy access to the RawInstruction object of code corresponding
+  // to this frame.
+  static void EnterDartFrame(Assembler* assembler, intptr_t frame_size);
+
+  // Set up a stub frame so that the stack traversal code can easily identify
+  // a stub frame.
+  static void EnterStubFrame(Assembler* assembler);
+
+  // Instruction pattern from entrypoint is used in dart frame prologs
+  // to set up the frame and save a PC which can be used to figure out the
+  // RawInstruction object corresponding to the code running in the frame.
+  static const intptr_t kOffsetOfSavedPCfromEntrypoint = -1;  // UNIMPLEMENTED.
+};
+
+}  // namespace dart.
+
+#endif  // VM_ASSEMBLER_MACROS_ARM_H_
+
diff --git a/runtime/vm/assembler_macros_mips.cc b/runtime/vm/assembler_macros_mips.cc
new file mode 100644
index 0000000..3910345
--- /dev/null
+++ b/runtime/vm/assembler_macros_mips.cc
@@ -0,0 +1,34 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_MIPS)
+
+#include "vm/assembler_macros.h"
+
+namespace dart {
+
+void AssemblerMacros::TryAllocate(Assembler* assembler,
+                                  const Class& cls,
+                                  Label* failure,
+                                  bool near_jump,
+                                  Register instance_reg) {
+  UNIMPLEMENTED();
+}
+
+
+void AssemblerMacros::EnterDartFrame(Assembler* assembler,
+                                     intptr_t frame_size) {
+  UNIMPLEMENTED();
+}
+
+
+void AssemblerMacros::EnterStubFrame(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_MIPS
+
diff --git a/runtime/vm/assembler_macros_mips.h b/runtime/vm/assembler_macros_mips.h
new file mode 100644
index 0000000..cf4ff44
--- /dev/null
+++ b/runtime/vm/assembler_macros_mips.h
@@ -0,0 +1,54 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// The class 'AssemblerMacros' contains assembler instruction groups that
+// are used in Dart.
+
+#ifndef VM_ASSEMBLER_MACROS_MIPS_H_
+#define VM_ASSEMBLER_MACROS_MIPS_H_
+
+#ifndef VM_ASSEMBLER_MACROS_H_
+#error Do not include assembler_macros_mips.h directly; use assembler_macros.h.
+#endif
+
+#include "vm/allocation.h"
+#include "vm/constants_mips.h"
+
+namespace dart {
+
+// Forward declarations.
+class Assembler;
+class Class;
+class Label;
+
+class AssemblerMacros : public AllStatic {
+ public:
+  // Inlined allocation of an instance of class 'cls', code has no runtime
+  // calls. Jump to 'failure' if the instance cannot be allocated here.
+  // Allocated instance is returned in 'instance_reg'.
+  // Only the tags field of the object is initialized.
+  static void TryAllocate(Assembler* assembler,
+                          const Class& cls,
+                          Label* failure,
+                          bool near_jump,
+                          Register instance_reg);
+
+  // Set up a dart frame on entry with a frame pointer and PC information to
+  // enable easy access to the RawInstruction object of code corresponding
+  // to this frame.
+  static void EnterDartFrame(Assembler* assembler, intptr_t frame_size);
+
+  // Set up a stub frame so that the stack traversal code can easily identify
+  // a stub frame.
+  static void EnterStubFrame(Assembler* assembler);
+
+  // Instruction pattern from entrypoint is used in dart frame prologs
+  // to set up the frame and save a PC which can be used to figure out the
+  // RawInstruction object corresponding to the code running in the frame.
+  static const intptr_t kOffsetOfSavedPCfromEntrypoint = -1;  // UNIMPLEMENTED.
+};
+
+}  // namespace dart.
+
+#endif  // VM_ASSEMBLER_MACROS_MIPS_H_
+
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
new file mode 100644
index 0000000..6885019
--- /dev/null
+++ b/runtime/vm/assembler_mips.cc
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_MIPS)
+
+#include "vm/assembler.h"
+
+namespace dart {
+
+DEFINE_FLAG(bool, print_stop_message, true, "Print stop message.");
+DEFINE_FLAG(bool, code_comments, false,
+            "Include comments into code and disassembly");
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_MIPS
+
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
new file mode 100644
index 0000000..f2a0f34
--- /dev/null
+++ b/runtime/vm/assembler_mips.h
@@ -0,0 +1,183 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_ASSEMBLER_MIPS_H_
+#define VM_ASSEMBLER_MIPS_H_
+
+#ifndef VM_ASSEMBLER_H_
+#error Do not include assembler_mips.h directly; use assembler.h instead.
+#endif
+
+#include "platform/assert.h"
+#include "vm/constants_mips.h"
+
+namespace dart {
+
+class Operand : public ValueObject {
+ public:
+  Operand(const Operand& other) : ValueObject() {
+    UNIMPLEMENTED();
+  }
+
+  Operand& operator=(const Operand& other) {
+    UNIMPLEMENTED();
+    return *this;
+  }
+
+ protected:
+  Operand() { }  // Needed by subclass Address.
+};
+
+
+class Address : public Operand {
+ public:
+  Address(Register base, int32_t disp) {
+    UNIMPLEMENTED();
+  }
+
+  Address(const Address& other) : Operand(other) { }
+
+  Address& operator=(const Address& other) {
+    Operand::operator=(other);
+    return *this;
+  }
+};
+
+
+class FieldAddress : public Address {
+ public:
+  FieldAddress(Register base, int32_t disp)
+      : Address(base, disp - kHeapObjectTag) { }
+
+  FieldAddress(const FieldAddress& other) : Address(other) { }
+
+  FieldAddress& operator=(const FieldAddress& other) {
+    Address::operator=(other);
+    return *this;
+  }
+};
+
+
+class Label : public ValueObject {
+ public:
+  Label() : position_(0) { }
+
+  ~Label() {
+    // Assert if label is being destroyed with unresolved branches pending.
+    ASSERT(!IsLinked());
+  }
+
+  // Returns the position for bound and linked labels. Cannot be used
+  // for unused labels.
+  int Position() const {
+    ASSERT(!IsUnused());
+    return IsBound() ? -position_ - kWordSize : position_ - kWordSize;
+  }
+
+  bool IsBound() const { return position_ < 0; }
+  bool IsUnused() const { return position_ == 0; }
+  bool IsLinked() const { return position_ > 0; }
+
+ private:
+  int position_;
+
+  void Reinitialize() {
+    position_ = 0;
+  }
+
+  void BindTo(int position) {
+    ASSERT(!IsBound());
+    position_ = -position - kWordSize;
+    ASSERT(IsBound());
+  }
+
+  void LinkTo(int position) {
+    ASSERT(!IsBound());
+    position_ = position + kWordSize;
+    ASSERT(IsLinked());
+  }
+
+  friend class Assembler;
+  DISALLOW_COPY_AND_ASSIGN(Label);
+};
+
+
+class CPUFeatures : public AllStatic {
+ public:
+  static void InitOnce() { }
+  static bool double_truncate_round_supported() {
+    UNIMPLEMENTED();
+    return false;
+  }
+};
+
+
+class Assembler : public ValueObject {
+ public:
+  Assembler() { UNIMPLEMENTED(); }
+  ~Assembler() { }
+
+  void PopRegister(Register r) {
+    UNIMPLEMENTED();
+  }
+
+  void Bind(Label* label) {
+    UNIMPLEMENTED();
+  }
+
+  // Misc. functionality
+  int CodeSize() const {
+    UNIMPLEMENTED();
+    return 0;
+  }
+  int prologue_offset() const {
+    UNIMPLEMENTED();
+    return 0;
+  }
+  const ZoneGrowableArray<int>& GetPointerOffsets() const {
+    UNIMPLEMENTED();
+    return *pointer_offsets_;
+  }
+  void FinalizeInstructions(const MemoryRegion& region) {
+    UNIMPLEMENTED();
+  }
+
+  // Debugging and bringup support.
+  void Stop(const char* message) { UNIMPLEMENTED(); }
+  void Unimplemented(const char* message);
+  void Untested(const char* message);
+  void Unreachable(const char* message);
+
+  static void InitializeMemoryWithBreakpoints(uword data, int length) {
+    UNIMPLEMENTED();
+  }
+
+  void Comment(const char* format, ...) PRINTF_ATTRIBUTE(2, 3) {
+    UNIMPLEMENTED();
+  }
+
+  const Code::Comments& GetCodeComments() const {
+    UNIMPLEMENTED();
+    return Code::Comments::New(0);
+  }
+
+  static const char* RegisterName(Register reg) {
+    UNIMPLEMENTED();
+    return NULL;
+  }
+
+  static const char* FpuRegisterName(FpuRegister reg) {
+    UNIMPLEMENTED();
+    return NULL;
+  }
+
+ private:
+  ZoneGrowableArray<int>* pointer_offsets_;
+  DISALLOW_ALLOCATION();
+  DISALLOW_COPY_AND_ASSIGN(Assembler);
+};
+
+}  // namespace dart
+
+#endif  // VM_ASSEMBLER_MIPS_H_
diff --git a/runtime/vm/assembler_test.cc b/runtime/vm/assembler_test.cc
index ce13f25..69228a1 100644
--- a/runtime/vm/assembler_test.cc
+++ b/runtime/vm/assembler_test.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -10,6 +10,8 @@
 
 namespace dart {
 
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
+
 ASSEMBLER_TEST_EXTERN(StoreIntoObject);
 
 ASSEMBLER_TEST_RUN(StoreIntoObject, entry) {
@@ -75,4 +77,6 @@
       GrowableObjectArray::data_offset() - kHeapObjectTag));
 }
 
+#endif
+
 }  // namespace dart
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 7e4cd29..b244172 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -295,18 +295,14 @@
 
 
 void Assembler::movw(Register dst, const Address& src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(dst, src, REX_NONE);
-  EmitOperandSizeOverride();
-  EmitUint8(0x8B);
-  EmitOperand(dst & 7, src);
+  FATAL("Use movzxw or movsxw instead.");
 }
 
 
 void Assembler::movw(const Address& dst, Register src) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(src, dst, REX_NONE);
   EmitOperandSizeOverride();
+  EmitOperandREX(src, dst, REX_NONE);
   EmitUint8(0x89);
   EmitOperand(src & 7, dst);
 }
@@ -2188,7 +2184,7 @@
 };
 
 
-const char* Assembler::XmmRegisterName(XmmRegister reg) {
+const char* Assembler::FpuRegisterName(FpuRegister reg) {
   ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters));
   return xmm_reg_names[reg];
 }
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index ff7cae2..8c18c6c 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -22,6 +22,8 @@
  public:
   explicit Immediate(int64_t value) : value_(value) { }
 
+  Immediate(const Immediate& other) : ValueObject(), value_(other.value_) { }
+
   int64_t value() const { return value_; }
 
   bool is_int8() const { return Utils::IsInt(8, value_); }
@@ -34,6 +36,7 @@
 
   // TODO(5411081): Add DISALLOW_COPY_AND_ASSIGN(Immediate) once the mac
   // build issue is resolved.
+  // And remove the unnecessary copy constructor.
 };
 
 
@@ -76,8 +79,20 @@
     return bit_copy<int32_t>(encoding_[length_ - 4]);
   }
 
+  Operand(const Operand& other)
+      : ValueObject(), length_(other.length_), rex_(other.rex_) {
+    memmove(&encoding_[0], &other.encoding_[0], other.length_);
+  }
+
+  Operand& operator=(const Operand& other) {
+    length_ = other.length_;
+    rex_ = other.rex_;
+    memmove(&encoding_[0], &other.encoding_[0], other.length_);
+    return *this;
+  }
+
  protected:
-  Operand() : length_(0), rex_(REX_NONE) { }
+  Operand() : length_(0), rex_(REX_NONE) { }  // Needed by subclass Address.
 
   void SetModRM(int mod, Register rm) {
     ASSERT((mod & ~3) == 0);
@@ -132,11 +147,7 @@
         && ((encoding_at(0) & 0x07) == reg);  // Register codes match.
   }
 
-
   friend class Assembler;
-
-  // TODO(5411081): Add DISALLOW_COPY_AND_ASSIGN(Operand) once the mac
-  // build issue is resolved.
 };
 
 
@@ -186,20 +197,29 @@
     }
   }
 
- private:
-  Address() {}
+  Address(const Address& other) : Operand(other) { }
 
-  // TODO(5411081): Add DISALLOW_COPY_AND_ASSIGN(Address) once the mac
-  // build issue is resolved.
+  Address& operator=(const Address& other) {
+    Operand::operator=(other);
+    return *this;
+  }
 };
 
 
 class FieldAddress : public Address {
  public:
   FieldAddress(Register base, int32_t disp)
-      : Address(base, disp - kHeapObjectTag) {}
+      : Address(base, disp - kHeapObjectTag) { }
+
   FieldAddress(Register base, Register index, ScaleFactor scale, int32_t disp)
-      : Address(base, index, scale, disp - kHeapObjectTag) {}
+      : Address(base, index, scale, disp - kHeapObjectTag) { }
+
+  FieldAddress(const FieldAddress& other) : Address(other) { }
+
+  FieldAddress& operator=(const FieldAddress& other) {
+    Address::operator=(other);
+    return *this;
+  }
 };
 
 
@@ -278,6 +298,7 @@
   // x64 always has at least SSE2.
   static bool sse2_supported() { return true; }
   static bool sse4_1_supported();
+  static bool double_truncate_round_supported() { return sse4_1_supported(); }
 
  private:
   static const uint64_t kSSE4_1BitMask = static_cast<uint64_t>(1) << 51;
@@ -656,7 +677,7 @@
 
   static const char* RegisterName(Register reg);
 
-  static const char* XmmRegisterName(XmmRegister reg);
+  static const char* FpuRegisterName(FpuRegister reg);
 
  private:
   AssemblerBuffer buffer_;
diff --git a/runtime/vm/assembler_x64_test.cc b/runtime/vm/assembler_x64_test.cc
index 8ce63fc..e6e3940 100644
--- a/runtime/vm/assembler_x64_test.cc
+++ b/runtime/vm/assembler_x64_test.cc
@@ -535,6 +535,43 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(MoveWord, assembler) {
+  __ xorq(RAX, RAX);
+  __ pushq(Immediate(0));
+  __ movq(RAX, RSP);
+  __ movq(RCX, Immediate(-1));
+  __ movw(Address(RAX, 0), RCX);
+  __ movzxw(RAX, Address(RAX, 0));  // RAX = 0xffff
+  __ addq(RSP, Immediate(kWordSize));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(MoveWord, entry) {
+  typedef int (*MoveWord)();
+  EXPECT_EQ(0xffff, reinterpret_cast<MoveWord>(entry)());
+}
+
+
+ASSEMBLER_TEST_GENERATE(MoveWordRex, assembler) {
+  __ pushq(Immediate(0));
+  __ movq(R8, RSP);
+  __ movq(R9, Immediate(-1));
+  __ movw(Address(R8, 0), R9);
+  __ movzxw(R8, Address(R8, 0));  // 0xffff
+  __ xorq(RAX, RAX);
+  __ addq(RAX, R8);  // RAX = 0xffff
+  __ addq(RSP, Immediate(kWordSize));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(MoveWordRex, entry) {
+  typedef int (*MoveWordRex)();
+  EXPECT_EQ(0xffff, reinterpret_cast<MoveWordRex>(entry)());
+}
+
+
 ASSEMBLER_TEST_GENERATE(Bitwise, assembler) {
   __ movl(RCX, Immediate(42));
   __ xorl(RCX, RCX);
diff --git a/runtime/vm/ast.cc b/runtime/vm/ast.cc
index c88bdba..7c98741 100644
--- a/runtime/vm/ast.cc
+++ b/runtime/vm/ast.cc
@@ -95,7 +95,7 @@
       double new_value = (dbl.value() == 0.0) ? -0.0 : (0.0 - dbl.value());
       Double& double_instance =
           Double::ZoneHandle(Double::New(new_value, Heap::kOld));
-      double_instance ^= double_instance.Canonicalize();
+      double_instance |= double_instance.Canonicalize();
       return new LiteralNode(this->token_pos(), double_instance);
     }
   }
diff --git a/runtime/vm/ast.h b/runtime/vm/ast.h
index 497ae3d..4541daa 100644
--- a/runtime/vm/ast.h
+++ b/runtime/vm/ast.h
@@ -1559,16 +1559,19 @@
 
   CatchClauseNode(intptr_t token_pos,
                   SequenceNode* catch_block,
+                  const Array& handler_types,
                   const LocalVariable* context_var,
                   const LocalVariable* exception_var,
                   const LocalVariable* stacktrace_var)
       : AstNode(token_pos),
         try_index_(kInvalidTryIndex),
         catch_block_(catch_block),
+        handler_types_(handler_types),
         context_var_(*context_var),
         exception_var_(*exception_var),
         stacktrace_var_(*stacktrace_var) {
     ASSERT(catch_block_ != NULL);
+    ASSERT(handler_types.IsZoneHandle());
     ASSERT(context_var != NULL);
     ASSERT(exception_var != NULL);
     ASSERT(stacktrace_var != NULL);
@@ -1580,6 +1583,7 @@
   }
   void set_try_index(int value) { try_index_ = value; }
 
+  const Array& handler_types() const { return handler_types_; }
   const LocalVariable& context_var() const { return context_var_; }
   const LocalVariable& exception_var() const { return exception_var_; }
   const LocalVariable& stacktrace_var() const { return stacktrace_var_; }
@@ -1593,6 +1597,7 @@
  private:
   int try_index_;  // Running index of the try blocks seen in a function.
   SequenceNode* catch_block_;
+  const Array& handler_types_;
   const LocalVariable& context_var_;
   const LocalVariable& exception_var_;
   const LocalVariable& stacktrace_var_;
diff --git a/runtime/vm/bigint_operations.cc b/runtime/vm/bigint_operations.cc
index 8120e58..2b34ef4 100644
--- a/runtime/vm/bigint_operations.cc
+++ b/runtime/vm/bigint_operations.cc
@@ -184,15 +184,15 @@
       ASSERT(('0' <= c) && (c <= '9'));
       digit = digit * 10 + c - '0';
     }
-    result ^= MultiplyWithDigit(result, kTenMultiplier);
+    result |= MultiplyWithDigit(result, kTenMultiplier);
     if (digit != 0) {
       increment.SetChunkAt(0, digit);
-      result ^= Add(result, increment);
+      result |= Add(result, increment);
     }
   }
   Clamp(result);
   if ((space == Heap::kOld) && !result.IsOld()) {
-    result ^= Object::Clone(result, Heap::kOld);
+    result |= Object::Clone(result, Heap::kOld);
   }
   return result.raw();
 }
@@ -1480,13 +1480,13 @@
 
   int comp = UnsignedCompare(a, b);
   if (comp < 0) {
-    (*quotient) ^= Zero();
-    (*remainder) ^= Copy(a);  // TODO(floitsch): can we reuse the input?
+    (*quotient) |= Zero();
+    (*remainder) |= Copy(a);  // TODO(floitsch): can we reuse the input?
     return;
   } else if (comp == 0) {
-    (*quotient) ^= One();
+    (*quotient) |= One();
     quotient->SetSign(a.IsNegative() != b.IsNegative());
-    (*remainder) ^= Zero();
+    (*remainder) |= Zero();
     return;
   }
 
@@ -1521,7 +1521,7 @@
   ASSERT(divisor_length == divisor.Length());
 
   intptr_t quotient_length = dividend_length - divisor_length + 1;
-  *quotient ^= Bigint::Allocate(quotient_length);
+  *quotient |= Bigint::Allocate(quotient_length);
   quotient->SetSign(a.IsNegative() != b.IsNegative());
 
   intptr_t quotient_pos = dividend_length - divisor_length;
@@ -1536,7 +1536,7 @@
   Chunk first_quotient_digit = 0;
   while (UnsignedCompare(dividend, shifted_divisor) >= 0) {
     first_quotient_digit++;
-    dividend ^= Subtract(dividend, shifted_divisor);
+    dividend |= Subtract(dividend, shifted_divisor);
   }
   quotient->SetChunkAt(quotient_pos--, first_quotient_digit);
 
@@ -1609,7 +1609,7 @@
     target.SetChunkAt(2, dividend_digit);
     do {
       quotient_digit = (quotient_digit - 1) & kDigitMask;
-      estimation_product ^= MultiplyWithDigit(short_divisor, quotient_digit);
+      estimation_product |= MultiplyWithDigit(short_divisor, quotient_digit);
     } while (UnsignedCompareNonClamped(estimation_product, target) > 0);
     // At this point the quotient_digit is fairly accurate.
     // At the worst it is off by one.
@@ -1617,15 +1617,15 @@
     // subtract the divisor another time.
     // Let t = i - divisor_length.
     // dividend -= (quotient_digit * divisor) << (t * kDigitBitSize);
-    shifted_divisor ^= MultiplyWithDigit(divisor, quotient_digit);
-    shifted_divisor ^= DigitsShiftLeft(shifted_divisor, i - divisor_length);
+    shifted_divisor |= MultiplyWithDigit(divisor, quotient_digit);
+    shifted_divisor |= DigitsShiftLeft(shifted_divisor, i - divisor_length);
     dividend = Subtract(dividend, shifted_divisor);
     if (dividend.IsNegative()) {
       // The estimation was still too big.
       quotient_digit--;
       // TODO(floitsch): allocate space for the shifted_divisor once and reuse
       // it at every iteration.
-      shifted_divisor ^= DigitsShiftLeft(divisor, i - divisor_length);
+      shifted_divisor |= DigitsShiftLeft(divisor, i - divisor_length);
       // TODO(floitsch): reuse the space of the previous dividend.
       dividend = Add(dividend, shifted_divisor);
     }
@@ -1633,7 +1633,7 @@
   }
   ASSERT(quotient_pos == -1);
   Clamp(*quotient);
-  *remainder ^= ShiftRight(dividend, normalization_shift);
+  *remainder |= ShiftRight(dividend, normalization_shift);
   remainder->SetSign(a.IsNegative());
 }
 
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index d0e864c..5720b0a 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -48,6 +48,13 @@
 }
 
 
+RawScript* Bootstrap::LoadCollectionDevScript(bool patch) {
+  const char* url = patch ? "dart:collection-dev-patch" : "dart:collection-dev";
+  const char* source = patch ? collection_dev_source_ : collection_dev_source_;
+  return LoadScript(url, source, patch);
+}
+
+
 RawScript* Bootstrap::LoadMathScript(bool patch) {
   const char* url = patch ? "dart:math-patch" : "dart:math";
   const char* source = patch ? math_patch_ : math_source_;
diff --git a/runtime/vm/bootstrap.h b/runtime/vm/bootstrap.h
index 5509732..4c01cca 100644
--- a/runtime/vm/bootstrap.h
+++ b/runtime/vm/bootstrap.h
@@ -20,6 +20,7 @@
   static RawScript* LoadASyncScript(bool patch);
   static RawScript* LoadCoreScript(bool patch);
   static RawScript* LoadCollectionScript(bool patch);
+  static RawScript* LoadCollectionDevScript(bool patch);
   static RawScript* LoadMathScript(bool patch);
   static RawScript* LoadIsolateScript(bool patch);
   static RawScript* LoadMirrorsScript(bool patch);
@@ -35,6 +36,7 @@
   static const char corelib_source_[];
   static const char corelib_patch_[];
   static const char collection_source_[];
+  static const char collection_dev_source_[];
   static const char math_source_[];
   static const char math_patch_[];
   static const char isolate_source_[];
diff --git a/runtime/vm/bootstrap_nocorelib.cc b/runtime/vm/bootstrap_nocorelib.cc
index 6d543db..7093777 100644
--- a/runtime/vm/bootstrap_nocorelib.cc
+++ b/runtime/vm/bootstrap_nocorelib.cc
@@ -33,6 +33,12 @@
 }
 
 
+RawScript* Bootstrap::LoadCollectionDevScript(bool is_patch) {
+  UNREACHABLE();
+  return Script::null();
+}
+
+
 RawScript* Bootstrap::LoadMathScript(bool is_patch) {
   UNREACHABLE();
   return Script::null();
diff --git a/runtime/vm/cha.cc b/runtime/vm/cha.cc
index 01aabcc..794dc7a 100644
--- a/runtime/vm/cha.cc
+++ b/runtime/vm/cha.cc
@@ -49,7 +49,7 @@
   }
   Class& direct_subclass = Class::Handle();
   for (intptr_t i = 0; i < cls_direct_subclasses.Length(); i++) {
-    direct_subclass ^= cls_direct_subclasses.At(i);
+    direct_subclass |= cls_direct_subclasses.At(i);
     intptr_t direct_subclass_id = direct_subclass.id();
     if (!ContainsCid(cids, direct_subclass_id)) {
       cids->Add(direct_subclass_id);
@@ -78,7 +78,7 @@
   }
   Class& direct_subclass = Class::Handle();
   for (intptr_t i = 0; i < cls_direct_subclasses.Length(); i++) {
-    direct_subclass ^= cls_direct_subclasses.At(i);
+    direct_subclass |= cls_direct_subclasses.At(i);
     if (direct_subclass.LookupDynamicFunction(function_name) !=
         Function::null()) {
       return true;
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 0d1e496..09e5cf5 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -38,6 +38,8 @@
     const GrowableArray<intptr_t>& added_subclasses_to_cids) {
   ASSERT(FLAG_use_cha);
   if (added_subclasses_to_cids.is_empty()) return;
+  // TODO(regis): Reenable this code for arm and mips when possible.
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
   // Deoptimize all live frames.
   DeoptimizeIfOwner(added_subclasses_to_cids);
   // Switch all functions' code to unoptimized.
@@ -52,13 +54,14 @@
     array = cls.functions();
     intptr_t num_functions = array.IsNull() ? 0 : array.Length();
     for (intptr_t f = 0; f < num_functions; f++) {
-      function ^= array.At(f);
+      function |= array.At(f);
       ASSERT(!function.IsNull());
       if (function.HasOptimizedCode()) {
         function.SwitchToUnoptimizedCode();
       }
     }
   }
+#endif
 }
 
 
@@ -91,7 +94,7 @@
   Class& cls = Class::Handle();
   Type& super_type = Type::Handle();
   for (intptr_t i = 0; i < pending_classes.Length(); i++) {
-    cls ^= pending_classes.At(i);
+    cls |= pending_classes.At(i);
     ASSERT(!cls.is_finalized());
     super_type ^= cls.super_type();
     if (!super_type.IsNull()) {
@@ -135,7 +138,7 @@
     Class& cls = Class::Handle();
     // First resolve all superclasses.
     for (intptr_t i = 0; i < class_array.Length(); i++) {
-      cls ^= class_array.At(i);
+      cls |= class_array.At(i);
       if (FLAG_trace_class_finalization) {
         OS::Print("Resolving super and interfaces: %s\n", cls.ToCString());
       }
@@ -144,12 +147,12 @@
     }
     // Finalize all classes.
     for (intptr_t i = 0; i < class_array.Length(); i++) {
-      cls ^= class_array.At(i);
+      cls |= class_array.At(i);
       FinalizeClass(cls);
     }
     if (FLAG_print_classes) {
       for (intptr_t i = 0; i < class_array.Length(); i++) {
-        cls ^= class_array.At(i);
+        cls |= class_array.At(i);
         PrintClassInformation(cls);
       }
     }
@@ -267,7 +270,7 @@
       GrowableObjectArray::Handle(object_store->pending_classes());
   for (intptr_t i = 0; i < class_array.Length(); i++) {
     // TODO(iposva): Add real checks.
-    cls ^= class_array.At(i);
+    cls |= class_array.At(i);
     if (cls.is_finalized() || cls.is_prefinalized()) {
       // Pre-finalized bootstrap classes must not define any fields.
       ASSERT(!cls.HasInstanceFields());
@@ -915,7 +918,9 @@
   super_class = cls.SuperClass();
   while (!super_class.IsNull()) {
     function = super_class.LookupFunction(name);
-    if (!function.IsNull() && !function.is_static()) {
+    if (!function.IsNull() &&
+        !function.is_static() &&
+        !function.IsMethodExtractor()) {
       return super_class.raw();
     }
     super_class = super_class.SuperClass();
@@ -964,7 +969,7 @@
   Class& super_class = Class::Handle();
   intptr_t num_fields = array.Length();
   for (intptr_t i = 0; i < num_fields; i++) {
-    field ^= array.At(i);
+    field |= array.At(i);
     type = field.type();
     ResolveType(cls, type, kCanonicalize);
     type = FinalizeType(cls, type, kCanonicalize);
@@ -1020,7 +1025,7 @@
   intptr_t num_functions = array.Length();
   String& function_name = String::Handle();
   for (intptr_t i = 0; i < num_functions; i++) {
-    function ^= array.At(i);
+    function |= array.At(i);
     ResolveAndFinalizeSignature(cls, function);
     function_name = function.name();
     if (function.is_static()) {
@@ -1044,7 +1049,7 @@
       }
     } else {
       for (int i = 0; i < interfaces.Length(); i++) {
-        super_class ^= interfaces.At(i);
+        super_class |= interfaces.At(i);
         overridden_function = super_class.LookupDynamicFunction(function_name);
         if (!overridden_function.IsNull() &&
             !function.HasCompatibleParametersWith(overridden_function)) {
@@ -1417,7 +1422,7 @@
   intptr_t len = fields_array.Length();
   Field& field = Field::Handle();
   for (intptr_t i = 0; i < len; i++) {
-    field ^= fields_array.At(i);
+    field |= fields_array.At(i);
     if (!field.is_static() && !field.is_final()) {
       const String& class_name = String::Handle(cls.Name());
       const String& field_name = String::Handle(field.name());
@@ -1464,14 +1469,14 @@
   Function& function = Function::Handle();
   intptr_t len = functions_array.Length();
   for (intptr_t i = 0; i < len; i++) {
-    function ^= functions_array.At(i);
+    function |= functions_array.At(i);
     OS::Print("  %s\n", function.ToCString());
   }
   const Array& fields_array = Array::Handle(cls.fields());
   Field& field = Field::Handle();
   len = fields_array.Length();
   for (intptr_t i = 0; i < len; i++) {
-    field ^= fields_array.At(i);
+    field |= fields_array.At(i);
     OS::Print("  %s\n", field.ToCString());
   }
 }
diff --git a/runtime/vm/code_descriptors.cc b/runtime/vm/code_descriptors.cc
index 7ad06c1..b934b28 100644
--- a/runtime/vm/code_descriptors.cc
+++ b/runtime/vm/code_descriptors.cc
@@ -79,7 +79,7 @@
 
 RawStackmap* StackmapTableBuilder::MapAt(int index) const {
   Stackmap& map = Stackmap::Handle();
-  map ^= list_.At(index);
+  map |= list_.At(index);
   return map.raw();
 }
 
diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
index 5b684d5..cab61ef 100644
--- a/runtime/vm/code_descriptors.h
+++ b/runtime/vm/code_descriptors.h
@@ -98,8 +98,9 @@
 class ExceptionHandlerList : public ZoneAllocated {
  public:
   struct HandlerDesc {
-    intptr_t try_index;  // Try block index handled by the handler.
-    intptr_t pc_offset;  // Handler PC offset value.
+    intptr_t outer_try_index;  // Try block in which this try block is nested.
+    intptr_t pc_offset;        // Handler PC offset value.
+    const Array* handler_types;   // Catch clause guards.
   };
 
   ExceptionHandlerList() : list_() {}
@@ -108,21 +109,26 @@
     return list_.length();
   }
 
-  intptr_t TryIndex(int index) const {
-    return list_[index].try_index;
-  }
-  intptr_t PcOffset(int index) const {
-    return list_[index].pc_offset;
-  }
-  void SetPcOffset(int index, intptr_t handler_pc) {
-    list_[index].pc_offset = handler_pc;
+  void AddPlaceHolder() {
+    struct HandlerDesc data;
+    data.outer_try_index = -1;
+    data.pc_offset = -1;
+    data.handler_types = NULL;
+    list_.Add(data);
   }
 
-  void AddHandler(intptr_t try_index, intptr_t pc_offset) {
-    struct HandlerDesc data;
-    data.try_index = try_index;
-    data.pc_offset = pc_offset;
-    list_.Add(data);
+  void AddHandler(intptr_t try_index,
+                  intptr_t outer_try_index,
+                  intptr_t pc_offset,
+                  const Array& handler_types) {
+    ASSERT(try_index >= 0);
+    while (Length() <= try_index) {
+      AddPlaceHolder();
+    }
+    list_[try_index].outer_try_index = outer_try_index;
+    list_[try_index].pc_offset = pc_offset;
+    ASSERT(handler_types.IsZoneHandle());
+    list_[try_index].handler_types = &handler_types;
   }
 
   RawExceptionHandlers* FinalizeExceptionHandlers(uword entry_point) {
@@ -130,7 +136,12 @@
     const ExceptionHandlers& handlers =
         ExceptionHandlers::Handle(ExceptionHandlers::New(num_handlers));
     for (intptr_t i = 0; i < num_handlers; i++) {
-      handlers.SetHandlerEntry(i, TryIndex(i), (entry_point + PcOffset(i)));
+      // Assert that every element in the array has been initialized.
+      ASSERT(list_[i].handler_types != NULL);
+      handlers.SetHandlerInfo(i,
+                              list_[i].outer_try_index,
+                              (entry_point + list_[i].pc_offset));
+      handlers.SetHandledTypes(i, *list_[i].handler_types);
     }
     return handlers.raw();
   }
diff --git a/runtime/vm/code_descriptors_test.cc b/runtime/vm/code_descriptors_test.cc
index 261b0dd..d14efaf 100644
--- a/runtime/vm/code_descriptors_test.cc
+++ b/runtime/vm/code_descriptors_test.cc
@@ -146,28 +146,28 @@
     EXPECT_EQ(4, stack_map_list.Length());
 
     // Validate the first stack map entry.
-    stack_map ^= stack_map_list.At(0);
+    stack_map |= stack_map_list.At(0);
     EXPECT_EQ(kStackSlotCount, stack_map.Length());
     for (intptr_t i = 0; i < kStackSlotCount; ++i) {
       EXPECT_EQ(expectation0[i], stack_map.IsObject(i));
     }
 
     // Validate the second stack map entry.
-    stack_map ^= stack_map_list.At(1);
+    stack_map |= stack_map_list.At(1);
     EXPECT_EQ(kStackSlotCount, stack_map.Length());
     for (intptr_t i = 0; i < kStackSlotCount; ++i) {
       EXPECT_EQ(expectation1[i], stack_map.IsObject(i));
     }
 
     // Validate the third stack map entry.
-    stack_map ^= stack_map_list.At(2);
+    stack_map |= stack_map_list.At(2);
     EXPECT_EQ(kStackSlotCount, stack_map.Length());
     for (intptr_t i = 0; i < kStackSlotCount; ++i) {
       EXPECT_EQ(expectation2[i], stack_map.IsObject(i));
     }
 
     // Validate the fourth stack map entry.
-    stack_map ^= stack_map_list.At(3);
+    stack_map |= stack_map_list.At(3);
     EXPECT_EQ(kStackSlotCount, stack_map.Length());
     for (intptr_t i = 0; i < kStackSlotCount; ++i) {
       EXPECT_EQ(expectation3[i], stack_map.IsObject(i));
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 0dd7581..c18860d 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -1127,39 +1127,6 @@
 }
 
 
-// An instance call could not be resolved by an IC miss handler.  Check if
-// it was a getter call and if there is an instance function with the same
-// name.  If so, create and return an implicit closure from the function.
-// Otherwise return null.
-static RawInstance* ResolveImplicitClosure(const Instance& receiver,
-                                           const Class& receiver_class,
-                                           const String& target_name) {
-  // 1. Check if was a getter call.
-  if (!Field::IsGetterName(target_name)) return Instance::null();
-
-  // 2. Check if there is an instance function with the same name.
-  String& function_name = String::Handle(Field::NameFromGetter(target_name));
-  function_name = Symbols::New(function_name);
-  const Function& function = Function::Handle(
-      Resolver::ResolveDynamicAnyArgs(receiver_class, function_name));
-  if (function.IsNull()) return Instance::null();
-
-  // Create a closure object for the implicit closure function.
-  const Function& closure_function =
-      Function::Handle(function.ImplicitClosureFunction());
-  const Context& context = Context::Handle(Context::New(1));
-  context.SetAt(0, receiver);
-  const Instance& closure =
-      Instance::Handle(Closure::New(closure_function, context));
-  if (receiver_class.HasTypeArguments()) {
-    const AbstractTypeArguments& type_arguments =
-        AbstractTypeArguments::Handle(receiver.GetTypeArguments());
-    closure.SetTypeArguments(type_arguments);
-  }
-  return closure.raw();
-}
-
-
 // An instance call of the form o.f(...) could not be resolved.  Check if
 // there is a getter with the same name.  If so, invoke it.  If the value is
 // a closure, invoke it with the given arguments.  If the value is a
@@ -1179,7 +1146,9 @@
                                                getter_name,
                                                kNumArguments,
                                                kNumNamedArguments));
-  if (getter.IsNull()) return false;
+  if (getter.IsNull() || getter.IsMethodExtractor()) {
+    return false;
+  }
 
   // 2. Invoke the getter.
   const Array& args = Array::Handle(Array::New(kNumArguments));
@@ -1231,14 +1200,6 @@
   }
   const String& target_name = String::Handle(ic_data.target_name());
 
-  Instance& closure = Instance::Handle(ResolveImplicitClosure(receiver,
-                                                              receiver_class,
-                                                              target_name));
-  if (!closure.IsNull()) {
-    arguments.SetReturn(closure);
-    return;
-  }
-
   Object& result = Object::Handle();
   if (!ResolveCallThroughGetter(receiver,
                                 receiver_class,
@@ -1488,13 +1449,13 @@
 
 // Copy saved registers into the isolate buffer.
 static void CopySavedRegisters(uword saved_registers_address) {
-  double* xmm_registers_copy = new double[kNumberOfXmmRegisters];
-  ASSERT(xmm_registers_copy != NULL);
-  for (intptr_t i = 0; i < kNumberOfXmmRegisters; i++) {
-    xmm_registers_copy[i] = *reinterpret_cast<double*>(saved_registers_address);
+  double* fpu_registers_copy = new double[kNumberOfFpuRegisters];
+  ASSERT(fpu_registers_copy != NULL);
+  for (intptr_t i = 0; i < kNumberOfFpuRegisters; i++) {
+    fpu_registers_copy[i] = *reinterpret_cast<double*>(saved_registers_address);
     saved_registers_address += kDoubleSize;
   }
-  Isolate::Current()->set_deopt_xmm_registers_copy(xmm_registers_copy);
+  Isolate::Current()->set_deopt_fpu_registers_copy(fpu_registers_copy);
 
   intptr_t* cpu_registers_copy = new intptr_t[kNumberOfCpuRegisters];
   ASSERT(cpu_registers_copy != NULL);
@@ -1544,7 +1505,7 @@
 
   // All registers have been saved below last-fp.
   const uword last_fp = saved_registers_address +
-      kNumberOfCpuRegisters * kWordSize + kNumberOfXmmRegisters * kDoubleSize;
+      kNumberOfCpuRegisters * kWordSize + kNumberOfFpuRegisters * kDoubleSize;
   CopySavedRegisters(saved_registers_address);
 
   // Get optimized code and frame that need to be deoptimized.
@@ -1646,7 +1607,7 @@
 
   intptr_t* frame_copy = isolate->deopt_frame_copy();
   intptr_t* cpu_registers_copy = isolate->deopt_cpu_registers_copy();
-  double* xmm_registers_copy = isolate->deopt_xmm_registers_copy();
+  double* fpu_registers_copy = isolate->deopt_fpu_registers_copy();
 
   intptr_t deopt_reason = kDeoptUnknown;
   const DeoptInfo& deopt_info = DeoptInfo::Handle(
@@ -1660,10 +1621,10 @@
 
   isolate->SetDeoptFrameCopy(NULL, 0);
   isolate->set_deopt_cpu_registers_copy(NULL);
-  isolate->set_deopt_xmm_registers_copy(NULL);
+  isolate->set_deopt_fpu_registers_copy(NULL);
   delete[] frame_copy;
   delete[] cpu_registers_copy;
-  delete[] xmm_registers_copy;
+  delete[] fpu_registers_copy;
 
   return caller_fp;
 }
diff --git a/runtime/vm/code_generator_test.cc b/runtime/vm/code_generator_test.cc
index f2b4c62..31cf02d 100644
--- a/runtime/vm/code_generator_test.cc
+++ b/runtime/vm/code_generator_test.cc
@@ -553,7 +553,7 @@
   // App lib is the last one that was loaded.
   intptr_t num_libs = libs.Length();
   Library& app_lib = Library::Handle();
-  app_lib ^= libs.At(num_libs - 1);
+  app_lib |= libs.At(num_libs - 1);
   ASSERT(!app_lib.IsNull());
   const Class& cls = Class::Handle(
       app_lib.LookupClass(String::Handle(Symbols::New("A"))));
diff --git a/runtime/vm/code_patcher_arm.cc b/runtime/vm/code_patcher_arm.cc
index 0211183..1297273 100644
--- a/runtime/vm/code_patcher_arm.cc
+++ b/runtime/vm/code_patcher_arm.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -9,9 +9,9 @@
 
 namespace dart {
 
-void CodePatcher::GetStaticCallAt(uword return_address,
-                                  uword* target) {
+uword CodePatcher::GetStaticCallTargetAt(uword return_address) {
   UNIMPLEMENTED();
+  return 0;
 }
 
 
@@ -25,50 +25,30 @@
 }
 
 
+void CodePatcher::InsertCallAt(uword start, uword target) {
+  UNIMPLEMENTED();
+}
+
+
 bool CodePatcher::IsDartCall(uword return_address) {
   UNIMPLEMENTED();
   return false;
 }
 
 
-void CodePatcher::GetInstanceCallAt(uword return_address,
-                                    String* function_name,
-                                    int* num_arguments,
-                                    int* num_named_arguments,
-                                    uword* target) {
+uword CodePatcher::GetInstanceCallAt(uword return_address,
+                                     ICData* ic_data,
+                                     Array* arguments_descriptor) {
   UNIMPLEMENTED();
+  return 0;
 }
 
 
-void CodePatcher::PatchEntry(const Code& code) {
+intptr_t CodePatcher::InstanceCallSizeInBytes() {
   UNIMPLEMENTED();
+  return 0;
 }
 
-
-void CodePatcher::RestoreEntry(const Code& code) {
-  UNIMPLEMENTED();
-}
-
-
-bool CodePatcher::CodeIsPatchable(const Code& code) {
-  UNIMPLEMENTED();
-  return false;
-}
-
-
-RawICData* CodePatcher::GetInstanceCallIcDataAt(uword return_address) {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-
-void CodePatcher::InsertCallAt(uword start, uword target) {
-  UNIMPLEMENTED();
-}
-
-
-
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_ARM
diff --git a/runtime/vm/code_patcher_ia32.cc b/runtime/vm/code_patcher_ia32.cc
index 1209cbe..c6ae59d 100644
--- a/runtime/vm/code_patcher_ia32.cc
+++ b/runtime/vm/code_patcher_ia32.cc
@@ -179,7 +179,7 @@
                                      Array* arguments_descriptor) {
   InstanceCall call(return_address);
   if (ic_data != NULL) {
-    *ic_data ^= call.ic_data();
+    *ic_data |= call.ic_data();
   }
   if (arguments_descriptor != NULL) {
     *arguments_descriptor ^= call.arguments_descriptor();
diff --git a/runtime/vm/code_patcher_mips.cc b/runtime/vm/code_patcher_mips.cc
new file mode 100644
index 0000000..987589d
--- /dev/null
+++ b/runtime/vm/code_patcher_mips.cc
@@ -0,0 +1,54 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"  // Needed here to get TARGET_ARCH_MIPS.
+#if defined(TARGET_ARCH_MIPS)
+
+#include "vm/code_patcher.h"
+
+namespace dart {
+
+uword CodePatcher::GetStaticCallTargetAt(uword return_address) {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+void CodePatcher::PatchStaticCallAt(uword return_address, uword new_target) {
+  UNIMPLEMENTED();
+}
+
+
+void CodePatcher::PatchInstanceCallAt(uword return_address, uword new_target) {
+  UNIMPLEMENTED();
+}
+
+
+void CodePatcher::InsertCallAt(uword start, uword target) {
+  UNIMPLEMENTED();
+}
+
+
+bool CodePatcher::IsDartCall(uword return_address) {
+  UNIMPLEMENTED();
+  return false;
+}
+
+
+uword CodePatcher::GetInstanceCallAt(uword return_address,
+                                     ICData* ic_data,
+                                     Array* arguments_descriptor) {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+intptr_t CodePatcher::InstanceCallSizeInBytes() {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/code_patcher_x64.cc b/runtime/vm/code_patcher_x64.cc
index ab3312e..aa34870 100644
--- a/runtime/vm/code_patcher_x64.cc
+++ b/runtime/vm/code_patcher_x64.cc
@@ -154,7 +154,7 @@
                                      Array* arguments_descriptor) {
   InstanceCall call(return_address);
   if (ic_data != NULL) {
-    *ic_data ^= call.ic_data();
+    *ic_data |= call.ic_data();
   }
   if (arguments_descriptor != NULL) {
     *arguments_descriptor ^= call.arguments_descriptor();
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 0931e8f..c5b865b 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -383,7 +383,7 @@
     const Array& stackmap_table = Array::Handle(code.stackmaps());
     Stackmap& map = Stackmap::Handle();
     for (intptr_t i = 0; i < stackmap_table.Length(); ++i) {
-      map ^= stackmap_table.At(i);
+      map |= stackmap_table.At(i);
       OS::Print("%s\n", map.ToCString());
     }
   }
@@ -433,9 +433,9 @@
     Code& code = Code::Handle();
     for (intptr_t i = 0; i < table.Length();
         i += Code::kSCallTableEntryLength) {
-      offset ^= table.At(i + Code::kSCallTableOffsetEntry);
-      function ^= table.At(i + Code::kSCallTableFunctionEntry);
-      code ^= table.At(i + Code::kSCallTableCodeEntry);
+      offset |= table.At(i + Code::kSCallTableOffsetEntry);
+      function |= table.At(i + Code::kSCallTableFunctionEntry);
+      code |= table.At(i + Code::kSCallTableCodeEntry);
       OS::Print("  0x%"Px": %s, %p\n",
           start + offset.Value(),
           function.ToFullyQualifiedCString(),
@@ -571,7 +571,7 @@
     return error.raw();
   }
   for (int i = 0; i < functions.Length(); i++) {
-    func ^= functions.At(i);
+    func |= functions.At(i);
     ASSERT(!func.IsNull());
     if (!func.HasCode() &&
         !func.is_abstract() &&
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 9a72890..f3a7cc1 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -7,6 +7,14 @@
 
 namespace dart {
 
+// We support both VFPv3-D16 and VFPv3-D32 profiles, but currently only one at
+// a time.
+#define VFPv3_D16
+#if defined(VFPv3_D16) == defined(VFPv3_D32)
+#error "Exactly one of VFPv3_D16 or VFPv3_D32 can be defined at a time."
+#endif
+
+
 enum Register {
   R0  =  0,
   R1  =  1,
@@ -29,11 +37,107 @@
   SP  = 13,
   LR  = 14,
   PC  = 15,
-  kNumberOfCoreRegisters = 16,
+  kNumberOfCpuRegisters = 16,
   kNoRegister = -1,
 };
 
 
+// Values for single-precision floating point registers.
+enum SRegister {
+  S0  =  0,
+  S1  =  1,
+  S2  =  2,
+  S3  =  3,
+  S4  =  4,
+  S5  =  5,
+  S6  =  6,
+  S7  =  7,
+  S8  =  8,
+  S9  =  9,
+  S10 = 10,
+  S11 = 11,
+  S12 = 12,
+  S13 = 13,
+  S14 = 14,
+  S15 = 15,
+  S16 = 16,
+  S17 = 17,
+  S18 = 18,
+  S19 = 19,
+  S20 = 20,
+  S21 = 21,
+  S22 = 22,
+  S23 = 23,
+  S24 = 24,
+  S25 = 25,
+  S26 = 26,
+  S27 = 27,
+  S28 = 28,
+  S29 = 29,
+  S30 = 30,
+  S31 = 31,
+  kNumberOfSRegisters = 32,
+  kNoSRegister = -1,
+};
+
+
+// Values for double-precision floating point registers.
+enum DRegister {
+  D0  =  0,
+  D1  =  1,
+  D2  =  2,
+  D3  =  3,
+  D4  =  4,
+  D5  =  5,
+  D6  =  6,
+  D7  =  7,
+  D8  =  8,
+  D9  =  9,
+  D10 = 10,
+  D11 = 11,
+  D12 = 12,
+  D13 = 13,
+  D14 = 14,
+  D15 = 15,
+#ifdef VFPv3_D16
+  kNumberOfDRegisters = 16,
+#else
+  D16 = 16,
+  D17 = 17,
+  D18 = 18,
+  D19 = 19,
+  D20 = 20,
+  D21 = 21,
+  D22 = 22,
+  D23 = 23,
+  D24 = 24,
+  D25 = 25,
+  D26 = 26,
+  D27 = 27,
+  D28 = 28,
+  D29 = 29,
+  D30 = 30,
+  D31 = 31,
+  kNumberOfDRegisters = 32,
+#endif
+  kNumberOfOverlappingDRegisters = 16,
+  kNoDRegister = -1,
+};
+
+
+// Architecture independent aliases.
+typedef DRegister FpuRegister;
+const FpuRegister FpuTMP = D0;
+const int kNumberOfFpuRegisters = kNumberOfDRegisters;
+
+
+// Register aliases.
+const Register TMP = kNoRegister;  // No scratch register used by assembler.
+const Register CTX = R9;           // Caches current context in generated code.
+const Register SPREG = SP;
+const Register FPREG = FP;
+
+
 // Values for the condition field as defined in section A3.2.
 enum Condition {
   kNoCondition = -1,
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 02a84b7..467cdac 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -51,6 +51,12 @@
 };
 
 
+// Architecture independent aliases.
+typedef XmmRegister FpuRegister;
+const FpuRegister FpuTMP = XMM0;
+const int kNumberOfFpuRegisters = kNumberOfXmmRegisters;
+
+
 // Register aliases.
 const Register TMP = kNoRegister;  // No scratch register used by assembler.
 const Register CTX = ESI;          // Caches current context in generated code.
diff --git a/runtime/vm/constants_mips.h b/runtime/vm/constants_mips.h
new file mode 100644
index 0000000..6ff56ba
--- /dev/null
+++ b/runtime/vm/constants_mips.h
@@ -0,0 +1,108 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_CONSTANTS_MIPS_H_
+#define VM_CONSTANTS_MIPS_H_
+
+namespace dart {
+
+enum Register {
+  ZR =  0,
+  AT =  1,
+  V0 =  2,
+  V1 =  3,
+  A0 =  4,
+  A1 =  5,
+  A2 =  6,
+  A3 =  7,
+  T0 =  8,
+  T1 =  9,
+  T2 = 10,
+  T3 = 11,
+  T4 = 12,
+  T5 = 13,
+  T6 = 14,
+  T7 = 15,
+  S0 = 16,
+  S1 = 17,
+  S2 = 18,
+  S3 = 19,
+  S4 = 20,
+  S5 = 21,
+  S6 = 22,
+  S7 = 23,
+  T8 = 24,
+  T9 = 25,
+  K0 = 26,
+  K1 = 27,
+  GP = 28,
+  SP = 29,
+  FP = 30,
+  RA = 31,
+  kNumberOfCpuRegisters = 32,
+  kNoRegister = -1,
+};
+
+
+// Values for double-precision floating point registers.
+enum FRegister {
+  F0  =  0,
+  F1  =  1,
+  F2  =  2,
+  F3  =  3,
+  F4  =  4,
+  F5  =  5,
+  F6  =  6,
+  F7  =  7,
+  F8  =  8,
+  F9  =  9,
+  F10 = 10,
+  F11 = 11,
+  F12 = 12,
+  F13 = 13,
+  F14 = 14,
+  F15 = 15,
+  F16 = 16,
+  F17 = 17,
+  F18 = 18,
+  F19 = 19,
+  F20 = 20,
+  F21 = 21,
+  F22 = 22,
+  F23 = 23,
+  F24 = 24,
+  F25 = 25,
+  F26 = 26,
+  F27 = 27,
+  F28 = 28,
+  F29 = 29,
+  F30 = 30,
+  F31 = 31,
+  kNumberOfFRegisters = 32,
+  kNoFRegister = -1,
+};
+
+
+// Architecture independent aliases.
+typedef FRegister FpuRegister;
+const FpuRegister FpuTMP = F0;
+const int kNumberOfFpuRegisters = kNumberOfFRegisters;
+
+
+// Register aliases.
+const Register TMP = AT;
+const Register CTX = S7;  // Caches current context in generated code.
+const Register SPREG = SP;
+const Register FPREG = FP;
+
+
+// Values for the condition field.  // UNIMPLEMENTED.
+enum Condition {
+  kNoCondition = -1,
+  kMaxCondition = 16,
+};
+
+}  // namespace dart
+
+#endif  // VM_CONSTANTS_MIPS_H_
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 38a2046..31b00b1 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -64,6 +64,12 @@
 };
 
 
+// Architecture independent aliases.
+typedef XmmRegister FpuRegister;
+const FpuRegister FpuTMP = XMM0;
+const int kNumberOfFpuRegisters = kNumberOfXmmRegisters;
+
+
 enum RexBits {
   REX_NONE   = 0,
   REX_B      = 1 << 0,
diff --git a/runtime/vm/cpu_mips.cc b/runtime/vm/cpu_mips.cc
new file mode 100644
index 0000000..06aa026
--- /dev/null
+++ b/runtime/vm/cpu_mips.cc
@@ -0,0 +1,29 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+
+#if defined(TARGET_ARCH_MIPS)
+
+#if defined(HOST_ARCH_MIPS)
+#include <sys/syscall.h>  /* NOLINT */
+#include <unistd.h>  /* NOLINT */
+#endif
+
+#include "vm/cpu.h"
+
+namespace dart {
+
+void CPU::FlushICache(uword start, uword size) {
+  UNIMPLEMENTED();
+}
+
+
+const char* CPU::Id() {
+  return "mips";
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/cpu_test.cc b/runtime/vm/cpu_test.cc
index 3b2b07b..6f129fe 100644
--- a/runtime/vm/cpu_test.cc
+++ b/runtime/vm/cpu_test.cc
@@ -16,6 +16,8 @@
   EXPECT_STREQ("x64", CPU::Id());
 #elif defined(TARGET_ARCH_ARM)
   EXPECT_STREQ("arm", CPU::Id());
+#elif defined(TARGET_ARCH_MIPS)
+  EXPECT_STREQ("mips", CPU::Id());
 #else
 #error Architecture was not detected as supported by Dart.
 #endif
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index f70a9699..405e416 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -155,13 +155,13 @@
   String& url = String::Handle();
   String& source = String::Handle();
   for (int i = 0; i < lib_count; i++) {
-    lib ^= libs.At(i);
+    lib |= libs.At(i);
     url = lib.url();
     OS::Print("Library %s:\n", url.ToCString());
     scripts = lib.LoadedScripts();
     intptr_t script_count = scripts.Length();
     for (intptr_t i = 0; i < script_count; i++) {
-      script ^= scripts.At(i);
+      script |= scripts.At(i);
       url = script.url();
       source = script.Source();
       OS::Print("Source for %s:\n", url.ToCString());
@@ -214,7 +214,10 @@
   }
 
   StubCode::Init(isolate);
+  // TODO(regis): Reenable this code for arm and mips when possible.
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
   isolate->megamorphic_cache_table()->InitMissHandler();
+#endif
   if (FLAG_heap_trace) {
     isolate->heap()->trace()->Init(isolate);
   }
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 03816fc..9c673b3 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1104,15 +1104,19 @@
   ASSERT(!isolate_lib.IsNull());
   const String& class_name = String::Handle(
       isolate, isolate_lib.PrivateName(Symbols::_ReceivePortImpl()));
+  // TODO(asiva): Symbols should contain private keys.
+  const String& function_name =
+      String::Handle(isolate_lib.PrivateName(Symbols::_get_or_create()));
   const int kNumArguments = 1;
   const Function& function = Function::Handle(
       isolate,
       Resolver::ResolveStatic(isolate_lib,
                               class_name,
-                              Symbols::_get_or_create(),
+                              function_name,
                               kNumArguments,
                               Object::empty_array(),
                               Resolver::kIsQualified));
+  ASSERT(!function.IsNull());
   const Array& args = Array::Handle(isolate, Array::New(kNumArguments));
   args.SetAt(0, Integer::Handle(isolate, Integer::New(port_id)));
   return Api::NewHandle(isolate, DartEntry::InvokeStatic(function, args));
@@ -2730,12 +2734,13 @@
     // Some special types like 'dynamic' have a null functions list.
     if (!func_array.IsNull()) {
       for (intptr_t i = 0; i < func_array.Length(); ++i) {
-        func ^= func_array.At(i);
+        func |= func_array.At(i);
 
         // Skip implicit getters and setters.
         if (func.kind() == RawFunction::kImplicitGetter ||
             func.kind() == RawFunction::kImplicitSetter ||
-            func.kind() == RawFunction::kConstImplicitGetter) {
+            func.kind() == RawFunction::kConstImplicitGetter ||
+            func.kind() == RawFunction::kMethodExtractor) {
           continue;
         }
 
@@ -2750,7 +2755,7 @@
     while (it.HasNext()) {
       obj = it.GetNext();
       if (obj.IsFunction()) {
-        func ^= obj.raw();
+        func |= obj.raw();
         name = func.UserVisibleName();
         names.Add(name);
       }
@@ -2783,7 +2788,7 @@
     const Class& cls = Class::Cast(obj);
 
     // Case 1.  Lookup the unmodified function name.
-    func = cls.LookupFunction(func_name);
+    func = cls.LookupFunctionAllowPrivate(func_name);
 
     // Case 2.  Lookup the function without the external setter suffix
     // '='.  Make sure to do this check after the regular lookup, so
@@ -2791,20 +2796,20 @@
     if (func.IsNull() && HasExternalSetterSuffix(func_name)) {
       tmp_name = RemoveExternalSetterSuffix(func_name);
       tmp_name = Field::SetterName(tmp_name);
-      func = cls.LookupFunction(tmp_name);
+      func = cls.LookupFunctionAllowPrivate(tmp_name);
     }
 
     // Case 3.  Lookup the funciton with the getter prefix prepended.
     if (func.IsNull()) {
       tmp_name = Field::GetterName(func_name);
-      func = cls.LookupFunction(tmp_name);
+      func = cls.LookupFunctionAllowPrivate(tmp_name);
     }
 
     // Case 4.  Lookup the function with a . appended to find the
     // unnamed constructor.
     if (func.IsNull()) {
       tmp_name = String::Concat(func_name, Symbols::Dot());
-      func = cls.LookupFunction(tmp_name);
+      func = cls.LookupFunctionAllowPrivate(tmp_name);
     }
   } else if (obj.IsLibrary()) {
     const Library& lib = Library::Cast(obj);
@@ -3073,7 +3078,7 @@
     // allocated in the vm isolate.
     if (!field_array.IsNull()) {
       for (intptr_t i = 0; i < field_array.Length(); ++i) {
-        field ^= field_array.At(i);
+        field |= field_array.At(i);
         name = field.UserVisibleName();
         names.Add(name);
       }
@@ -3085,7 +3090,7 @@
     while (it.HasNext()) {
       obj = it.GetNext();
       if (obj.IsField()) {
-        field ^= obj.raw();
+        field |= obj.raw();
         name = field.UserVisibleName();
         names.Add(name);
       }
@@ -3299,7 +3304,7 @@
   // The constructor must be present in the interface.
   String& constr_name = String::Handle(String::Concat(class_name, dotted_name));
   const Function& constructor =
-      Function::Handle(cls.LookupFunction(constr_name));
+      Function::Handle(cls.LookupFunctionAllowPrivate(constr_name));
   if (constructor.IsNull() ||
       (!constructor.IsConstructor() && !constructor.IsFactory())) {
     const String& lookup_class_name = String::Handle(cls.Name());
@@ -3388,7 +3393,7 @@
   // TODO(turnidge): Support redirecting factories.
   ASSERT(result.IsFunction());
   Function& constructor = Function::Handle(isolate);
-  constructor ^= result.raw();
+  constructor |= result.raw();
 
   Instance& new_object = Instance::Handle(isolate);
   if (constructor.IsConstructor()) {
@@ -3611,7 +3616,7 @@
     while (!cls.IsNull()) {
       String& getter_name =
           String::Handle(isolate, Field::GetterName(field_name));
-      getter = cls.LookupDynamicFunction(getter_name);
+      getter = cls.LookupDynamicFunctionAllowPrivate(getter_name);
       if (!getter.IsNull()) {
         break;
       }
@@ -3642,7 +3647,7 @@
     if (field.IsNull() || FieldIsUninitialized(isolate, field)) {
       const String& getter_name =
           String::Handle(isolate, Field::GetterName(field_name));
-      getter = cls.LookupStaticFunction(getter_name);
+      getter = cls.LookupStaticFunctionAllowPrivate(getter_name);
     }
 
     if (!getter.IsNull()) {
@@ -3674,7 +3679,7 @@
       const Class& cls = Class::Handle(isolate, field.owner());
       const String& getter_name =
           String::Handle(isolate, Field::GetterName(field_name));
-      getter = cls.LookupStaticFunction(getter_name);
+      getter = cls.LookupStaticFunctionAllowPrivate(getter_name);
     }
 
     if (!getter.IsNull()) {
@@ -3737,7 +3742,7 @@
       }
       String& setter_name =
           String::Handle(isolate, Field::SetterName(field_name));
-      setter = cls.LookupDynamicFunction(setter_name);
+      setter = cls.LookupDynamicFunctionAllowPrivate(setter_name);
       if (!setter.IsNull()) {
         break;
       }
@@ -3764,7 +3769,7 @@
     if (field.IsNull()) {
       String& setter_name =
           String::Handle(isolate, Field::SetterName(field_name));
-      setter = cls.LookupStaticFunction(setter_name);
+      setter = cls.LookupStaticFunctionAllowPrivate(setter_name);
     }
 
     if (!setter.IsNull()) {
@@ -3801,7 +3806,7 @@
     if (field.IsNull()) {
       const String& setter_name =
           String::Handle(isolate, Field::SetterName(field_name));
-      setter ^= lib.LookupFunctionAllowPrivate(setter_name);
+      setter |= lib.LookupFunctionAllowPrivate(setter_name);
     }
 
     if (!setter.IsNull()) {
@@ -4175,7 +4180,7 @@
     return Api::NewError("%s: Unable to deserialize snapshot correctly.",
                          CURRENT_FUNC);
   }
-  library ^= tmp.raw();
+  library |= tmp.raw();
   library.set_debuggable(true);
   isolate->object_store()->set_root_library(library);
   return Api::NewHandle(isolate, library.raw());
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index c015db9..ec3e94c 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -1248,7 +1248,7 @@
     const String& str1 = String::Handle(String::New("Test String"));
     Dart_Handle ref = Api::NewHandle(isolate, str1.raw());
     String& str2 = String::Handle();
-    str2 ^= Api::UnwrapHandle(ref);
+    str2 |= Api::UnwrapHandle(ref);
     EXPECT(str1.Equals(str2));
   }
   Dart_ExitScope();
@@ -1297,22 +1297,22 @@
     DARTSCOPE_NOCHECKS(isolate);
     for (int i = 0; i < 500; i++) {
       String& str = String::Handle();
-      str ^= Api::UnwrapHandle(handles[i]);
+      str |= Api::UnwrapHandle(handles[i]);
       EXPECT(str.Equals(kTestString1));
     }
     for (int i = 500; i < 1000; i++) {
       String& str = String::Handle();
-      str ^= Api::UnwrapHandle(handles[i]);
+      str |= Api::UnwrapHandle(handles[i]);
       EXPECT(str.Equals(kTestString2));
     }
     for (int i = 1000; i < 1500; i++) {
       String& str = String::Handle();
-      str ^= Api::UnwrapHandle(handles[i]);
+      str |= Api::UnwrapHandle(handles[i]);
       EXPECT(str.Equals(kTestString1));
     }
     for (int i = 1500; i < 2000; i++) {
       String& str = String::Handle();
-      str ^= Api::UnwrapHandle(handles[i]);
+      str |= Api::UnwrapHandle(handles[i]);
       EXPECT(str.Equals(kTestString2));
     }
   }
@@ -2255,7 +2255,7 @@
     }
     EXPECT_EQ(100, state->CountLocalHandles());
     for (int i = 0; i < 100; i++) {
-      val ^= Api::UnwrapHandle(handles[i]);
+      val |= Api::UnwrapHandle(handles[i]);
       EXPECT_EQ(i, val.Value());
     }
     // Start another scope and allocate some more local handles.
@@ -2266,7 +2266,7 @@
       }
       EXPECT_EQ(200, state->CountLocalHandles());
       for (int i = 100; i < 200; i++) {
-        val ^= Api::UnwrapHandle(handles[i]);
+        val |= Api::UnwrapHandle(handles[i]);
         EXPECT_EQ(i, val.Value());
       }
 
@@ -2278,7 +2278,7 @@
         }
         EXPECT_EQ(300, state->CountLocalHandles());
         for (int i = 200; i < 300; i++) {
-          val ^= Api::UnwrapHandle(handles[i]);
+          val |= Api::UnwrapHandle(handles[i]);
           EXPECT_EQ(i, val.Value());
         }
         EXPECT_EQ(300, state->CountLocalHandles());
@@ -3617,6 +3617,15 @@
 }
 
 
+static Dart_Handle PrivateLibName(Dart_Handle lib, const char* str) {
+  EXPECT(Dart_IsLibrary(lib));
+  Isolate* isolate = Isolate::Current();
+  const Library& library_obj = Api::UnwrapLibraryHandle(isolate, lib);
+  const String& name = String::Handle(String::New(str));
+  return Api::NewHandle(isolate, library_obj.PrivateName(name));
+}
+
+
 TEST_CASE(Invoke) {
   const char* kScriptChars =
       "class BaseMethods {\n"
@@ -3666,8 +3675,7 @@
   EXPECT_ERROR(Dart_Invoke(instance, name, 2, bad_args),
                "did not find instance method 'Methods.instanceMethod'");
 
-  // Hidden instance method.
-  name = NewString("_instanceMethod");
+  name = PrivateLibName(lib, "_instanceMethod");
   EXPECT(Dart_IsError(Dart_Invoke(lib, name, 1, args)));
   EXPECT(Dart_IsError(Dart_Invoke(cls, name, 1, args)));
   result = Dart_Invoke(instance, name, 1, args);
@@ -3698,7 +3706,7 @@
                "did not find static method 'Methods.staticMethod'");
 
   // Hidden static method.
-  name = NewString("_staticMethod");
+  name = PrivateLibName(lib, "_staticMethod");
   EXPECT(Dart_IsError(Dart_Invoke(lib, name, 1, args)));
   EXPECT(Dart_IsError(Dart_Invoke(instance, name, 1, args)));
   result = Dart_Invoke(cls, name, 1, args);
@@ -3727,7 +3735,7 @@
                "2 passed, 1 expected.");
 
   // Hidden top-level method.
-  name = NewString("_topMethod");
+  name = PrivateLibName(lib, "_topMethod");
   EXPECT(Dart_IsError(Dart_Invoke(cls, name, 1, args)));
   EXPECT(Dart_IsError(Dart_Invoke(instance, name, 1, args)));
   result = Dart_Invoke(lib, name, 1, args);
@@ -4289,12 +4297,12 @@
       "  static set j(x) {}\n"
       "  static get _k => 'k';\n"
       "  static set _l(x) {}\n"
-      "  abstract m();\n"
-      "  abstract _n();\n"
-      "  abstract get o;\n"
-      "  abstract set p(x);\n"
-      "  abstract get _q;\n"
-      "  abstract set _r(x);\n"
+      "  m();\n"
+      "  _n();\n"
+      "  get o;\n"
+      "  set p(x);\n"
+      "  get _q;\n"
+      "  set _r(x);\n"
       "  s(x, [y, z]) {}\n"
       "  t([x, y, z]) {}\n"
       "  operator ==(x) {}\n"
@@ -7070,7 +7078,7 @@
   {
     DARTSCOPE_NOCHECKS(isolate);
     String& handle = String::Handle();
-    handle ^= Api::UnwrapHandle(str);
+    handle |= Api::UnwrapHandle(str);
     EXPECT(handle.IsOld());
   }
   EXPECT_VALID(Dart_GetPeer(str, &out));
@@ -7443,6 +7451,71 @@
   EXPECT_VALID(result);
 }
 
+
+// Test external strings and optimized code.
+static void ExternalStringDeoptimize_Finalize(void* peer) {
+  delete[] reinterpret_cast<char*>(peer);
+}
+
+
+static void A_change_str_native(Dart_NativeArguments args) {
+  Dart_EnterScope();
+  Dart_Handle str = Dart_GetNativeArgument(args, 0);
+  EXPECT(Dart_IsString(str));
+  intptr_t size = 0;
+  EXPECT_VALID(Dart_StringStorageSize(str, &size));
+  char* str_data = new char[size];
+  Dart_Handle result =
+      Dart_MakeExternalString(str,
+                              str_data,
+                              size,
+                              str_data,
+                              &ExternalStringDeoptimize_Finalize);
+  EXPECT_VALID(result);
+  Dart_ExitScope();
+}
+
+
+static Dart_NativeFunction ExternalStringDeoptimize_native_lookup(
+    Dart_Handle name, int argument_count) {
+  return reinterpret_cast<Dart_NativeFunction>(&A_change_str_native);
+}
+
+
+TEST_CASE(ExternalStringDeoptimize) {
+  const char* kScriptChars =
+      "String str = 'A';\n"
+      "class A {\n"
+      "  static change_str(String s) native 'A_change_str';\n"
+      "}\n"
+      "sum_chars(String s, bool b) {\n"
+      "  var result = 0;\n"
+      "  for (var i = 0; i < s.length; i++) {\n"
+      "    if (b && i == 0) A.change_str(str);\n"
+      "    result += s.charCodeAt(i);"
+      "  }\n"
+      "  return result;\n"
+      "}\n"
+      "main() {\n"
+      "  str = '$str$str';\n"
+      "  for (var i = 0; i < 2000; i++) sum_chars(str, false);\n"
+      "  var x = sum_chars(str, false);\n"
+      "  var y = sum_chars(str, true);\n"
+      "  return x + y;\n"
+      "}\n";
+  Dart_Handle lib =
+      TestCase::LoadTestScript(kScriptChars,
+                               &ExternalStringDeoptimize_native_lookup);
+  Dart_Handle result = Dart_Invoke(lib,
+                                   NewString("main"),
+                                   0,
+                                   NULL);
+  int64_t value = 0;
+  result = Dart_IntegerToInt64(result, &value);
+  EXPECT_VALID(result);
+  EXPECT_EQ(260, value);
+}
+
 #endif  // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64).
 
 }  // namespace dart
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 5a0c42f..3461a53 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -148,12 +148,16 @@
   ASSERT(receiver.raw() == arguments.At(0));
   // Allocate an InvocationMirror object.
   const Library& core_lib = Library::Handle(Library::CoreLibrary());
+
   Class& invocation_mirror_class = Class::Handle(
-      core_lib.LookupClassAllowPrivate(Symbols::InvocationMirror()));
+      core_lib.LookupClass(
+          String::Handle(core_lib.PrivateName(Symbols::InvocationMirror()))));
   ASSERT(!invocation_mirror_class.IsNull());
+  const String& function_name =
+      String::Handle(core_lib.PrivateName(Symbols::AllocateInvocationMirror()));
   const Function& allocation_function = Function::Handle(
       Resolver::ResolveStaticByName(invocation_mirror_class,
-                                    Symbols::AllocateInvocationMirror(),
+                                    function_name,
                                     Resolver::kIsQualified));
   ASSERT(!allocation_function.IsNull());
   const int kNumAllocationArgs = 3;
@@ -243,7 +247,7 @@
   String& name = String::Handle();
   Smi& pos = Smi::Handle();
   for (intptr_t i = 0; i < num_named_args; i++) {
-    name ^= optional_arguments_names.At(i);
+    name |= optional_arguments_names.At(i);
     pos = Smi::New(num_pos_args + i);
     intptr_t insert_index = kFirstNamedEntryIndex + (kNamedEntrySize * i);
     // Shift already inserted pairs with "larger" names.
@@ -251,11 +255,11 @@
     Smi& previous_pos = Smi::Handle();
     while (insert_index > kFirstNamedEntryIndex) {
       intptr_t previous_index = insert_index - kNamedEntrySize;
-      previous_name ^= descriptor.At(previous_index + kNameOffset);
+      previous_name |= descriptor.At(previous_index + kNameOffset);
       intptr_t result = name.CompareTo(previous_name);
       ASSERT(result != 0);  // Duplicate argument names checked in parser.
       if (result > 0) break;
-      previous_pos ^= descriptor.At(previous_index + kPositionOffset);
+      previous_pos |= descriptor.At(previous_index + kPositionOffset);
       descriptor.SetAt(insert_index + kNameOffset, previous_name);
       descriptor.SetAt(insert_index + kPositionOffset, previous_pos);
       insert_index = previous_index;
@@ -401,9 +405,11 @@
     ASSERT(!isolate_lib.IsNull());
     const String& class_name =
         String::Handle(isolate_lib.PrivateName(Symbols::_ReceivePortImpl()));
+    const String& function_name =
+        String::Handle(isolate_lib.PrivateName(Symbols::_lookupReceivePort()));
     function = Resolver::ResolveStatic(isolate_lib,
                                        class_name,
-                                       Symbols::_lookupReceivePort(),
+                                       function_name,
                                        kNumArguments,
                                        Object::empty_array(),
                                        Resolver::kIsQualified);
@@ -430,9 +436,11 @@
     ASSERT(!isolate_lib.IsNull());
     const String& class_name =
         String::Handle(isolate_lib.PrivateName(Symbols::_ReceivePortImpl()));
+    const String& function_name =
+        String::Handle(isolate_lib.PrivateName(Symbols::_handleMessage()));
     function = Resolver::ResolveStatic(isolate_lib,
                                        class_name,
-                                       Symbols::_handleMessage(),
+                                       function_name,
                                        kNumArguments,
                                        Object::empty_array(),
                                        Resolver::kIsQualified);
@@ -455,10 +463,12 @@
   const String& class_name =
       String::Handle(isolate_lib.PrivateName(Symbols::_SendPortImpl()));
   const int kNumArguments = 1;
+  const String& function_name =
+      String::Handle(isolate_lib.PrivateName(Symbols::_create()));
   const Function& function = Function::Handle(
       Resolver::ResolveStatic(isolate_lib,
                               class_name,
-                              Symbols::_create(),
+                              function_name,
                               kNumArguments,
                               Object::empty_array(),
                               Resolver::kIsQualified));
@@ -490,7 +500,10 @@
 
 RawObject* DartLibraryCalls::PortGetId(const Instance& port) {
   const Class& cls = Class::Handle(port.clazz());
-  const String& func_name = String::Handle(Field::GetterName(Symbols::_id()));
+  const Library& isolate_lib = Library::Handle(Library::IsolateLibrary());
+  const String& func_name =
+      String::Handle(isolate_lib.PrivateName(
+          String::Handle(Field::GetterName(Symbols::_id()))));
   const Function& func = Function::Handle(cls.LookupDynamicFunction(func_name));
   ASSERT(!func.IsNull());
   const Array& args = Array::Handle(Array::New(1));
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 284a2e1..b913f7f 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -301,6 +301,12 @@
 }
 
 
+intptr_t ActivationFrame::TryIndex() {
+  intptr_t desc_index = PcDescIndex();
+  return pc_desc_.TryIndex(desc_index);
+}
+
+
 intptr_t ActivationFrame::LineNumber() {
   // Compute line number lazily since it causes scanning of the script.
   if (line_number_ < 0) {
@@ -372,6 +378,44 @@
 }
 
 
+ActivationFrame* DebuggerStackTrace::GetHandlerFrame(
+    const Instance& exc_obj) const {
+  ExceptionHandlers& handlers = ExceptionHandlers::Handle();
+  Array& handled_types = Array::Handle();
+  AbstractType& type = Type::Handle();
+  const TypeArguments& no_instantiator = TypeArguments::Handle();
+  for (int frame_index = 0; frame_index < Length(); frame_index++) {
+    ActivationFrame* frame = trace_[frame_index];
+    intptr_t try_index = frame->TryIndex();
+    if (try_index < 0) continue;
+    const Code& code = frame->DartCode();
+    handlers = code.exception_handlers();
+    ASSERT(!handlers.IsNull());
+    intptr_t num_handlers_checked = 0;
+    while (try_index >= 0) {
+      // Detect circles in the exception handler data.
+      num_handlers_checked++;
+      ASSERT(num_handlers_checked <= handlers.Length());
+      handled_types = handlers.GetHandledTypes(try_index);
+      const intptr_t num_types = handled_types.Length();
+      for (int k = 0; k < num_types; k++) {
+        type ^= handled_types.At(k);
+        ASSERT(!type.IsNull());
+        // Uninstantiated types are not added to ExceptionHandlers data.
+        ASSERT(type.IsInstantiated());
+        if (type.IsDynamicType()) return frame;
+        if (type.IsMalformed()) continue;
+        if (exc_obj.IsInstanceOf(type, no_instantiator, NULL)) {
+          return frame;
+        }
+      }
+      try_index = handlers.OuterTryIndex(try_index);
+    }
+  }
+  return NULL;
+}
+
+
 void ActivationFrame::GetDescIndices() {
   if (vars_initialized_) {
     return;
@@ -464,7 +508,7 @@
   ASSERT(i < desc_indices_.length());
   intptr_t desc_index = desc_indices_[i];
   ASSERT(name != NULL);
-  *name ^= var_descriptors_.GetName(desc_index);
+  *name |= var_descriptors_.GetName(desc_index);
   RawLocalVarDescriptors::VarInfo var_info;
   var_descriptors_.GetInfo(desc_index, &var_info);
   ASSERT(token_pos != NULL);
@@ -780,7 +824,7 @@
       functions = cls.functions();
       intptr_t num_functions = functions.IsNull() ? 0 : functions.Length();
       for (intptr_t f = 0; f < num_functions; f++) {
-        function ^= functions.At(f);
+        function |= functions.At(f);
         ASSERT(!function.IsNull());
         if (function.HasOptimizedCode()) {
           function.SwitchToUnoptimizedCode();
@@ -866,31 +910,29 @@
 }
 
 
-// TODO(hausner): Determine whether the exception is handled or not.
 bool Debugger::ShouldPauseOnException(DebuggerStackTrace* stack_trace,
-                                      const Object& exc) {
+                                      const Instance& exc) {
   if (exc_pause_info_ == kNoPauseOnExceptions) {
     return false;
   }
-  if ((exc_pause_info_ & kPauseOnAllExceptions) != 0) {
+  if (exc_pause_info_ == kPauseOnAllExceptions) {
     return true;
   }
-  // Assume TypeError and AssertionError exceptions are unhandled.
-  const Class& exc_class = Class::Handle(exc.clazz());
-  const String& class_name = String::Handle(exc_class.Name());
-  // TODO(hausner): Note the poor man's type test. This code will go
-  // away when we have a way to determine whether an exception is unhandled.
-  if (class_name.Equals("TypeErrorImplementation")) {
-    return true;
-  }
-  if (class_name.Equals("AssertionErrorImplementation")) {
+  ASSERT(exc_pause_info_ == kPauseOnUnhandledExceptions);
+  ActivationFrame* handler_frame = stack_trace->GetHandlerFrame(exc);
+  if (handler_frame == NULL) {
+    // Did not find an exception handler that catches this exception.
+    // Note that this check is not precise, since we can't check
+    // uninstantiated types, i.e. types containing type parameters.
+    // Thus, we may report an exception as unhandled when in fact
+    // it will be caught once we unwind the stack.
     return true;
   }
   return false;
 }
 
 
-void Debugger::SignalExceptionThrown(const Object& exc) {
+void Debugger::SignalExceptionThrown(const Instance& exc) {
   // We ignore this exception event when the VM is executing code invoked
   // by the debugger to evaluate variables values, when we see a nested
   // breakpoint or exception event, or if the debugger is not
@@ -1100,7 +1142,7 @@
   const GrowableObjectArray& libs =
       GrowableObjectArray::Handle(isolate_->object_store()->libraries());
   for (int i = 0; i < libs.Length(); i++) {
-    lib ^= libs.At(i);
+    lib |= libs.At(i);
     script = lib.LookupScript(script_url);
     if (!script.IsNull()) {
       break;
@@ -1235,7 +1277,7 @@
   while (!cls.IsNull()) {
     fields = cls.fields();
     for (int i = 0; i < fields.Length(); i++) {
-      field ^= fields.At(i);
+      field |= fields.At(i);
       if (!field.is_static()) {
         field_name = field.name();
         field_list.Add(field_name);
@@ -1257,7 +1299,7 @@
   String& field_name = String::Handle();
   Object& field_value = Object::Handle();
   for (int i = 0; i < fields.Length(); i++) {
-    field ^= fields.At(i);
+    field |= fields.At(i);
     if (field.is_static()) {
       field_name = field.name();
       field_value = GetStaticField(cls, field_name);
@@ -1282,7 +1324,7 @@
   while (it.HasNext()) {
     entry = it.GetNext();
     if (entry.IsField()) {
-      field ^= entry.raw();
+      field |= entry.raw();
       cls = field.owner();
       ASSERT(field.is_static());
       field_name = field.name();
@@ -1368,7 +1410,8 @@
   RawFunction::Kind fkind = func.kind();
   if ((fkind == RawFunction::kImplicitGetter) ||
       (fkind == RawFunction::kImplicitSetter) ||
-      (fkind == RawFunction::kConstImplicitGetter)) {
+      (fkind == RawFunction::kConstImplicitGetter) ||
+      (fkind == RawFunction::kMethodExtractor)) {
     return false;
   }
   const Class& cls = Class::Handle(func.Owner());
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index 14627b6..04b5fcb 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -154,6 +154,7 @@
 
  private:
   intptr_t PcDescIndex();
+  intptr_t TryIndex();
   void GetPcDescriptors();
   void GetVarDescriptors();
   void GetDescIndices();
@@ -180,6 +181,7 @@
   PcDescriptors& pc_desc_;
 
   friend class Debugger;
+  friend class DebuggerStackTrace;
   DISALLOW_COPY_AND_ASSIGN(ActivationFrame);
 };
 
@@ -196,6 +198,7 @@
     ASSERT(i < trace_.length());
     return trace_[i];
   }
+  ActivationFrame* GetHandlerFrame(const Instance& exc_obj) const;
  private:
   void AddActivation(ActivationFrame* frame);
   ZoneGrowableArray<ActivationFrame*> trace_;
@@ -293,7 +296,7 @@
                             const String& field_name);
 
   void SignalBpReached();
-  void SignalExceptionThrown(const Object& exc);
+  void SignalExceptionThrown(const Instance& exc);
   static void SignalIsolateEvent(EventType type);
 
  private:
@@ -332,7 +335,7 @@
   intptr_t nextId() { return next_id_++; }
 
   bool ShouldPauseOnException(DebuggerStackTrace* stack_trace,
-                              const Object& exc);
+                              const Instance& exc);
 
   void CollectLibraryFields(const GrowableObjectArray& field_list,
                             const Library& lib,
diff --git a/runtime/vm/debugger_api_impl.cc b/runtime/vm/debugger_api_impl.cc
index d4687d1..d4f9d0a 100644
--- a/runtime/vm/debugger_api_impl.cc
+++ b/runtime/vm/debugger_api_impl.cc
@@ -574,7 +574,7 @@
   Script& script = Script::Handle();
   String& url = String::Handle();
   for (int i = 0; i < num_scripts; i++) {
-    script ^= loaded_scripts.At(i);
+    script |= loaded_scripts.At(i);
     url = script.url();
     script_list.SetAt(i, url);
   }
@@ -595,7 +595,7 @@
   Library &lib = Library::Handle();
   const Array& library_id_list = Array::Handle(Array::New(num_libs));
   for (int i = 0; i < num_libs; i++) {
-    lib ^= libs.At(i);
+    lib |= libs.At(i);
     ASSERT(!lib.IsNull());
     ASSERT(Smi::IsValid(lib.index()));
     library_id_list.SetAt(i, Smi::Handle(Smi::New(lib.index())));
@@ -670,7 +670,7 @@
   String& lib_url = String::Handle();
   const Array& library_url_list = Array::Handle(Array::New(num_libs));
   for (int i = 0; i < num_libs; i++) {
-    lib ^= libs.At(i);
+    lib |= libs.At(i);
     ASSERT(!lib.IsNull());
     lib_url = lib.url();
     library_url_list.SetAt(i, lib_url);
diff --git a/runtime/vm/debugger_mips.cc b/runtime/vm/debugger_mips.cc
new file mode 100644
index 0000000..68acf9c
--- /dev/null
+++ b/runtime/vm/debugger_mips.cc
@@ -0,0 +1,36 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_MIPS)
+
+#include "vm/debugger.h"
+
+namespace dart {
+
+RawInstance* ActivationFrame::GetLocalVarValue(intptr_t slot_index) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+RawInstance* ActivationFrame::GetInstanceCallReceiver(
+                 intptr_t num_actual_args) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CodeBreakpoint::PatchFunctionReturn() {
+  UNIMPLEMENTED();
+}
+
+
+void CodeBreakpoint::RestoreFunctionReturn() {
+  UNIMPLEMENTED();
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index 1de66d0..d393088 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -27,14 +27,14 @@
       from_frame_(NULL),
       from_frame_size_(0),
       registers_copy_(NULL),
-      xmm_registers_copy_(NULL),
+      fpu_registers_copy_(NULL),
       num_args_(num_args),
       deopt_reason_(deopt_reason),
       isolate_(Isolate::Current()) {
   from_frame_ = isolate_->deopt_frame_copy();
   from_frame_size_ = isolate_->deopt_frame_copy_size();
   registers_copy_ = isolate_->deopt_cpu_registers_copy();
-  xmm_registers_copy_ = isolate_->deopt_xmm_registers_copy();
+  fpu_registers_copy_ = isolate_->deopt_fpu_registers_copy();
   caller_fp_ = GetFromFp();
 }
 
@@ -202,7 +202,7 @@
 
   void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) {
     Function& function = Function::Handle(deopt_context->isolate());
-    function ^= deopt_context->ObjectAt(object_table_index_);
+    function |= deopt_context->ObjectAt(object_table_index_);
     const Code& code =
         Code::Handle(deopt_context->isolate(), function.unoptimized_code());
     uword continue_at_pc = code.GetDeoptAfterPcAtDeoptId(deopt_id_);
@@ -261,14 +261,13 @@
 
   void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) {
     Function& function = Function::Handle(deopt_context->isolate());
-    function ^= deopt_context->ObjectAt(object_table_index_);
+    function |= deopt_context->ObjectAt(object_table_index_);
     const Code& code =
         Code::Handle(deopt_context->isolate(), function.unoptimized_code());
     uword continue_at_pc = code.GetDeoptBeforePcAtDeoptId(deopt_id_);
     intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index);
     *to_addr = continue_at_pc;
 
-
     uword pc = code.GetPcForDeoptId(deopt_id_, PcDescriptors::kIcCall);
     if (pc != 0) {
       // If the deoptimization happened at an IC call, update the IC data
@@ -354,20 +353,20 @@
 
 
 // Deoptimization instruction moving an XMM register.
-class DeoptXmmRegisterInstr: public DeoptInstr {
+class DeoptFpuRegisterInstr: public DeoptInstr {
  public:
-  explicit DeoptXmmRegisterInstr(intptr_t reg_as_int)
-      : reg_(static_cast<XmmRegister>(reg_as_int)) {}
+  explicit DeoptFpuRegisterInstr(intptr_t reg_as_int)
+      : reg_(static_cast<FpuRegister>(reg_as_int)) {}
 
   virtual intptr_t from_index() const { return static_cast<intptr_t>(reg_); }
-  virtual DeoptInstr::Kind kind() const { return kXmmRegister; }
+  virtual DeoptInstr::Kind kind() const { return kFpuRegister; }
 
   virtual const char* ToCString() const {
-    return Assembler::XmmRegisterName(reg_);
+    return Assembler::FpuRegisterName(reg_);
   }
 
   void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) {
-    double value = deopt_context->XmmRegisterValue(reg_);
+    double value = deopt_context->FpuRegisterValue(reg_);
     intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index);
     *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0);
     Isolate::Current()->DeferDoubleMaterialization(
@@ -375,31 +374,31 @@
   }
 
  private:
-  const XmmRegister reg_;
+  const FpuRegister reg_;
 
-  DISALLOW_COPY_AND_ASSIGN(DeoptXmmRegisterInstr);
+  DISALLOW_COPY_AND_ASSIGN(DeoptFpuRegisterInstr);
 };
 
 
-class DeoptInt64XmmRegisterInstr: public DeoptInstr {
+class DeoptInt64FpuRegisterInstr: public DeoptInstr {
  public:
-  explicit DeoptInt64XmmRegisterInstr(intptr_t reg_as_int)
-      : reg_(static_cast<XmmRegister>(reg_as_int)) {}
+  explicit DeoptInt64FpuRegisterInstr(intptr_t reg_as_int)
+      : reg_(static_cast<FpuRegister>(reg_as_int)) {}
 
   virtual intptr_t from_index() const { return static_cast<intptr_t>(reg_); }
-  virtual DeoptInstr::Kind kind() const { return kInt64XmmRegister; }
+  virtual DeoptInstr::Kind kind() const { return kInt64FpuRegister; }
 
   virtual const char* ToCString() const {
     const char* format = "%s(m)";
     intptr_t len =
-        OS::SNPrint(NULL, 0, format, Assembler::XmmRegisterName(reg_));
+        OS::SNPrint(NULL, 0, format, Assembler::FpuRegisterName(reg_));
     char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
-    OS::SNPrint(chars, len + 1, format, Assembler::XmmRegisterName(reg_));
+    OS::SNPrint(chars, len + 1, format, Assembler::FpuRegisterName(reg_));
     return chars;
   }
 
   void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) {
-    int64_t value = deopt_context->XmmRegisterValueAsInt64(reg_);
+    int64_t value = deopt_context->FpuRegisterValueAsInt64(reg_);
     intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index);
     *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0);
     if (Smi::IsValid64(value)) {
@@ -412,9 +411,9 @@
   }
 
  private:
-  const XmmRegister reg_;
+  const FpuRegister reg_;
 
-  DISALLOW_COPY_AND_ASSIGN(DeoptInt64XmmRegisterInstr);
+  DISALLOW_COPY_AND_ASSIGN(DeoptInt64FpuRegisterInstr);
 };
 
 
@@ -440,7 +439,7 @@
 
   void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) {
     Function& function = Function::Handle(deopt_context->isolate());
-    function ^= deopt_context->ObjectAt(object_table_index_);
+    function |= deopt_context->ObjectAt(object_table_index_);
     const Code& code =
         Code::Handle(deopt_context->isolate(), function.unoptimized_code());
     ASSERT(!code.IsNull());
@@ -586,7 +585,7 @@
   DeoptRetAfterAddressInstr::GetEncodedValues(from_index,
                                               &object_table_index,
                                               &deopt_id);
-  *func ^= object_table.At(object_table_index);
+  *func |= object_table.At(object_table_index);
   const Code& code = Code::Handle(func->unoptimized_code());
   return code.GetDeoptAfterPcAtDeoptId(deopt_id);
 }
@@ -602,8 +601,8 @@
     case kRetBeforeAddress: return new DeoptRetBeforeAddressInstr(from_index);
     case kConstant: return new DeoptConstantInstr(from_index);
     case kRegister: return new DeoptRegisterInstr(from_index);
-    case kXmmRegister: return new DeoptXmmRegisterInstr(from_index);
-    case kInt64XmmRegister: return new DeoptInt64XmmRegisterInstr(from_index);
+    case kFpuRegister: return new DeoptFpuRegisterInstr(from_index);
+    case kInt64FpuRegister: return new DeoptInt64FpuRegisterInstr(from_index);
     case kPcMarker: return new DeoptPcMarkerInstr(from_index);
     case kCallerFp: return new DeoptCallerFpInstr();
     case kCallerPc: return new DeoptCallerPcInstr();
@@ -706,12 +705,12 @@
     deopt_instr = new DeoptConstantInstr(object_table_index);
   } else if (from_loc.IsRegister()) {
     deopt_instr = new DeoptRegisterInstr(from_loc.reg());
-  } else if (from_loc.IsXmmRegister()) {
+  } else if (from_loc.IsFpuRegister()) {
     if (from_loc.representation() == Location::kDouble) {
-      deopt_instr = new DeoptXmmRegisterInstr(from_loc.xmm_reg());
+      deopt_instr = new DeoptFpuRegisterInstr(from_loc.fpu_reg());
     } else {
       ASSERT(from_loc.representation() == Location::kMint);
-      deopt_instr = new DeoptInt64XmmRegisterInstr(from_loc.xmm_reg());
+      deopt_instr = new DeoptInt64FpuRegisterInstr(from_loc.fpu_reg());
     }
   } else if (from_loc.IsStackSlot()) {
     intptr_t from_index = (from_loc.stack_index() < 0) ?
@@ -824,9 +823,9 @@
                           DeoptInfo* info,
                           Smi* reason) {
   intptr_t i = index * kEntrySize;
-  *offset ^= table.At(i);
-  *info ^= table.At(i + 1);
-  *reason ^= table.At(i + 2);
+  *offset |= table.At(i);
+  *info |= table.At(i + 1);
+  *reason |= table.At(i + 2);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/deopt_instructions.h b/runtime/vm/deopt_instructions.h
index 0741596..74a919a 100644
--- a/runtime/vm/deopt_instructions.h
+++ b/runtime/vm/deopt_instructions.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -52,12 +52,12 @@
     return registers_copy_[reg];
   }
 
-  double XmmRegisterValue(XmmRegister reg) const {
-    return xmm_registers_copy_[reg];
+  double FpuRegisterValue(FpuRegister reg) const {
+    return fpu_registers_copy_[reg];
   }
 
-  int64_t XmmRegisterValueAsInt64(XmmRegister reg) const {
-    return (reinterpret_cast<int64_t*>(xmm_registers_copy_))[reg];
+  int64_t FpuRegisterValueAsInt64(FpuRegister reg) const {
+    return (reinterpret_cast<int64_t*>(fpu_registers_copy_))[reg];
   }
 
   Isolate* isolate() const { return isolate_; }
@@ -73,7 +73,7 @@
   intptr_t* from_frame_;
   intptr_t from_frame_size_;
   intptr_t* registers_copy_;
-  double* xmm_registers_copy_;
+  double* fpu_registers_copy_;
   const intptr_t num_args_;
   const DeoptReasonId deopt_reason_;
   intptr_t caller_fp_;
@@ -94,8 +94,8 @@
     kRetBeforeAddress,
     kConstant,
     kRegister,
-    kXmmRegister,
-    kInt64XmmRegister,
+    kFpuRegister,
+    kInt64FpuRegister,
     kStackSlot,
     kDoubleStackSlot,
     kInt64StackSlot,
diff --git a/runtime/vm/disassembler_arm.cc b/runtime/vm/disassembler_arm.cc
index e74333d..e88f6ca 100644
--- a/runtime/vm/disassembler_arm.cc
+++ b/runtime/vm/disassembler_arm.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -20,7 +20,8 @@
 
 void Disassembler::Disassemble(uword start,
                                uword end,
-                               DisassemblyFormatter* formatter) {
+                               DisassemblyFormatter* formatter,
+                               const Code::Comments& comments) {
   UNIMPLEMENTED();
 }
 
diff --git a/runtime/vm/disassembler_mips.cc b/runtime/vm/disassembler_mips.cc
new file mode 100644
index 0000000..72512ee
--- /dev/null
+++ b/runtime/vm/disassembler_mips.cc
@@ -0,0 +1,30 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/disassembler.h"
+
+#include "vm/globals.h"  // Needed here to get TARGET_ARCH_MIPS.
+#if defined(TARGET_ARCH_MIPS)
+#include "platform/assert.h"
+
+namespace dart {
+
+int Disassembler::DecodeInstruction(char* hex_buffer, intptr_t hex_size,
+                                    char* human_buffer, intptr_t human_size,
+                                    uword pc) {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+void Disassembler::Disassemble(uword start,
+                               uword end,
+                               DisassemblyFormatter* formatter,
+                               const Code::Comments& comments) {
+  UNIMPLEMENTED();
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/elfgen.h b/runtime/vm/elfgen.h
index cf6abfd..fb8c2f6 100644
--- a/runtime/vm/elfgen.h
+++ b/runtime/vm/elfgen.h
@@ -342,7 +342,9 @@
 #endif
   WriteWord(symtab, pc);  // st_value
   WriteWord(symtab, size);  // st_size
-#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM)
+#if defined(TARGET_ARCH_IA32) ||                                               \
+    defined(TARGET_ARCH_ARM) ||                                                \
+    defined(TARGET_ARCH_MIPS)
   // st_info + (st_other<<8)
   WriteShort(symtab, (kSTB_EXPORTED << 4) + kSTT_FUNC);
   WriteShort(symtab, kText);  // st_shndx
@@ -383,7 +385,9 @@
 void ElfGen::AddELFHeader(int shoff) {
   ASSERT(text_vma_ != 0);  // Code must have been added.
   Write(&header_, kEI_MAG0_MAG3, 4);  // EI_MAG0..EI_MAG3
-#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM)
+#if defined(TARGET_ARCH_IA32) ||                                               \
+    defined(TARGET_ARCH_ARM) ||                                                \
+    defined(TARGET_ARCH_MIPS)
   WriteByte(&header_, kELFCLASS32);  // EI_CLASS
 #elif defined(TARGET_ARCH_X64)
   WriteByte(&header_, kELFCLASS64);  // EI_CLASS
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index df11704..7301473 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -194,11 +194,11 @@
     if (existing_stacktrace.IsNull()) {
       stacktrace = Stacktrace::New(func_list, code_list, pc_offset_list);
     } else {
-      stacktrace ^= existing_stacktrace.raw();
+      stacktrace |= existing_stacktrace.raw();
       stacktrace.Append(func_list, code_list, pc_offset_list);
     }
   } else {
-    stacktrace ^= existing_stacktrace.raw();
+    stacktrace |= existing_stacktrace.raw();
   }
   if (FLAG_print_stacktrace_at_throw) {
     OS::Print("Exception '%s' thrown:\n", exception.ToCString());
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index 224adb3..8821941 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -506,7 +506,7 @@
   GrowableArray<Definition*> env(variable_count());
 
   // Add global constants to the initial definitions.
-  ConstantInstr* constant_null =
+  constant_null_ =
       AddConstantToInitialDefinitions(Object::ZoneHandle());
 
   // Add parameters to the initial definitions and renaming environment.
@@ -531,7 +531,7 @@
 
   // Initialize all locals with #null in the renaming environment.
   for (intptr_t i = parameter_count(); i < variable_count(); ++i) {
-    env.Add(constant_null);
+    env.Add(constant_null());
   }
 
   BlockEntryInstr* normal_entry = graph_entry_->SuccessorAt(0);
diff --git a/runtime/vm/flow_graph.h b/runtime/vm/flow_graph.h
index c3cffb9..46b6a6e 100644
--- a/runtime/vm/flow_graph.h
+++ b/runtime/vm/flow_graph.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -24,6 +24,11 @@
   explicit BlockIterator(const GrowableArray<BlockEntryInstr*>& block_order)
       : block_order_(block_order), current_(0) { }
 
+  BlockIterator(const BlockIterator& other)
+      : ValueObject(),
+        block_order_(other.block_order_),
+        current_(other.current_) { }
+
   void Advance() {
     ASSERT(!Done());
     current_++;
@@ -99,6 +104,10 @@
     return graph_entry_;
   }
 
+  ConstantInstr* constant_null() const {
+    return constant_null_;
+  }
+
   intptr_t alloc_ssa_temp_index() { return current_ssa_temp_index_++; }
 
   intptr_t InstructionCount() const;
@@ -178,6 +187,7 @@
   GrowableArray<BlockEntryInstr*> postorder_;
   GrowableArray<BlockEntryInstr*> reverse_postorder_;
   bool invalid_dominator_tree_;
+  ConstantInstr* constant_null_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index 939f393..4adf681 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -72,9 +72,9 @@
     vreg_count_(flow_graph.max_virtual_register_number()),
     live_ranges_(flow_graph.max_virtual_register_number()),
     cpu_regs_(),
-    xmm_regs_(),
+    fpu_regs_(),
     blocked_cpu_registers_(),
-    blocked_xmm_registers_(),
+    blocked_fpu_registers_(),
     cpu_spill_slot_count_(0) {
   for (intptr_t i = 0; i < vreg_count_; i++) live_ranges_.Add(NULL);
 
@@ -85,8 +85,8 @@
   blocked_cpu_registers_[SPREG] = true;
   blocked_cpu_registers_[FPREG] = true;
 
-  // XMM0 is used as scratch by optimized code and parallel move resolver.
-  blocked_xmm_registers_[XMM0] = true;
+  // FpuTMP is used as scratch by optimized code and parallel move resolver.
+  blocked_fpu_registers_[FpuTMP] = true;
 }
 
 
@@ -449,8 +449,8 @@
                                        intptr_t to) {
   if (loc.IsRegister()) {
     BlockRegisterLocation(loc, from, to, blocked_cpu_registers_, cpu_regs_);
-  } else if (loc.IsXmmRegister()) {
-    BlockRegisterLocation(loc, from, to, blocked_xmm_registers_, xmm_regs_);
+  } else if (loc.IsFpuRegister()) {
+    BlockRegisterLocation(loc, from, to, blocked_fpu_registers_, fpu_regs_);
   } else {
     UNREACHABLE();
   }
@@ -629,8 +629,8 @@
 
 
 static Location::Kind RegisterKindFromPolicy(Location loc) {
-  if (loc.policy() == Location::kRequiresXmmRegister) {
-    return Location::kXmmRegister;
+  if (loc.policy() == Location::kRequiresFpuRegister) {
+    return Location::kFpuRegister;
   } else {
     return Location::kRegister;
   }
@@ -640,7 +640,7 @@
 static Location::Kind RegisterKindForResult(Instruction* instr) {
   if ((instr->representation() == kUnboxedDouble) ||
       (instr->representation() == kUnboxedMint)) {
-    return Location::kXmmRegister;
+    return Location::kFpuRegister;
   } else {
     return Location::kRegister;
   }
@@ -978,10 +978,10 @@
                     pos + 1);
     }
 
-    for (intptr_t reg = 0; reg < kNumberOfXmmRegisters; reg++) {
+    for (intptr_t reg = 0; reg < kNumberOfFpuRegisters; reg++) {
       Location::Representation ignored = Location::kDouble;
       BlockLocation(
-          Location::XmmRegisterLocation(static_cast<XmmRegister>(reg), ignored),
+          Location::FpuRegisterLocation(static_cast<FpuRegister>(reg), ignored),
           pos,
           pos + 1);
     }
@@ -1069,7 +1069,7 @@
     //    output       [----
     //
     ASSERT(locs->in(0).Equals(Location::RequiresRegister()) ||
-           locs->in(0).Equals(Location::RequiresXmmRegister()));
+           locs->in(0).Equals(Location::RequiresFpuRegister()));
 
     // Create move that will copy value between input and output.
     locs->set_out(Location::RequiresRegister());
@@ -1104,7 +1104,7 @@
     //    output          [-------
     //
     ASSERT(locs->out().Equals(Location::RequiresRegister()) ||
-           locs->out().Equals(Location::RequiresXmmRegister()));
+           locs->out().Equals(Location::RequiresFpuRegister()));
 
     // Shorten live range to the point of definition and add use to be filled by
     // allocator.
@@ -1315,7 +1315,7 @@
     Location* loc = use->location_slot();
     if (loc->IsUnallocated() &&
         ((loc->policy() == Location::kRequiresRegister) ||
-        (loc->policy() == Location::kRequiresXmmRegister))) {
+        (loc->policy() == Location::kRequiresFpuRegister))) {
       first_register_use_ = use;
       return use;
     }
@@ -1748,7 +1748,7 @@
       (loop_header != NULL) &&
       (free_until >= loop_header->last_block()->end_pos()) &&
       loop_header->backedge_interference()->Contains(unallocated->vreg())) {
-    ASSERT(static_cast<intptr_t>(kNumberOfXmmRegisters) <=
+    ASSERT(static_cast<intptr_t>(kNumberOfFpuRegisters) <=
            kNumberOfCpuRegisters);
     bool used_on_backedge[kNumberOfCpuRegisters] = { false };
 
@@ -2199,7 +2199,7 @@
       AddToSortedListOfRanges(&unallocated_cpu_, range);
       break;
 
-    case Location::kXmmRegister:
+    case Location::kFpuRegister:
       AddToSortedListOfRanges(&unallocated_xmm_, range);
       break;
 
@@ -2483,11 +2483,11 @@
   cpu_spill_slot_count_ = spill_slots_.length();
   spill_slots_.Clear();
 
-  PrepareForAllocation(Location::kXmmRegister,
-                       kNumberOfXmmRegisters,
+  PrepareForAllocation(Location::kFpuRegister,
+                       kNumberOfFpuRegisters,
                        unallocated_xmm_,
-                       xmm_regs_,
-                       blocked_xmm_registers_);
+                       fpu_regs_,
+                       blocked_fpu_registers_);
   AllocateUnallocatedRanges();
 
   ResolveControlFlow();
diff --git a/runtime/vm/flow_graph_allocator.h b/runtime/vm/flow_graph_allocator.h
index d88e6e1..2c2447f 100644
--- a/runtime/vm/flow_graph_allocator.h
+++ b/runtime/vm/flow_graph_allocator.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -275,10 +275,10 @@
   GrowableArray<LiveRange*> unallocated_xmm_;
 
   LiveRange* cpu_regs_[kNumberOfCpuRegisters];
-  LiveRange* xmm_regs_[kNumberOfXmmRegisters];
+  LiveRange* fpu_regs_[kNumberOfFpuRegisters];
 
   bool blocked_cpu_registers_[kNumberOfCpuRegisters];
-  bool blocked_xmm_registers_[kNumberOfXmmRegisters];
+  bool blocked_fpu_registers_[kNumberOfFpuRegisters];
 
 #if defined(DEBUG)
   GrowableArray<LiveRange*> temporaries_;
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 30c2a80..dd1c6104 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -31,6 +31,13 @@
 DECLARE_FLAG(bool, enable_type_checks);
 
 
+static const String& PrivateCoreLibName(const String& str) {
+  const Library& core_lib = Library::Handle(Library::CoreLibrary());
+  const String& private_name = String::ZoneHandle(core_lib.PrivateName(str));
+  return private_name;
+}
+
+
 FlowGraphBuilder::FlowGraphBuilder(const ParsedFunction& parsed_function,
                                    InliningContext* inlining_context)
   : parsed_function_(parsed_function),
@@ -950,7 +957,6 @@
                                 &push_instantiator,
                                 &push_type_args);
   }
-  const String& name = String::ZoneHandle(Symbols::New("_instanceOf"));
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new ZoneGrowableArray<PushArgumentInstr*>(5);
   arguments->Add(push_left);
@@ -965,12 +971,13 @@
   Value* negate_arg = Bind(new ConstantInstr(negate));
   arguments->Add(PushArgument(negate_arg));
   const intptr_t kNumArgsChecked = 1;
-  InstanceCallInstr* call = new InstanceCallInstr(node->token_pos(),
-                                                  name,
-                                                  node->kind(),
-                                                  arguments,
-                                                  Array::ZoneHandle(),
-                                                  kNumArgsChecked);
+  InstanceCallInstr* call = new InstanceCallInstr(
+      node->token_pos(),
+      PrivateCoreLibName(Symbols::_instanceOf()),
+      node->kind(),
+      arguments,
+      Array::ZoneHandle(),
+      kNumArgsChecked);
   ReturnDefinition(call);
 }
 
@@ -1626,7 +1633,8 @@
   }
   PushArgumentInstr* push_type_arguments = PushArgument(type_arguments);
   arguments->Add(push_type_arguments);
-  ReturnDefinition(new CreateClosureInstr(node, arguments));
+  ReturnDefinition(
+      new CreateClosureInstr(node->function(), arguments, node->token_pos()));
 }
 
 
@@ -2842,6 +2850,7 @@
                              old_try_index,
                              loop_depth());
     catch_entry->set_catch_try_index(try_index);
+    catch_entry->set_catch_handler_types(catch_block->handler_types());
     owner()->AddCatchEntry(catch_entry);
     ASSERT(!for_catch_block.is_open());
     AppendFragment(catch_entry, for_catch_block);
@@ -2878,9 +2887,10 @@
       corelib.LookupClassAllowPrivate(Symbols::InvocationMirror()));
   ASSERT(!mirror_class.IsNull());
   const Function& allocation_function = Function::ZoneHandle(
-      Resolver::ResolveStaticByName(mirror_class,
-                                    Symbols::AllocateInvocationMirror(),
-                                    Resolver::kIsQualified));
+      Resolver::ResolveStaticByName(
+          mirror_class,
+          PrivateCoreLibName(Symbols::AllocateInvocationMirror()),
+          Resolver::kIsQualified));
   ASSERT(!allocation_function.IsNull());
 
   // Evaluate the receiver before the arguments. This will be used
@@ -2974,7 +2984,7 @@
   ASSERT(!cls.IsNull());
   const Function& func = Function::ZoneHandle(
       Resolver::ResolveStatic(cls,
-                              Symbols::ThrowNew(),
+                              PrivateCoreLibName(Symbols::ThrowNew()),
                               arguments->length(),
                               Array::ZoneHandle(),
                               Resolver::kIsQualified));
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index bd45b11..ec02181 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -157,16 +157,6 @@
 }
 
 
-FlowGraphCompiler::~FlowGraphCompiler() {
-  // BlockInfos are zone-allocated, so their destructors are not called.
-  // Verify the labels explicitly here.
-  for (int i = 0; i < block_info_.length(); ++i) {
-    ASSERT(!block_info_[i]->label.IsLinked());
-    ASSERT(!block_info_[i]->label.HasNear());
-  }
-}
-
-
 bool FlowGraphCompiler::HasFinally() const {
   return parsed_function().function().has_finally();
 }
@@ -296,8 +286,13 @@
 
 
 void FlowGraphCompiler::AddExceptionHandler(intptr_t try_index,
-                                            intptr_t pc_offset) {
-  exception_handlers_list_->AddHandler(try_index, pc_offset);
+                                            intptr_t outer_try_index,
+                                            intptr_t pc_offset,
+                                            const Array& handler_types) {
+  exception_handlers_list_->AddHandler(try_index,
+                                       outer_try_index,
+                                       pc_offset,
+                                       handler_types);
 }
 
 
@@ -350,17 +345,17 @@
     // Slow path code can have registers at the safepoint.
     if (!locs->always_calls()) {
       RegisterSet* regs = locs->live_registers();
-      if (regs->xmm_regs_count() > 0) {
-        // Denote XMM registers with 0 bits in the stackmap.  Based on the
-        // assumption that there are normally few live XMM registers, this
+      if (regs->fpu_regs_count() > 0) {
+        // Denote FPU registers with 0 bits in the stackmap.  Based on the
+        // assumption that there are normally few live FPU registers, this
         // encoding is simpler and roughly as compact as storing a separate
-        // count of XMM registers.
+        // count of FPU registers.
         //
-        // XMM registers have the highest register number at the highest
+        // FPU registers have the highest register number at the highest
         // address (i.e., first in the stackmap).
-        for (intptr_t i = kNumberOfXmmRegisters - 1; i >= 0; --i) {
-          XmmRegister reg = static_cast<XmmRegister>(i);
-          if (regs->ContainsXmmRegister(reg)) {
+        for (intptr_t i = kNumberOfFpuRegisters - 1; i >= 0; --i) {
+          FpuRegister reg = static_cast<FpuRegister>(i);
+          if (regs->ContainsFpuRegister(reg)) {
             for (intptr_t j = 0;
                  j < FlowGraphAllocator::kDoubleSpillSlotFactor;
                  ++j) {
@@ -655,115 +650,6 @@
 }
 
 
-struct CidTarget {
-  intptr_t cid;
-  Function* target;
-  intptr_t count;
-  CidTarget(intptr_t cid_arg,
-            Function* target_arg,
-            intptr_t count_arg)
-      : cid(cid_arg), target(target_arg), count(count_arg) {}
-};
-
-
-// Returns 'sorted' array in decreasing count order.
-// The expected number of elements to sort is less than 10.
-static void SortICDataByCount(const ICData& ic_data,
-                              GrowableArray<CidTarget>* sorted) {
-  ASSERT(ic_data.num_args_tested() == 1);
-  const intptr_t len = ic_data.NumberOfChecks();
-  sorted->Clear();
-
-  for (int i = 0; i < len; i++) {
-    sorted->Add(CidTarget(ic_data.GetReceiverClassIdAt(i),
-                          &Function::ZoneHandle(ic_data.GetTargetAt(i)),
-                          ic_data.GetCountAt(i)));
-  }
-  for (int i = 0; i < len; i++) {
-    intptr_t largest_ix = i;
-    for (int k = i + 1; k < len; k++) {
-      if ((*sorted)[largest_ix].count < (*sorted)[k].count) {
-        largest_ix = k;
-      }
-    }
-    if (i != largest_ix) {
-      // Swap.
-      CidTarget temp = (*sorted)[i];
-      (*sorted)[i] = (*sorted)[largest_ix];
-      (*sorted)[largest_ix] = temp;
-    }
-  }
-}
-
-
-void FlowGraphCompiler::EmitTestAndCall(const ICData& ic_data,
-                                        Register class_id_reg,
-                                        intptr_t arg_count,
-                                        const Array& arg_names,
-                                        Label* deopt,
-                                        intptr_t deopt_id,
-                                        intptr_t token_index,
-                                        LocationSummary* locs) {
-  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
-  Label match_found;
-  const intptr_t len = ic_data.NumberOfChecks();
-  GrowableArray<CidTarget> sorted(len);
-  SortICDataByCount(ic_data, &sorted);
-  for (intptr_t i = 0; i < len; i++) {
-    const bool is_last_check = (i == (len - 1));
-    Label next_test;
-    assembler()->cmpl(class_id_reg, Immediate(sorted[i].cid));
-    if (is_last_check) {
-      assembler()->j(NOT_EQUAL, deopt);
-    } else {
-      assembler()->j(NOT_EQUAL, &next_test);
-    }
-    GenerateStaticCall(deopt_id,
-                       token_index,
-                       *sorted[i].target,
-                       arg_count,
-                       arg_names,
-                       locs);
-    if (!is_last_check) {
-      assembler()->jmp(&match_found);
-    }
-    assembler()->Bind(&next_test);
-  }
-  assembler()->Bind(&match_found);
-}
-
-
-void FlowGraphCompiler::EmitDoubleCompareBranch(Condition true_condition,
-                                                XmmRegister left,
-                                                XmmRegister right,
-                                                BranchInstr* branch) {
-  ASSERT(branch != NULL);
-  assembler()->comisd(left, right);
-  BlockEntryInstr* nan_result = (true_condition == NOT_EQUAL) ?
-      branch->true_successor() : branch->false_successor();
-  assembler()->j(PARITY_EVEN, GetBlockLabel(nan_result));
-  branch->EmitBranchOnCondition(this, true_condition);
-}
-
-
-
-void FlowGraphCompiler::EmitDoubleCompareBool(Condition true_condition,
-                                              XmmRegister left,
-                                              XmmRegister right,
-                                              Register result) {
-  assembler()->comisd(left, right);
-  Label is_false, is_true, done;
-  assembler()->j(PARITY_EVEN, &is_false, Assembler::kNearJump);  // NaN false;
-  assembler()->j(true_condition, &is_true, Assembler::kNearJump);
-  assembler()->Bind(&is_false);
-  assembler()->LoadObject(result, Bool::False());
-  assembler()->jmp(&done);
-  assembler()->Bind(&is_true);
-  assembler()->LoadObject(result, Bool::True());
-  assembler()->Bind(&done);
-}
-
-
 // Allocate a register that is not explicitly blocked.
 static Register AllocateFreeRegister(bool* blocked_registers) {
   for (intptr_t regno = 0; regno < kNumberOfCpuRegisters; regno++) {
@@ -868,7 +754,7 @@
       case Location::kSameAsFirstInput:
         result_location = locs->in(0);
         break;
-      case Location::kRequiresXmmRegister:
+      case Location::kRequiresFpuRegister:
         UNREACHABLE();
         break;
     }
@@ -985,48 +871,6 @@
 }
 
 
-Condition FlowGraphCompiler::FlipCondition(Condition condition) {
-  switch (condition) {
-    case EQUAL:         return EQUAL;
-    case NOT_EQUAL:     return NOT_EQUAL;
-    case LESS:          return GREATER;
-    case LESS_EQUAL:    return GREATER_EQUAL;
-    case GREATER:       return LESS;
-    case GREATER_EQUAL: return LESS_EQUAL;
-    case BELOW:         return ABOVE;
-    case BELOW_EQUAL:   return ABOVE_EQUAL;
-    case ABOVE:         return BELOW;
-    case ABOVE_EQUAL:   return BELOW_EQUAL;
-    default:
-      UNIMPLEMENTED();
-      return EQUAL;
-  }
-}
-
-
-bool FlowGraphCompiler::EvaluateCondition(Condition condition,
-                                          intptr_t left,
-                                          intptr_t right) {
-  const uintptr_t unsigned_left = static_cast<uintptr_t>(left);
-  const uintptr_t unsigned_right = static_cast<uintptr_t>(right);
-  switch (condition) {
-    case EQUAL:         return left == right;
-    case NOT_EQUAL:     return left != right;
-    case LESS:          return left < right;
-    case LESS_EQUAL:    return left <= right;
-    case GREATER:       return left > right;
-    case GREATER_EQUAL: return left >= right;
-    case BELOW:         return unsigned_left < unsigned_right;
-    case BELOW_EQUAL:   return unsigned_left <= unsigned_right;
-    case ABOVE:         return unsigned_left > unsigned_right;
-    case ABOVE_EQUAL:   return unsigned_left >= unsigned_right;
-    default:
-      UNIMPLEMENTED();
-      return false;
-  }
-}
-
-
 intptr_t FlowGraphCompiler::ElementSizeFor(intptr_t cid) {
   switch (cid) {
     case kArrayCid:
@@ -1036,14 +880,22 @@
       return Float32Array::kBytesPerElement;
     case kFloat64ArrayCid:
       return Float64Array::kBytesPerElement;
+    case kInt8ArrayCid:
+      return Int8Array::kBytesPerElement;
     case kUint8ArrayCid:
       return Uint8Array::kBytesPerElement;
     case kUint8ClampedArrayCid:
       return Uint8ClampedArray::kBytesPerElement;
+    case kInt16ArrayCid:
+      return Int16Array::kBytesPerElement;
+    case kUint16ArrayCid:
+      return Uint16Array::kBytesPerElement;
     case kOneByteStringCid:
       return OneByteString::kBytesPerElement;
     case kTwoByteStringCid:
       return TwoByteString::kBytesPerElement;
+    case kExternalUint8ArrayCid:
+      return ExternalUint8Array::kBytesPerElement;
     default:
       UNIMPLEMENTED();
       return 0;
@@ -1060,10 +912,16 @@
       return Float32Array::data_offset();
     case kFloat64ArrayCid:
       return Float64Array::data_offset();
+    case kInt8ArrayCid:
+      return Int8Array::data_offset();
     case kUint8ArrayCid:
       return Uint8Array::data_offset();
     case kUint8ClampedArrayCid:
       return Uint8ClampedArray::data_offset();
+    case kInt16ArrayCid:
+      return Int16Array::data_offset();
+    case kUint16ArrayCid:
+      return Uint16Array::data_offset();
     case kOneByteStringCid:
       return OneByteString::data_offset();
     case kTwoByteStringCid:
@@ -1075,48 +933,6 @@
 }
 
 
-FieldAddress FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid,
-                                                          Register array,
-                                                          intptr_t index) {
-  const int64_t disp =
-      static_cast<int64_t>(index) * ElementSizeFor(cid) + DataOffsetFor(cid);
-  ASSERT(Utils::IsInt(32, disp));
-  return FieldAddress(array, static_cast<int32_t>(disp));
-}
-
-
-FieldAddress FlowGraphCompiler::ElementAddressForRegIndex(intptr_t cid,
-                                                          Register array,
-                                                          Register index) {
-  // Note that index is smi-tagged, (i.e, times 2) for all arrays with element
-  // size > 1. For Uint8Array and OneByteString the index is expected to be
-  // untagged before accessing.
-  ASSERT(kSmiTagShift == 1);
-  switch (cid) {
-    case kArrayCid:
-    case kImmutableArrayCid:
-      return FieldAddress(
-          array, index, TIMES_HALF_WORD_SIZE, Array::data_offset());
-    case kFloat32ArrayCid:
-      return FieldAddress(array, index, TIMES_2, Float32Array::data_offset());
-    case kFloat64ArrayCid:
-      return FieldAddress(array, index, TIMES_4, Float64Array::data_offset());
-    case kUint8ArrayCid:
-      return FieldAddress(array, index, TIMES_1, Uint8Array::data_offset());
-    case kUint8ClampedArrayCid:
-      return
-          FieldAddress(array, index, TIMES_1, Uint8ClampedArray::data_offset());
-    case kOneByteStringCid:
-      return FieldAddress(array, index, TIMES_1, OneByteString::data_offset());
-    case kTwoByteStringCid:
-      return FieldAddress(array, index, TIMES_1, TwoByteString::data_offset());
-    default:
-      UNIMPLEMENTED();
-      return FieldAddress(SPREG, 0);
-  }
-}
-
-
 // Returns true if checking against this type is a direct class id comparison.
 bool FlowGraphCompiler::TypeCheckAsClassEquality(const AbstractType& type) {
   ASSERT(type.IsFinalized() && !type.IsMalformed());
@@ -1142,4 +958,34 @@
   return true;
 }
 
+
+// Returns 'sorted' array in decreasing count order.
+// The expected number of elements to sort is less than 10.
+void FlowGraphCompiler::SortICDataByCount(const ICData& ic_data,
+                                          GrowableArray<CidTarget>* sorted) {
+  ASSERT(ic_data.num_args_tested() == 1);
+  const intptr_t len = ic_data.NumberOfChecks();
+  sorted->Clear();
+
+  for (int i = 0; i < len; i++) {
+    sorted->Add(CidTarget(ic_data.GetReceiverClassIdAt(i),
+                          &Function::ZoneHandle(ic_data.GetTargetAt(i)),
+                          ic_data.GetCountAt(i)));
+  }
+  for (int i = 0; i < len; i++) {
+    intptr_t largest_ix = i;
+    for (int k = i + 1; k < len; k++) {
+      if ((*sorted)[largest_ix].count < (*sorted)[k].count) {
+        largest_ix = k;
+      }
+    }
+    if (i != largest_ix) {
+      // Swap.
+      CidTarget temp = (*sorted)[i];
+      (*sorted)[i] = (*sorted)[largest_ix];
+      (*sorted)[largest_ix] = temp;
+    }
+  }
+}
+
 }  // namespace dart
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 1a12f6f..3bed948 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -15,8 +15,14 @@
 namespace dart {
 
 // Forward declarations.
-class FlowGraphCompiler;
+class Code;
 class DeoptInfoBuilder;
+class FlowGraph;
+class FlowGraphCompiler;
+class Function;
+template <typename T> class GrowableArray;
+class ParsedFunction;
+
 
 class ParallelMoveResolver : public ValueObject {
  public:
@@ -143,16 +149,375 @@
 };
 
 
-}  // namespace dart
+struct CidTarget {
+  intptr_t cid;
+  Function* target;
+  intptr_t count;
+  CidTarget(intptr_t cid_arg,
+            Function* target_arg,
+            intptr_t count_arg)
+      : cid(cid_arg), target(target_arg), count(count_arg) {}
+};
 
-#if defined(TARGET_ARCH_IA32)
-#include "vm/flow_graph_compiler_ia32.h"
-#elif defined(TARGET_ARCH_X64)
-#include "vm/flow_graph_compiler_x64.h"
-#elif defined(TARGET_ARCH_ARM)
-#include "vm/flow_graph_compiler_arm.h"
-#else
-#error Unknown architecture.
-#endif
+
+class FlowGraphCompiler : public ValueObject {
+ private:
+  struct BlockInfo : public ZoneAllocated {
+   public:
+    BlockInfo() : label() { }
+    Label label;
+  };
+
+ public:
+  FlowGraphCompiler(Assembler* assembler,
+                    const FlowGraph& flow_graph,
+                    bool is_optimizing);
+
+  ~FlowGraphCompiler();
+
+  static bool SupportsUnboxedMints();
+
+  // Accessors.
+  Assembler* assembler() const { return assembler_; }
+  const ParsedFunction& parsed_function() const { return parsed_function_; }
+  const GrowableArray<BlockEntryInstr*>& block_order() const {
+    return block_order_;
+  }
+  DescriptorList* pc_descriptors_list() const {
+    return pc_descriptors_list_;
+  }
+  BlockEntryInstr* current_block() const { return current_block_; }
+  void set_current_block(BlockEntryInstr* value) {
+    current_block_ = value;
+  }
+  static bool CanOptimize();
+  bool CanOptimizeFunction() const;
+  bool is_optimizing() const { return is_optimizing_; }
+
+  const GrowableArray<BlockInfo*>& block_info() const { return block_info_; }
+  ParallelMoveResolver* parallel_move_resolver() {
+    return &parallel_move_resolver_;
+  }
+
+  // Constructor is lighweight, major initialization work should occur here.
+  // This makes it easier to measure time spent in the compiler.
+  void InitCompiler();
+
+  void CompileGraph();
+
+  void VisitBlocks();
+
+  // Bail out of the flow graph compiler. Does not return to the caller.
+  void Bailout(const char* reason);
+
+  void LoadDoubleOrSmiToFpu(FpuRegister result,
+                            Register reg,
+                            Register temp,
+                            Label* not_double_or_smi);
+
+  // Returns 'true' if code generation for this function is complete, i.e.,
+  // no fall-through to regular code is needed.
+  bool TryIntrinsify();
+
+  void GenerateCallRuntime(intptr_t token_pos,
+                           const RuntimeEntry& entry,
+                           LocationSummary* locs);
+
+  void GenerateCall(intptr_t token_pos,
+                    const ExternalLabel* label,
+                    PcDescriptors::Kind kind,
+                    LocationSummary* locs);
+
+  void GenerateDartCall(intptr_t deopt_id,
+                        intptr_t token_pos,
+                        const ExternalLabel* label,
+                        PcDescriptors::Kind kind,
+                        LocationSummary* locs);
+
+  void GenerateAssertAssignable(intptr_t token_pos,
+                                const AbstractType& dst_type,
+                                const String& dst_name,
+                                LocationSummary* locs);
+
+  void GenerateInstanceOf(intptr_t token_pos,
+                          const AbstractType& type,
+                          bool negate_result,
+                          LocationSummary* locs);
+
+  void GenerateInstanceCall(intptr_t deopt_id,
+                            intptr_t token_pos,
+                            intptr_t argument_count,
+                            const Array& argument_names,
+                            LocationSummary* locs,
+                            const ICData& ic_data);
+
+  void GenerateStaticCall(intptr_t deopt_id,
+                          intptr_t token_pos,
+                          const Function& function,
+                          intptr_t argument_count,
+                          const Array& argument_names,
+                          LocationSummary* locs);
+
+  void GenerateNumberTypeCheck(Register kClassIdReg,
+                               const AbstractType& type,
+                               Label* is_instance_lbl,
+                               Label* is_not_instance_lbl);
+  void GenerateStringTypeCheck(Register kClassIdReg,
+                               Label* is_instance_lbl,
+                               Label* is_not_instance_lbl);
+  void GenerateListTypeCheck(Register kClassIdReg,
+                             Label* is_instance_lbl);
+
+  void EmitComment(Instruction* instr);
+
+  void EmitOptimizedInstanceCall(ExternalLabel* target_label,
+                                 const ICData& ic_data,
+                                 const Array& arguments_descriptor,
+                                 intptr_t argument_count,
+                                 intptr_t deopt_id,
+                                 intptr_t token_pos,
+                                 LocationSummary* locs);
+
+  void EmitInstanceCall(ExternalLabel* target_label,
+                        const ICData& ic_data,
+                        const Array& arguments_descriptor,
+                        intptr_t argument_count,
+                        intptr_t deopt_id,
+                        intptr_t token_pos,
+                        LocationSummary* locs);
+
+  void EmitMegamorphicInstanceCall(const ICData& ic_data,
+                                   const Array& arguments_descriptor,
+                                   intptr_t argument_count,
+                                   intptr_t deopt_id,
+                                   intptr_t token_pos,
+                                   LocationSummary* locs);
+
+  void EmitTestAndCall(const ICData& ic_data,
+                       Register class_id_reg,
+                       intptr_t arg_count,
+                       const Array& arg_names,
+                       Label* deopt,
+                       intptr_t deopt_id,
+                       intptr_t token_index,
+                       LocationSummary* locs);
+
+  void EmitDoubleCompareBranch(Condition true_condition,
+                               FpuRegister left,
+                               FpuRegister right,
+                               BranchInstr* branch);
+  void EmitDoubleCompareBool(Condition true_condition,
+                             FpuRegister left,
+                             FpuRegister right,
+                             Register result);
+
+  void EmitEqualityRegConstCompare(Register reg,
+                                   const Object& obj,
+                                   bool needs_number_check);
+  void EmitEqualityRegRegCompare(Register left,
+                                 Register right,
+                                 bool needs_number_check);
+  // Implement equality: if any of the arguments is null do identity check.
+  // Fallthrough calls super equality.
+  void EmitSuperEqualityCallPrologue(Register result, Label* skip_call);
+
+  intptr_t StackSize() const;
+
+  // Returns assembler label associated with the given block entry.
+  Label* GetBlockLabel(BlockEntryInstr* block_entry) const;
+
+  // Returns true if there is a next block after the current one in
+  // the block order and if it is the given block.
+  bool IsNextBlock(BlockEntryInstr* block_entry) const;
+
+  void AddExceptionHandler(intptr_t try_index,
+                           intptr_t outer_try_index,
+                           intptr_t pc_offset,
+                           const Array& handler_types);
+  void AddCurrentDescriptor(PcDescriptors::Kind kind,
+                            intptr_t deopt_id,
+                            intptr_t token_pos);
+
+  void RecordSafepoint(LocationSummary* locs);
+
+  Label* AddDeoptStub(intptr_t deopt_id, DeoptReasonId reason);
+
+  void AddDeoptIndexAtCall(intptr_t deopt_id, intptr_t token_pos);
+
+  void AddSlowPathCode(SlowPathCode* slow_path);
+
+  void FinalizeExceptionHandlers(const Code& code);
+  void FinalizePcDescriptors(const Code& code);
+  void FinalizeDeoptInfo(const Code& code);
+  void FinalizeStackmaps(const Code& code);
+  void FinalizeVarDescriptors(const Code& code);
+  void FinalizeComments(const Code& code);
+  void FinalizeStaticCallTargetsTable(const Code& code);
+
+  const Class& double_class() const { return double_class_; }
+
+  void SaveLiveRegisters(LocationSummary* locs);
+  void RestoreLiveRegisters(LocationSummary* locs);
+
+  // Returns true if the compiled function has a finally clause.
+  bool HasFinally() const;
+
+  intptr_t CurrentTryIndex() const {
+    if (current_block_ == NULL) {
+      return CatchClauseNode::kInvalidTryIndex;
+    }
+    return current_block_->try_index();
+  }
+
+  bool may_reoptimize() const { return may_reoptimize_; }
+
+  static const int kLocalsOffsetFromFP = (-1 * kWordSize);
+
+  static Condition FlipCondition(Condition condition);
+
+  static bool EvaluateCondition(Condition condition, intptr_t l, intptr_t r);
+
+  // Array/list element address computations.
+  static intptr_t DataOffsetFor(intptr_t cid);
+  static intptr_t ElementSizeFor(intptr_t cid);
+  static FieldAddress ElementAddressForIntIndex(intptr_t cid,
+                                                Register array,
+                                                intptr_t offset);
+  static FieldAddress ElementAddressForRegIndex(intptr_t cid,
+                                                Register array,
+                                                Register index);
+  static Address ExternalElementAddressForIntIndex(intptr_t cid,
+                                                   Register array,
+                                                   intptr_t offset);
+  static Address ExternalElementAddressForRegIndex(intptr_t cid,
+                                                   Register array,
+                                                   Register index);
+
+ private:
+  void EmitFrameEntry();
+
+  void AddStaticCallTarget(const Function& function);
+
+  void GenerateDeferredCode();
+
+  void EmitInstructionPrologue(Instruction* instr);
+  void EmitInstructionEpilogue(Instruction* instr);
+
+  // Emit code to load a Value into register 'dst'.
+  void LoadValue(Register dst, Value* value);
+
+  void EmitStaticCall(const Function& function,
+                      const Array& arguments_descriptor,
+                      intptr_t argument_count,
+                      intptr_t deopt_id,
+                      intptr_t token_pos,
+                      LocationSummary* locs);
+
+  // Type checking helper methods.
+  void CheckClassIds(Register class_id_reg,
+                     const GrowableArray<intptr_t>& class_ids,
+                     Label* is_instance_lbl,
+                     Label* is_not_instance_lbl);
+
+  RawSubtypeTestCache* GenerateInlineInstanceof(intptr_t token_pos,
+                                                const AbstractType& type,
+                                                Label* is_instance_lbl,
+                                                Label* is_not_instance_lbl);
+
+  RawSubtypeTestCache* GenerateInstantiatedTypeWithArgumentsTest(
+      intptr_t token_pos,
+      const AbstractType& dst_type,
+      Label* is_instance_lbl,
+      Label* is_not_instance_lbl);
+
+  bool GenerateInstantiatedTypeNoArgumentsTest(intptr_t token_pos,
+                                               const AbstractType& dst_type,
+                                               Label* is_instance_lbl,
+                                               Label* is_not_instance_lbl);
+
+  RawSubtypeTestCache* GenerateUninstantiatedTypeTest(
+      intptr_t token_pos,
+      const AbstractType& dst_type,
+      Label* is_instance_lbl,
+      Label* is_not_instance_label);
+
+  RawSubtypeTestCache* GenerateSubtype1TestCacheLookup(
+      intptr_t token_pos,
+      const Class& type_class,
+      Label* is_instance_lbl,
+      Label* is_not_instance_lbl);
+
+  enum TypeTestStubKind {
+    kTestTypeOneArg,
+    kTestTypeTwoArgs,
+    kTestTypeThreeArgs,
+  };
+
+  RawSubtypeTestCache* GenerateCallSubtypeTestStub(TypeTestStubKind test_kind,
+                                                   Register instance_reg,
+                                                   Register type_arguments_reg,
+                                                   Register temp_reg,
+                                                   Label* is_instance_lbl,
+                                                   Label* is_not_instance_lbl);
+
+  // Returns true if checking against this type is a direct class id comparison.
+  bool TypeCheckAsClassEquality(const AbstractType& type);
+
+  void GenerateBoolToJump(Register bool_reg, Label* is_true, Label* is_false);
+
+  void CopyParameters();
+
+  void GenerateInlinedGetter(intptr_t offset);
+  void GenerateInlinedSetter(intptr_t offset);
+
+  // Perform a greedy local register allocation.  Consider all registers free.
+  void AllocateRegistersLocally(Instruction* instr);
+
+  // Map a block number in a forward iteration into the block number in the
+  // corresponding reverse iteration.  Used to obtain an index into
+  // block_order for reverse iterations.
+  intptr_t reverse_index(intptr_t index) const {
+    return block_order_.length() - index - 1;
+  }
+
+  // Returns 'sorted' array in decreasing count order.
+  // The expected number of elements to sort is less than 10.
+  static void SortICDataByCount(const ICData& ic_data,
+                                GrowableArray<CidTarget>* sorted);
+
+  class Assembler* assembler_;
+  const ParsedFunction& parsed_function_;
+  const GrowableArray<BlockEntryInstr*>& block_order_;
+
+  // Compiler specific per-block state.  Indexed by postorder block number
+  // for convenience.  This is not the block's index in the block order,
+  // which is reverse postorder.
+  BlockEntryInstr* current_block_;
+  ExceptionHandlerList* exception_handlers_list_;
+  DescriptorList* pc_descriptors_list_;
+  StackmapTableBuilder* stackmap_table_builder_;
+  GrowableArray<BlockInfo*> block_info_;
+  GrowableArray<CompilerDeoptInfo*> deopt_infos_;
+  GrowableArray<SlowPathCode*> slow_path_code_;
+  // Stores: [code offset, function, null(code)].
+  const GrowableObjectArray& static_calls_target_table_;
+  const bool is_optimizing_;
+  // Set to true if optimized code has IC calls.
+  bool may_reoptimize_;
+
+  const Class& double_class_;
+
+  ParallelMoveResolver parallel_move_resolver_;
+
+  // Currently instructions generate deopt stubs internally by
+  // calling AddDeoptStub.  To communicate deoptimization environment
+  // that should be used when deoptimizing we store it in this variable.
+  // In future AddDeoptStub should be moved out of the instruction template.
+  Environment* pending_deoptimization_env_;
+
+  DISALLOW_COPY_AND_ASSIGN(FlowGraphCompiler);
+};
+
+}  // namespace dart
 
 #endif  // VM_FLOW_GRAPH_COMPILER_H_
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index c1d3837..3bd8df5 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -11,35 +11,358 @@
 
 namespace dart {
 
+FlowGraphCompiler::~FlowGraphCompiler() {
+  // BlockInfos are zone-allocated, so their destructors are not called.
+  // Verify the labels explicitly here.
+  for (int i = 0; i < block_info_.length(); ++i) {
+    ASSERT(!block_info_[i]->label.IsLinked());
+  }
+}
+
+
+bool FlowGraphCompiler::SupportsUnboxedMints() {
+  return false;
+}
+
+
+void CompilerDeoptInfoWithStub::GenerateCode(FlowGraphCompiler* compiler,
+                                             intptr_t stub_ix) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateBoolToJump(Register bool_register,
+                                           Label* is_true,
+                                           Label* is_false) {
+  UNIMPLEMENTED();
+}
+
+
+RawSubtypeTestCache* FlowGraphCompiler::GenerateCallSubtypeTestStub(
+    TypeTestStubKind test_kind,
+    Register instance_reg,
+    Register type_arguments_reg,
+    Register temp_reg,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+RawSubtypeTestCache*
+FlowGraphCompiler::GenerateInstantiatedTypeWithArgumentsTest(
+    intptr_t token_pos,
+    const AbstractType& type,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void FlowGraphCompiler::CheckClassIds(Register class_id_reg,
+                                      const GrowableArray<intptr_t>& class_ids,
+                                      Label* is_equal_lbl,
+                                      Label* is_not_equal_lbl) {
+  UNIMPLEMENTED();
+}
+
+
+bool FlowGraphCompiler::GenerateInstantiatedTypeNoArgumentsTest(
+    intptr_t token_pos,
+    const AbstractType& type,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return false;
+}
+
+
+RawSubtypeTestCache* FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
+    intptr_t token_pos,
+    const Class& type_class,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+RawSubtypeTestCache* FlowGraphCompiler::GenerateUninstantiatedTypeTest(
+    intptr_t token_pos,
+    const AbstractType& type,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof(
+    intptr_t token_pos,
+    const AbstractType& type,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void FlowGraphCompiler::GenerateInstanceOf(intptr_t token_pos,
+                                           const AbstractType& type,
+                                           bool negate_result,
+                                           LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateAssertAssignable(intptr_t token_pos,
+                                                 const AbstractType& dst_type,
+                                                 const String& dst_name,
+                                                 LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitInstructionPrologue(Instruction* instr) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitInstructionEpilogue(Instruction* instr) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::CopyParameters() {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateInlinedGetter(intptr_t offset) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateInlinedSetter(intptr_t offset) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitFrameEntry() {
+  UNIMPLEMENTED();
+}
+
+
 void FlowGraphCompiler::CompileGraph() {
   UNIMPLEMENTED();
 }
 
 
-void FlowGraphCompiler::FinalizePcDescriptors(const Code& code) {
+void FlowGraphCompiler::GenerateCall(intptr_t token_pos,
+                                     const ExternalLabel* label,
+                                     PcDescriptors::Kind kind,
+                                     LocationSummary* locs) {
   UNIMPLEMENTED();
 }
 
 
-void FlowGraphCompiler::FinalizeStackmaps(const Code& code) {
+void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
+                                         intptr_t token_pos,
+                                         const ExternalLabel* label,
+                                         PcDescriptors::Kind kind,
+                                         LocationSummary* locs) {
   UNIMPLEMENTED();
 }
 
 
-void FlowGraphCompiler::FinalizeVarDescriptors(const Code& code) {
+void FlowGraphCompiler::GenerateCallRuntime(intptr_t token_pos,
+                                            const RuntimeEntry& entry,
+                                            LocationSummary* locs) {
   UNIMPLEMENTED();
 }
 
 
-void FlowGraphCompiler::FinalizeExceptionHandlers(const Code& code) {
+void FlowGraphCompiler::EmitOptimizedInstanceCall(
+    ExternalLabel* target_label,
+    const ICData& ic_data,
+    const Array& arguments_descriptor,
+    intptr_t argument_count,
+    intptr_t deopt_id,
+    intptr_t token_pos,
+    LocationSummary* locs) {
   UNIMPLEMENTED();
 }
 
 
-void FlowGraphCompiler::FinalizeComments(const Code& code) {
+void FlowGraphCompiler::EmitInstanceCall(ExternalLabel* target_label,
+                                         const ICData& ic_data,
+                                         const Array& arguments_descriptor,
+                                         intptr_t argument_count,
+                                         intptr_t deopt_id,
+                                         intptr_t token_pos,
+                                         LocationSummary* locs) {
   UNIMPLEMENTED();
 }
 
+
+void FlowGraphCompiler::EmitMegamorphicInstanceCall(
+    const ICData& ic_data,
+    const Array& arguments_descriptor,
+    intptr_t argument_count,
+    intptr_t deopt_id,
+    intptr_t token_pos,
+    LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitStaticCall(const Function& function,
+                                       const Array& arguments_descriptor,
+                                       intptr_t argument_count,
+                                       intptr_t deopt_id,
+                                       intptr_t token_pos,
+                                       LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitEqualityRegConstCompare(Register reg,
+                                                    const Object& obj,
+                                                    bool needs_number_check) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitEqualityRegRegCompare(Register left,
+                                                  Register right,
+                                                  bool needs_number_check) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitSuperEqualityCallPrologue(Register result,
+                                                      Label* skip_call) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::SaveLiveRegisters(LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::RestoreLiveRegisters(LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitTestAndCall(const ICData& ic_data,
+                                        Register class_id_reg,
+                                        intptr_t arg_count,
+                                        const Array& arg_names,
+                                        Label* deopt,
+                                        intptr_t deopt_id,
+                                        intptr_t token_index,
+                                        LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitDoubleCompareBranch(Condition true_condition,
+                                                FpuRegister left,
+                                                FpuRegister right,
+                                                BranchInstr* branch) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitDoubleCompareBool(Condition true_condition,
+                                              FpuRegister left,
+                                              FpuRegister right,
+                                              Register result) {
+  UNIMPLEMENTED();
+}
+
+
+Condition FlowGraphCompiler::FlipCondition(Condition condition) {
+  UNIMPLEMENTED();
+  return condition;
+}
+
+
+bool FlowGraphCompiler::EvaluateCondition(Condition condition,
+                                          intptr_t left,
+                                          intptr_t right) {
+  UNIMPLEMENTED();
+  return false;
+}
+
+
+FieldAddress FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid,
+                                                          Register array,
+                                                          intptr_t index) {
+  UNIMPLEMENTED();
+  return FieldAddress(array, index);
+}
+
+
+FieldAddress FlowGraphCompiler::ElementAddressForRegIndex(intptr_t cid,
+                                                          Register array,
+                                                          Register index) {
+  UNIMPLEMENTED();
+  return FieldAddress(array, index);
+}
+
+
+Address FlowGraphCompiler::ExternalElementAddressForIntIndex(intptr_t cid,
+                                                             Register array,
+                                                             intptr_t index) {
+  UNIMPLEMENTED();
+  return FieldAddress(array, index);
+}
+
+
+Address FlowGraphCompiler::ExternalElementAddressForRegIndex(intptr_t cid,
+                                                             Register array,
+                                                             Register index) {
+  UNIMPLEMENTED();
+  return FieldAddress(array, index);
+}
+
+
+void ParallelMoveResolver::EmitMove(int index) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::EmitSwap(int index) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::MoveMemoryToMemory(const Address& dst,
+                                              const Address& src) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::StoreObject(const Address& dst, const Object& obj) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::Exchange(Register reg, const Address& mem) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::Exchange(const Address& mem1, const Address& mem2) {
+  UNIMPLEMENTED();
+}
+
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_ARM
diff --git a/runtime/vm/flow_graph_compiler_arm.h b/runtime/vm/flow_graph_compiler_arm.h
deleted file mode 100644
index 8c4c209..0000000
--- a/runtime/vm/flow_graph_compiler_arm.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef VM_FLOW_GRAPH_COMPILER_ARM_H_
-#define VM_FLOW_GRAPH_COMPILER_ARM_H_
-
-#ifndef VM_FLOW_GRAPH_COMPILER_H_
-#error Include flow_graph_compiler.h instead of flow_graph_compiler_arm.h.
-#endif
-
-#include "vm/flow_graph.h"
-#include "vm/intermediate_language.h"
-
-namespace dart {
-
-class Assembler;
-class Code;
-template <typename T> class GrowableArray;
-class ParsedFunction;
-
-// Stubbed out implementation of graph compiler, bails out immediately if
-// CompileGraph is called. The rest of the public API is UNIMPLEMENTED.
-class FlowGraphCompiler : public FlowGraphVisitor {
- public:
-  FlowGraphCompiler(Assembler* assembler,
-                    const FlowGraph& flow_graph,
-                    bool is_optimizing)
-      : FlowGraphVisitor(flow_graph.reverse_postorder()),
-        parsed_function_(flow_graph.parsed_function()),
-        is_optimizing_(is_optimizing) {
-  }
-
-  virtual ~FlowGraphCompiler() { }
-
-  static bool CanOptimize();
-  bool CanOptimizeFunction() const;
-
-  void CompileGraph();
-
-  void FinalizePcDescriptors(const Code& code);
-  void FinalizeStackmaps(const Code& code);
-  void FinalizeVarDescriptors(const Code& code);
-  void FinalizeExceptionHandlers(const Code& code);
-  void FinalizeComments(const Code& code);
-
- private:
-  // Bail out of the flow graph compiler.  Does not return to the caller.
-  void Bailout(const char* reason);
-
-  const ParsedFunction& parsed_function_;
-  const bool is_optimizing_;
-
-  DISALLOW_COPY_AND_ASSIGN(FlowGraphCompiler);
-};
-
-}  // namespace dart
-
-#endif  // VM_FLOW_GRAPH_COMPILER_ARM_H_
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 7195095..97b8da1 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -26,6 +26,16 @@
 DECLARE_FLAG(bool, print_scopes);
 
 
+FlowGraphCompiler::~FlowGraphCompiler() {
+  // BlockInfos are zone-allocated, so their destructors are not called.
+  // Verify the labels explicitly here.
+  for (int i = 0; i < block_info_.length(); ++i) {
+    ASSERT(!block_info_[i]->label.IsLinked());
+    ASSERT(!block_info_[i]->label.HasNear());
+  }
+}
+
+
 bool FlowGraphCompiler::SupportsUnboxedMints() {
   // Support unboxed mints when SSE 4.1 is available.
   return FLAG_unbox_mints && CPUFeatures::sse4_1_supported();
@@ -57,7 +67,7 @@
 void FlowGraphCompiler::GenerateBoolToJump(Register bool_register,
                                            Label* is_true,
                                            Label* is_false) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label fall_through;
   __ cmpl(bool_register, raw_null);
@@ -79,7 +89,7 @@
     Label* is_not_instance_lbl) {
   const SubtypeTestCache& type_test_cache =
       SubtypeTestCache::ZoneHandle(SubtypeTestCache::New());
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ LoadObject(temp_reg, type_test_cache);
   __ pushl(temp_reg);  // Subtype test cache.
@@ -227,7 +237,7 @@
   }
   if (type.IsFunctionType()) {
     // Check if instance is a closure.
-    const Immediate raw_null =
+    const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
     __ LoadClassById(EDI, kClassIdReg);
     __ movl(EDI, FieldAddress(EDI, Class::signature_function_offset()));
@@ -294,7 +304,7 @@
   __ Comment("UninstantiatedTypeTest");
   ASSERT(!type.IsInstantiated());
   // Skip check if destination is a dynamic type.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   if (type.IsTypeParameter()) {
     const TypeParameter& type_param = TypeParameter::Cast(type);
@@ -454,7 +464,7 @@
                                            LocationSummary* locs) {
   ASSERT(type.IsFinalized() && !type.IsMalformed());
 
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label is_instance, is_not_instance;
   __ pushl(ECX);  // Store instantiator on stack.
@@ -543,7 +553,7 @@
   __ pushl(ECX);  // Store instantiator.
   __ pushl(EDX);  // Store instantiator type arguments.
   // A null object is always assignable and is returned as result.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label is_assignable, runtime_call;
   __ cmpl(EAX, raw_null);
@@ -675,7 +685,7 @@
   __ j(POSITIVE, &loop, Assembler::kNearJump);
 
   // Copy or initialize optional named arguments.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label all_arguments_processed;
   if (num_opt_named_params > 0) {
@@ -857,7 +867,7 @@
   __ movl(EAX, Address(ESP, 2 * kWordSize));  // Receiver.
   __ movl(EBX, Address(ESP, 1 * kWordSize));  // Value.
   __ StoreIntoObject(EAX, FieldAddress(EAX, offset), EBX);
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ movl(EAX, raw_null);
   __ ret();
@@ -1012,7 +1022,7 @@
   if (!is_optimizing() && (num_locals > 0)) {
     __ Comment("Initialize spill slots");
     const intptr_t slot_base = parsed_function().first_stack_local_index();
-    const Immediate raw_null =
+    const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
     __ movl(EAX, raw_null);
     for (intptr_t i = 0; i < num_locals; ++i) {
@@ -1267,7 +1277,7 @@
 // Fallthrough calls super equality.
 void FlowGraphCompiler::EmitSuperEqualityCallPrologue(Register result,
                                                       Label* skip_call) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label check_identity, fall_through;
   __ cmpl(Address(ESP, 0 * kWordSize), raw_null);
@@ -1291,7 +1301,7 @@
 }
 
 
-void FlowGraphCompiler::LoadDoubleOrSmiToXmm(XmmRegister result,
+void FlowGraphCompiler::LoadDoubleOrSmiToFpu(FpuRegister result,
                                              Register reg,
                                              Register temp,
                                              Label* not_double_or_smi) {
@@ -1312,7 +1322,7 @@
 
 void FlowGraphCompiler::SaveLiveRegisters(LocationSummary* locs) {
   // TODO(vegorov): consider saving only caller save (volatile) registers.
-  const intptr_t xmm_regs_count = locs->live_registers()->xmm_regs_count();
+  const intptr_t xmm_regs_count = locs->live_registers()->fpu_regs_count();
   if (xmm_regs_count > 0) {
     __ subl(ESP, Immediate(xmm_regs_count * kDoubleSize));
     // Store XMM registers with the lowest register number at the lowest
@@ -1320,7 +1330,7 @@
     intptr_t offset = 0;
     for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
       XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
-      if (locs->live_registers()->ContainsXmmRegister(xmm_reg)) {
+      if (locs->live_registers()->ContainsFpuRegister(xmm_reg)) {
         __ movsd(Address(ESP, offset), xmm_reg);
         offset += kDoubleSize;
       }
@@ -1349,13 +1359,13 @@
     }
   }
 
-  const intptr_t xmm_regs_count = locs->live_registers()->xmm_regs_count();
+  const intptr_t xmm_regs_count = locs->live_registers()->fpu_regs_count();
   if (xmm_regs_count > 0) {
     // XMM registers have the lowest register number at the lowest address.
     intptr_t offset = 0;
     for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
       XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
-      if (locs->live_registers()->ContainsXmmRegister(xmm_reg)) {
+      if (locs->live_registers()->ContainsFpuRegister(xmm_reg)) {
         __ movsd(xmm_reg, Address(ESP, offset));
         offset += kDoubleSize;
       }
@@ -1366,6 +1376,184 @@
 }
 
 
+void FlowGraphCompiler::EmitTestAndCall(const ICData& ic_data,
+                                        Register class_id_reg,
+                                        intptr_t arg_count,
+                                        const Array& arg_names,
+                                        Label* deopt,
+                                        intptr_t deopt_id,
+                                        intptr_t token_index,
+                                        LocationSummary* locs) {
+  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
+  Label match_found;
+  const intptr_t len = ic_data.NumberOfChecks();
+  GrowableArray<CidTarget> sorted(len);
+  SortICDataByCount(ic_data, &sorted);
+  for (intptr_t i = 0; i < len; i++) {
+    const bool is_last_check = (i == (len - 1));
+    Label next_test;
+    assembler()->cmpl(class_id_reg, Immediate(sorted[i].cid));
+    if (is_last_check) {
+      assembler()->j(NOT_EQUAL, deopt);
+    } else {
+      assembler()->j(NOT_EQUAL, &next_test);
+    }
+    GenerateStaticCall(deopt_id,
+                       token_index,
+                       *sorted[i].target,
+                       arg_count,
+                       arg_names,
+                       locs);
+    if (!is_last_check) {
+      assembler()->jmp(&match_found);
+    }
+    assembler()->Bind(&next_test);
+  }
+  assembler()->Bind(&match_found);
+}
+
+
+void FlowGraphCompiler::EmitDoubleCompareBranch(Condition true_condition,
+                                                FpuRegister left,
+                                                FpuRegister right,
+                                                BranchInstr* branch) {
+  ASSERT(branch != NULL);
+  assembler()->comisd(left, right);
+  BlockEntryInstr* nan_result = (true_condition == NOT_EQUAL) ?
+      branch->true_successor() : branch->false_successor();
+  assembler()->j(PARITY_EVEN, GetBlockLabel(nan_result));
+  branch->EmitBranchOnCondition(this, true_condition);
+}
+
+
+
+void FlowGraphCompiler::EmitDoubleCompareBool(Condition true_condition,
+                                              FpuRegister left,
+                                              FpuRegister right,
+                                              Register result) {
+  assembler()->comisd(left, right);
+  Label is_false, is_true, done;
+  assembler()->j(PARITY_EVEN, &is_false, Assembler::kNearJump);  // NaN false;
+  assembler()->j(true_condition, &is_true, Assembler::kNearJump);
+  assembler()->Bind(&is_false);
+  assembler()->LoadObject(result, Bool::False());
+  assembler()->jmp(&done);
+  assembler()->Bind(&is_true);
+  assembler()->LoadObject(result, Bool::True());
+  assembler()->Bind(&done);
+}
+
+
+Condition FlowGraphCompiler::FlipCondition(Condition condition) {
+  switch (condition) {
+    case EQUAL:         return EQUAL;
+    case NOT_EQUAL:     return NOT_EQUAL;
+    case LESS:          return GREATER;
+    case LESS_EQUAL:    return GREATER_EQUAL;
+    case GREATER:       return LESS;
+    case GREATER_EQUAL: return LESS_EQUAL;
+    case BELOW:         return ABOVE;
+    case BELOW_EQUAL:   return ABOVE_EQUAL;
+    case ABOVE:         return BELOW;
+    case ABOVE_EQUAL:   return BELOW_EQUAL;
+    default:
+      UNIMPLEMENTED();
+      return EQUAL;
+  }
+}
+
+
+bool FlowGraphCompiler::EvaluateCondition(Condition condition,
+                                          intptr_t left,
+                                          intptr_t right) {
+  const uintptr_t unsigned_left = static_cast<uintptr_t>(left);
+  const uintptr_t unsigned_right = static_cast<uintptr_t>(right);
+  switch (condition) {
+    case EQUAL:         return left == right;
+    case NOT_EQUAL:     return left != right;
+    case LESS:          return left < right;
+    case LESS_EQUAL:    return left <= right;
+    case GREATER:       return left > right;
+    case GREATER_EQUAL: return left >= right;
+    case BELOW:         return unsigned_left < unsigned_right;
+    case BELOW_EQUAL:   return unsigned_left <= unsigned_right;
+    case ABOVE:         return unsigned_left > unsigned_right;
+    case ABOVE_EQUAL:   return unsigned_left >= unsigned_right;
+    default:
+      UNIMPLEMENTED();
+      return false;
+  }
+}
+
+
+FieldAddress FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid,
+                                                          Register array,
+                                                          intptr_t index) {
+  const int64_t disp =
+      static_cast<int64_t>(index) * ElementSizeFor(cid) + DataOffsetFor(cid);
+  ASSERT(Utils::IsInt(32, disp));
+  return FieldAddress(array, static_cast<int32_t>(disp));
+}
+
+
+FieldAddress FlowGraphCompiler::ElementAddressForRegIndex(intptr_t cid,
+                                                          Register array,
+                                                          Register index) {
+  // Note that index is smi-tagged, (i.e, times 2) for all arrays with element
+  // size > 1. For Uint8Array and OneByteString the index is expected to be
+  // untagged before accessing.
+  ASSERT(kSmiTagShift == 1);
+  switch (cid) {
+    case kArrayCid:
+    case kImmutableArrayCid:
+      return FieldAddress(
+          array, index, TIMES_HALF_WORD_SIZE, Array::data_offset());
+    case kFloat32ArrayCid:
+      return FieldAddress(array, index, TIMES_2, Float32Array::data_offset());
+    case kFloat64ArrayCid:
+      return FieldAddress(array, index, TIMES_4, Float64Array::data_offset());
+    case kInt8ArrayCid:
+      return FieldAddress(array, index, TIMES_1, Int8Array::data_offset());
+    case kUint8ArrayCid:
+      return FieldAddress(array, index, TIMES_1, Uint8Array::data_offset());
+    case kUint8ClampedArrayCid:
+      return
+          FieldAddress(array, index, TIMES_1, Uint8ClampedArray::data_offset());
+    case kInt16ArrayCid:
+      return FieldAddress(array, index, TIMES_1, Int16Array::data_offset());
+    case kUint16ArrayCid:
+      return FieldAddress(array, index, TIMES_1, Uint16Array::data_offset());
+    case kOneByteStringCid:
+      return FieldAddress(array, index, TIMES_1, OneByteString::data_offset());
+    case kTwoByteStringCid:
+      return FieldAddress(array, index, TIMES_1, TwoByteString::data_offset());
+    default:
+      UNIMPLEMENTED();
+      return FieldAddress(SPREG, 0);
+  }
+}
+
+
+Address FlowGraphCompiler::ExternalElementAddressForIntIndex(intptr_t cid,
+                                                             Register array,
+                                                             intptr_t index) {
+  return Address(array, index * ElementSizeFor(cid));
+}
+
+
+Address FlowGraphCompiler::ExternalElementAddressForRegIndex(intptr_t cid,
+                                                             Register array,
+                                                             Register index) {
+  switch (cid) {
+    case kExternalUint8ArrayCid:
+      return Address(array, index, TIMES_1, 0);
+    default:
+      UNIMPLEMENTED();
+      return Address(SPREG, 0);
+  }
+}
+
+
 #undef __
 #define __ compiler_->assembler()->
 
@@ -1390,18 +1578,18 @@
       MoveMemoryToMemory(destination.ToStackSlotAddress(),
                          source.ToStackSlotAddress());
     }
-  } else if (source.IsXmmRegister()) {
-    if (destination.IsXmmRegister()) {
+  } else if (source.IsFpuRegister()) {
+    if (destination.IsFpuRegister()) {
       // Optimization manual recommends using MOVAPS for register
       // to register moves.
-      __ movaps(destination.xmm_reg(), source.xmm_reg());
+      __ movaps(destination.fpu_reg(), source.fpu_reg());
     } else {
       ASSERT(destination.IsDoubleStackSlot());
-      __ movsd(destination.ToStackSlotAddress(), source.xmm_reg());
+      __ movsd(destination.ToStackSlotAddress(), source.fpu_reg());
     }
   } else if (source.IsDoubleStackSlot()) {
-    if (destination.IsXmmRegister()) {
-      __ movsd(destination.xmm_reg(), source.ToStackSlotAddress());
+    if (destination.IsFpuRegister()) {
+      __ movsd(destination.fpu_reg(), source.ToStackSlotAddress());
     } else {
       ASSERT(destination.IsDoubleStackSlot());
       __ movsd(XMM0, source.ToStackSlotAddress());
@@ -1439,15 +1627,15 @@
     Exchange(destination.reg(), source.ToStackSlotAddress());
   } else if (source.IsStackSlot() && destination.IsStackSlot()) {
     Exchange(destination.ToStackSlotAddress(), source.ToStackSlotAddress());
-  } else if (source.IsXmmRegister() && destination.IsXmmRegister()) {
-    __ movaps(XMM0, source.xmm_reg());
-    __ movaps(source.xmm_reg(), destination.xmm_reg());
-    __ movaps(destination.xmm_reg(), XMM0);
-  } else if (source.IsXmmRegister() || destination.IsXmmRegister()) {
+  } else if (source.IsFpuRegister() && destination.IsFpuRegister()) {
+    __ movaps(XMM0, source.fpu_reg());
+    __ movaps(source.fpu_reg(), destination.fpu_reg());
+    __ movaps(destination.fpu_reg(), XMM0);
+  } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
     ASSERT(destination.IsDoubleStackSlot() || source.IsDoubleStackSlot());
-    XmmRegister reg = source.IsXmmRegister() ? source.xmm_reg()
-                                             : destination.xmm_reg();
-    Address slot_address = source.IsXmmRegister()
+    XmmRegister reg = source.IsFpuRegister() ? source.fpu_reg()
+                                             : destination.fpu_reg();
+    const Address& slot_address = source.IsFpuRegister()
         ? destination.ToStackSlotAddress()
         : source.ToStackSlotAddress();
 
diff --git a/runtime/vm/flow_graph_compiler_ia32.h b/runtime/vm/flow_graph_compiler_ia32.h
deleted file mode 100644
index 3f7cf0e..0000000
--- a/runtime/vm/flow_graph_compiler_ia32.h
+++ /dev/null
@@ -1,366 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef VM_FLOW_GRAPH_COMPILER_IA32_H_
-#define VM_FLOW_GRAPH_COMPILER_IA32_H_
-
-#ifndef VM_FLOW_GRAPH_COMPILER_H_
-#error Include flow_graph_compiler.h instead of flow_graph_compiler_ia32.h.
-#endif
-
-namespace dart {
-
-class Code;
-class FlowGraph;
-template <typename T> class GrowableArray;
-class ParsedFunction;
-
-class FlowGraphCompiler : public ValueObject {
- private:
-  struct BlockInfo : public ZoneAllocated {
-   public:
-    BlockInfo() : label() { }
-    Label label;
-  };
-
- public:
-  FlowGraphCompiler(Assembler* assembler,
-                    const FlowGraph& flow_graph,
-                    bool is_optimizing);
-
-  ~FlowGraphCompiler();
-
-  static bool SupportsUnboxedMints();
-
-  // Accessors.
-  Assembler* assembler() const { return assembler_; }
-  const ParsedFunction& parsed_function() const { return parsed_function_; }
-  const GrowableArray<BlockEntryInstr*>& block_order() const {
-    return block_order_;
-  }
-  DescriptorList* pc_descriptors_list() const {
-    return pc_descriptors_list_;
-  }
-  BlockEntryInstr* current_block() const { return current_block_; }
-  void set_current_block(BlockEntryInstr* value) {
-    current_block_ = value;
-  }
-  static bool CanOptimize();
-  bool CanOptimizeFunction() const;
-
-  bool is_optimizing() const { return is_optimizing_; }
-
-  const GrowableArray<BlockInfo*>& block_info() const { return block_info_; }
-  ParallelMoveResolver* parallel_move_resolver() {
-    return &parallel_move_resolver_;
-  }
-
-  // Constructor is lighweight, major initialization work should occur here.
-  // This makes it easier to measure time spent in the compiler.
-  void InitCompiler();
-
-  void CompileGraph();
-
-  void VisitBlocks();
-
-  // Bail out of the flow graph compiler. Does not return to the caller.
-  void Bailout(const char* reason);
-
-  void LoadDoubleOrSmiToXmm(XmmRegister result,
-                            Register reg,
-                            Register temp,
-                            Label* not_double_or_smi);
-
-  // Returns 'true' if code generation for this function is complete, i.e.,
-  // no fall-through to regular code is needed.
-  bool TryIntrinsify();
-
-  void GenerateCallRuntime(intptr_t token_pos,
-                           const RuntimeEntry& entry,
-                           LocationSummary* locs);
-
-  void GenerateCall(intptr_t token_pos,
-                    const ExternalLabel* label,
-                    PcDescriptors::Kind kind,
-                    LocationSummary* locs);
-
-  void GenerateDartCall(intptr_t deopt_id,
-                        intptr_t token_pos,
-                        const ExternalLabel* label,
-                        PcDescriptors::Kind kind,
-                        LocationSummary* locs);
-
-  void GenerateAssertAssignable(intptr_t token_pos,
-                                const AbstractType& dst_type,
-                                const String& dst_name,
-                                LocationSummary* locs);
-
-  void GenerateInstanceOf(intptr_t token_pos,
-                          const AbstractType& type,
-                          bool negate_result,
-                          LocationSummary* locs);
-
-  void GenerateInstanceCall(intptr_t deopt_id,
-                            intptr_t token_pos,
-                            intptr_t argument_count,
-                            const Array& argument_names,
-                            LocationSummary* locs,
-                            const ICData& ic_data);
-
-  void GenerateStaticCall(intptr_t deopt_id,
-                          intptr_t token_pos,
-                          const Function& function,
-                          intptr_t argument_count,
-                          const Array& argument_names,
-                          LocationSummary* locs);
-
-  void GenerateNumberTypeCheck(Register kClassIdReg,
-                               const AbstractType& type,
-                               Label* is_instance_lbl,
-                               Label* is_not_instance_lbl);
-  void GenerateStringTypeCheck(Register kClassIdReg,
-                               Label* is_instance_lbl,
-                               Label* is_not_instance_lbl);
-  void GenerateListTypeCheck(Register kClassIdReg,
-                             Label* is_instance_lbl);
-
-  void EmitComment(Instruction* instr);
-
-  void EmitOptimizedInstanceCall(ExternalLabel* target_label,
-                                 const ICData& ic_data,
-                                 const Array& arguments_descriptor,
-                                 intptr_t argument_count,
-                                 intptr_t deopt_id,
-                                 intptr_t token_pos,
-                                 LocationSummary* locs);
-
-  void EmitInstanceCall(ExternalLabel* target_label,
-                        const ICData& ic_data,
-                        const Array& arguments_descriptor,
-                        intptr_t argument_count,
-                        intptr_t deopt_id,
-                        intptr_t token_pos,
-                        LocationSummary* locs);
-
-  void EmitMegamorphicInstanceCall(const ICData& ic_data,
-                                   const Array& arguments_descriptor,
-                                   intptr_t argument_count,
-                                   intptr_t deopt_id,
-                                   intptr_t token_pos,
-                                   LocationSummary* locs);
-
-  void EmitTestAndCall(const ICData& ic_data,
-                       Register class_id_reg,
-                       intptr_t arg_count,
-                       const Array& arg_names,
-                       Label* deopt,
-                       intptr_t deopt_id,
-                       intptr_t token_index,
-                       LocationSummary* locs);
-
-  void EmitDoubleCompareBranch(Condition true_condition,
-                               XmmRegister left,
-                               XmmRegister right,
-                               BranchInstr* branch);
-  void EmitDoubleCompareBool(Condition true_condition,
-                             XmmRegister left,
-                             XmmRegister right,
-                             Register result);
-
-  void EmitEqualityRegConstCompare(Register reg,
-                                   const Object& obj,
-                                   bool needs_number_check);
-  void EmitEqualityRegRegCompare(Register left,
-                                 Register right,
-                                 bool needs_number_check);
-  // Implement equality: if any of the arguments is null do identity check.
-  // Fallthrough calls super equality.
-  void EmitSuperEqualityCallPrologue(Register result, Label* skip_call);
-
-  intptr_t StackSize() const;
-
-  // Returns assembler label associated with the given block entry.
-  Label* GetBlockLabel(BlockEntryInstr* block_entry) const;
-
-  // Returns true if there is a next block after the current one in
-  // the block order and if it is the given block.
-  bool IsNextBlock(BlockEntryInstr* block_entry) const;
-
-  void AddExceptionHandler(intptr_t try_index, intptr_t pc_offset);
-  void AddCurrentDescriptor(PcDescriptors::Kind kind,
-                            intptr_t deopt_id,
-                            intptr_t token_pos);
-
-  void RecordSafepoint(LocationSummary* locs);
-
-  Label* AddDeoptStub(intptr_t deopt_id, DeoptReasonId reason);
-
-  void AddDeoptIndexAtCall(intptr_t deopt_id, intptr_t token_pos);
-
-  void AddSlowPathCode(SlowPathCode* slow_path);
-
-  void FinalizeExceptionHandlers(const Code& code);
-  void FinalizePcDescriptors(const Code& code);
-  void FinalizeDeoptInfo(const Code& code);
-  void FinalizeStackmaps(const Code& code);
-  void FinalizeVarDescriptors(const Code& code);
-  void FinalizeComments(const Code& code);
-  void FinalizeStaticCallTargetsTable(const Code& code);
-
-  const Class& double_class() const { return double_class_; }
-
-  void SaveLiveRegisters(LocationSummary* locs);
-  void RestoreLiveRegisters(LocationSummary* locs);
-
-  // Returns true if the compiled function has a finally clause.
-  bool HasFinally() const;
-
-  intptr_t CurrentTryIndex() const {
-    if (current_block_ == NULL) {
-      return CatchClauseNode::kInvalidTryIndex;
-    }
-    return current_block_->try_index();
-  }
-
-  bool may_reoptimize() const { return may_reoptimize_; }
-
-  static const int kLocalsOffsetFromFP = (-1 * kWordSize);
-
-  static Condition FlipCondition(Condition condition);
-
-  static bool EvaluateCondition(Condition condition, intptr_t l, intptr_t r);
-
-  // Array/list element address computations.
-  static intptr_t DataOffsetFor(intptr_t cid);
-  static intptr_t ElementSizeFor(intptr_t cid);
-  static FieldAddress ElementAddressForIntIndex(intptr_t cid,
-                                                Register array,
-                                                intptr_t offset);
-  static FieldAddress ElementAddressForRegIndex(intptr_t cid,
-                                                Register array,
-                                                Register index);
-
- private:
-  void EmitFrameEntry();
-
-  void AddStaticCallTarget(const Function& function);
-
-  void GenerateDeferredCode();
-
-  void EmitInstructionPrologue(Instruction* instr);
-  void EmitInstructionEpilogue(Instruction* instr);
-
-  // Emit code to load a Value into register 'dst'.
-  void LoadValue(Register dst, Value* value);
-
-  void EmitStaticCall(const Function& function,
-                      const Array& arguments_descriptor,
-                      intptr_t argument_count,
-                      intptr_t deopt_id,
-                      intptr_t token_pos,
-                      LocationSummary* locs);
-
-  // Type checking helper methods.
-  void CheckClassIds(Register class_id_reg,
-                     const GrowableArray<intptr_t>& class_ids,
-                     Label* is_instance_lbl,
-                     Label* is_not_instance_lbl);
-
-  RawSubtypeTestCache* GenerateInlineInstanceof(intptr_t token_pos,
-                                                const AbstractType& type,
-                                                Label* is_instance_lbl,
-                                                Label* is_not_instance_lbl);
-
-  RawSubtypeTestCache* GenerateInstantiatedTypeWithArgumentsTest(
-      intptr_t token_pos,
-      const AbstractType& dst_type,
-      Label* is_instance_lbl,
-      Label* is_not_instance_lbl);
-
-  bool GenerateInstantiatedTypeNoArgumentsTest(intptr_t token_pos,
-                                               const AbstractType& dst_type,
-                                               Label* is_instance_lbl,
-                                               Label* is_not_instance_lbl);
-
-  RawSubtypeTestCache* GenerateUninstantiatedTypeTest(
-      intptr_t token_pos,
-      const AbstractType& dst_type,
-      Label* is_instance_lbl,
-      Label* is_not_instance_label);
-
-  RawSubtypeTestCache* GenerateSubtype1TestCacheLookup(
-      intptr_t token_pos,
-      const Class& type_class,
-      Label* is_instance_lbl,
-      Label* is_not_instance_lbl);
-
-  enum TypeTestStubKind {
-    kTestTypeOneArg,
-    kTestTypeTwoArgs,
-    kTestTypeThreeArgs,
-  };
-
-  RawSubtypeTestCache* GenerateCallSubtypeTestStub(TypeTestStubKind test_kind,
-                                                   Register instance_reg,
-                                                   Register type_arguments_reg,
-                                                   Register temp_reg,
-                                                   Label* is_instance_lbl,
-                                                   Label* is_not_instance_lbl);
-
-  // Returns true if checking against this type is a direct class id comparison.
-  bool TypeCheckAsClassEquality(const AbstractType& type);
-
-  void GenerateBoolToJump(Register bool_reg, Label* is_true, Label* is_false);
-
-  void CopyParameters();
-
-  void GenerateInlinedGetter(intptr_t offset);
-  void GenerateInlinedSetter(intptr_t offset);
-
-  // Perform a greedy local register allocation.  Consider all registers free.
-  void AllocateRegistersLocally(Instruction* instr);
-
-  // Map a block number in a forward iteration into the block number in the
-  // corresponding reverse iteration.  Used to obtain an index into
-  // block_order for reverse iterations.
-  intptr_t reverse_index(intptr_t index) const {
-    return block_order_.length() - index - 1;
-  }
-
-  class Assembler* assembler_;
-  const ParsedFunction& parsed_function_;
-  const GrowableArray<BlockEntryInstr*>& block_order_;
-
-  // Compiler specific per-block state.  Indexed by postorder block number
-  // for convenience.  This is not the block's index in the block order,
-  // which is reverse postorder.
-  BlockEntryInstr* current_block_;
-  ExceptionHandlerList* exception_handlers_list_;
-  DescriptorList* pc_descriptors_list_;
-  StackmapTableBuilder* stackmap_table_builder_;
-  GrowableArray<BlockInfo*> block_info_;
-  GrowableArray<CompilerDeoptInfo*> deopt_infos_;
-  GrowableArray<SlowPathCode*> slow_path_code_;
-  // Stores: [code offset, function, null(code)].
-  const GrowableObjectArray& static_calls_target_table_;
-  const bool is_optimizing_;
-  // Set to true if optimized code has IC calls.
-  bool may_reoptimize_;
-
-  const Class& double_class_;
-
-  ParallelMoveResolver parallel_move_resolver_;
-
-  // Currently instructions generate deopt stubs internally by
-  // calling AddDeoptStub.  To communicate deoptimization environment
-  // that should be used when deoptimizing we store it in this variable.
-  // In future AddDeoptStub should be moved out of the instruction template.
-  Environment* pending_deoptimization_env_;
-
-  DISALLOW_COPY_AND_ASSIGN(FlowGraphCompiler);
-};
-
-}  // namespace dart
-
-#endif  // VM_FLOW_GRAPH_COMPILER_IA32_H_
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
new file mode 100644
index 0000000..c6243bc
--- /dev/null
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -0,0 +1,368 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"  // Needed here to get TARGET_ARCH_MIPS.
+#if defined(TARGET_ARCH_MIPS)
+
+#include "vm/flow_graph_compiler.h"
+
+#include "vm/longjump.h"
+
+namespace dart {
+
+FlowGraphCompiler::~FlowGraphCompiler() {
+  // BlockInfos are zone-allocated, so their destructors are not called.
+  // Verify the labels explicitly here.
+  for (int i = 0; i < block_info_.length(); ++i) {
+    ASSERT(!block_info_[i]->label.IsLinked());
+  }
+}
+
+
+bool FlowGraphCompiler::SupportsUnboxedMints() {
+  return false;
+}
+
+
+void CompilerDeoptInfoWithStub::GenerateCode(FlowGraphCompiler* compiler,
+                                             intptr_t stub_ix) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateBoolToJump(Register bool_register,
+                                           Label* is_true,
+                                           Label* is_false) {
+  UNIMPLEMENTED();
+}
+
+
+RawSubtypeTestCache* FlowGraphCompiler::GenerateCallSubtypeTestStub(
+    TypeTestStubKind test_kind,
+    Register instance_reg,
+    Register type_arguments_reg,
+    Register temp_reg,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+RawSubtypeTestCache*
+FlowGraphCompiler::GenerateInstantiatedTypeWithArgumentsTest(
+    intptr_t token_pos,
+    const AbstractType& type,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void FlowGraphCompiler::CheckClassIds(Register class_id_reg,
+                                      const GrowableArray<intptr_t>& class_ids,
+                                      Label* is_equal_lbl,
+                                      Label* is_not_equal_lbl) {
+  UNIMPLEMENTED();
+}
+
+
+bool FlowGraphCompiler::GenerateInstantiatedTypeNoArgumentsTest(
+    intptr_t token_pos,
+    const AbstractType& type,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return false;
+}
+
+
+RawSubtypeTestCache* FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
+    intptr_t token_pos,
+    const Class& type_class,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+RawSubtypeTestCache* FlowGraphCompiler::GenerateUninstantiatedTypeTest(
+    intptr_t token_pos,
+    const AbstractType& type,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof(
+    intptr_t token_pos,
+    const AbstractType& type,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void FlowGraphCompiler::GenerateInstanceOf(intptr_t token_pos,
+                                           const AbstractType& type,
+                                           bool negate_result,
+                                           LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateAssertAssignable(intptr_t token_pos,
+                                                 const AbstractType& dst_type,
+                                                 const String& dst_name,
+                                                 LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitInstructionPrologue(Instruction* instr) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitInstructionEpilogue(Instruction* instr) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::CopyParameters() {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateInlinedGetter(intptr_t offset) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateInlinedSetter(intptr_t offset) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitFrameEntry() {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::CompileGraph() {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateCall(intptr_t token_pos,
+                                     const ExternalLabel* label,
+                                     PcDescriptors::Kind kind,
+                                     LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
+                                         intptr_t token_pos,
+                                         const ExternalLabel* label,
+                                         PcDescriptors::Kind kind,
+                                         LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateCallRuntime(intptr_t token_pos,
+                                            const RuntimeEntry& entry,
+                                            LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitOptimizedInstanceCall(
+    ExternalLabel* target_label,
+    const ICData& ic_data,
+    const Array& arguments_descriptor,
+    intptr_t argument_count,
+    intptr_t deopt_id,
+    intptr_t token_pos,
+    LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitInstanceCall(ExternalLabel* target_label,
+                                         const ICData& ic_data,
+                                         const Array& arguments_descriptor,
+                                         intptr_t argument_count,
+                                         intptr_t deopt_id,
+                                         intptr_t token_pos,
+                                         LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitMegamorphicInstanceCall(
+    const ICData& ic_data,
+    const Array& arguments_descriptor,
+    intptr_t argument_count,
+    intptr_t deopt_id,
+    intptr_t token_pos,
+    LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitStaticCall(const Function& function,
+                                       const Array& arguments_descriptor,
+                                       intptr_t argument_count,
+                                       intptr_t deopt_id,
+                                       intptr_t token_pos,
+                                       LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitEqualityRegConstCompare(Register reg,
+                                                    const Object& obj,
+                                                    bool needs_number_check) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitEqualityRegRegCompare(Register left,
+                                                  Register right,
+                                                  bool needs_number_check) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitSuperEqualityCallPrologue(Register result,
+                                                      Label* skip_call) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::SaveLiveRegisters(LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::RestoreLiveRegisters(LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitTestAndCall(const ICData& ic_data,
+                                        Register class_id_reg,
+                                        intptr_t arg_count,
+                                        const Array& arg_names,
+                                        Label* deopt,
+                                        intptr_t deopt_id,
+                                        intptr_t token_index,
+                                        LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitDoubleCompareBranch(Condition true_condition,
+                                                FpuRegister left,
+                                                FpuRegister right,
+                                                BranchInstr* branch) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitDoubleCompareBool(Condition true_condition,
+                                              FpuRegister left,
+                                              FpuRegister right,
+                                              Register result) {
+  UNIMPLEMENTED();
+}
+
+
+Condition FlowGraphCompiler::FlipCondition(Condition condition) {
+  UNIMPLEMENTED();
+  return condition;
+}
+
+
+bool FlowGraphCompiler::EvaluateCondition(Condition condition,
+                                          intptr_t left,
+                                          intptr_t right) {
+  UNIMPLEMENTED();
+  return false;
+}
+
+
+FieldAddress FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid,
+                                                          Register array,
+                                                          intptr_t index) {
+  UNIMPLEMENTED();
+  return FieldAddress(array, index);
+}
+
+
+FieldAddress FlowGraphCompiler::ElementAddressForRegIndex(intptr_t cid,
+                                                          Register array,
+                                                          Register index) {
+  UNIMPLEMENTED();
+  return FieldAddress(array, index);
+}
+
+
+Address FlowGraphCompiler::ExternalElementAddressForIntIndex(intptr_t cid,
+                                                             Register array,
+                                                             intptr_t index) {
+  UNIMPLEMENTED();
+  return FieldAddress(array, index);
+}
+
+
+Address FlowGraphCompiler::ExternalElementAddressForRegIndex(intptr_t cid,
+                                                             Register array,
+                                                             Register index) {
+  UNIMPLEMENTED();
+  return FieldAddress(array, index);
+}
+
+
+void ParallelMoveResolver::EmitMove(int index) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::EmitSwap(int index) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::MoveMemoryToMemory(const Address& dst,
+                                              const Address& src) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::StoreObject(const Address& dst, const Object& obj) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::Exchange(Register reg, const Address& mem) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::Exchange(const Address& mem1, const Address& mem2) {
+  UNIMPLEMENTED();
+}
+
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 19e3f4e..777f1ae 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -26,6 +26,16 @@
 DECLARE_FLAG(bool, use_sse41);
 
 
+FlowGraphCompiler::~FlowGraphCompiler() {
+  // BlockInfos are zone-allocated, so their destructors are not called.
+  // Verify the labels explicitly here.
+  for (int i = 0; i < block_info_.length(); ++i) {
+    ASSERT(!block_info_[i]->label.IsLinked());
+    ASSERT(!block_info_[i]->label.HasNear());
+  }
+}
+
+
 bool FlowGraphCompiler::SupportsUnboxedMints() {
   return false;
 }
@@ -57,7 +67,7 @@
 void FlowGraphCompiler::GenerateBoolToJump(Register bool_register,
                                            Label* is_true,
                                            Label* is_false) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label fall_through;
   __ cmpq(bool_register, raw_null);
@@ -79,7 +89,7 @@
     Label* is_not_instance_lbl) {
   const SubtypeTestCache& type_test_cache =
       SubtypeTestCache::ZoneHandle(SubtypeTestCache::New());
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ LoadObject(temp_reg, type_test_cache);
   __ pushq(temp_reg);  // Subtype test cache.
@@ -227,7 +237,7 @@
   }
   if (type.IsFunctionType()) {
     // Check if instance is a closure.
-    const Immediate raw_null =
+    const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
     __ LoadClassById(R13, kClassIdReg);
     __ movq(R13, FieldAddress(R13, Class::signature_function_offset()));
@@ -294,7 +304,7 @@
   __ Comment("UninstantiatedTypeTest");
   ASSERT(!type.IsInstantiated());
   // Skip check if destination is a dynamic type.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   if (type.IsTypeParameter()) {
     const TypeParameter& type_param = TypeParameter::Cast(type);
@@ -454,7 +464,7 @@
                                            LocationSummary* locs) {
   ASSERT(type.IsFinalized() && !type.IsMalformed());
 
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label is_instance, is_not_instance;
   __ pushq(RCX);  // Store instantiator on stack.
@@ -543,7 +553,7 @@
   __ pushq(RCX);  // Store instantiator.
   __ pushq(RDX);  // Store instantiator type arguments.
   // A null object is always assignable and is returned as result.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label is_assignable, runtime_call;
   __ cmpq(RAX, raw_null);
@@ -677,7 +687,7 @@
   __ j(POSITIVE, &loop, Assembler::kNearJump);
 
   // Copy or initialize optional named arguments.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label all_arguments_processed;
   if (num_opt_named_params > 0) {
@@ -859,7 +869,7 @@
   __ movq(RAX, Address(RSP, 2 * kWordSize));  // Receiver.
   __ movq(RBX, Address(RSP, 1 * kWordSize));  // Value.
   __ StoreIntoObject(RAX, FieldAddress(RAX, offset), RBX);
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ movq(RAX, raw_null);
   __ ret();
@@ -1015,7 +1025,7 @@
   if (!is_optimizing() && (num_locals > 0)) {
     __ Comment("Initialize spill slots");
     const intptr_t slot_base = parsed_function().first_stack_local_index();
-    const Immediate raw_null =
+    const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
     __ movq(RAX, raw_null);
     for (intptr_t i = 0; i < num_locals; ++i) {
@@ -1271,7 +1281,7 @@
 // Fallthrough calls super equality.
 void FlowGraphCompiler::EmitSuperEqualityCallPrologue(Register result,
                                                       Label* skip_call) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label check_identity, fall_through;
   __ cmpq(Address(RSP, 0 * kWordSize), raw_null);
@@ -1295,7 +1305,7 @@
 }
 
 
-void FlowGraphCompiler::LoadDoubleOrSmiToXmm(XmmRegister result,
+void FlowGraphCompiler::LoadDoubleOrSmiToFpu(FpuRegister result,
                                              Register reg,
                                              Register temp,
                                              Label* not_double_or_smi) {
@@ -1316,7 +1326,7 @@
 
 void FlowGraphCompiler::SaveLiveRegisters(LocationSummary* locs) {
   // TODO(vegorov): consider saving only caller save (volatile) registers.
-  const intptr_t xmm_regs_count = locs->live_registers()->xmm_regs_count();
+  const intptr_t xmm_regs_count = locs->live_registers()->fpu_regs_count();
   if (xmm_regs_count > 0) {
     __ subq(RSP, Immediate(xmm_regs_count * kDoubleSize));
     // Store XMM registers with the lowest register number at the lowest
@@ -1324,7 +1334,7 @@
     intptr_t offset = 0;
     for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
       XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
-      if (locs->live_registers()->ContainsXmmRegister(xmm_reg)) {
+      if (locs->live_registers()->ContainsFpuRegister(xmm_reg)) {
         __ movsd(Address(RSP, offset), xmm_reg);
         offset += kDoubleSize;
       }
@@ -1353,13 +1363,13 @@
     }
   }
 
-  const intptr_t xmm_regs_count = locs->live_registers()->xmm_regs_count();
+  const intptr_t xmm_regs_count = locs->live_registers()->fpu_regs_count();
   if (xmm_regs_count > 0) {
     // XMM registers have the lowest register number at the lowest address.
     intptr_t offset = 0;
     for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
       XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
-      if (locs->live_registers()->ContainsXmmRegister(xmm_reg)) {
+      if (locs->live_registers()->ContainsFpuRegister(xmm_reg)) {
         __ movsd(xmm_reg, Address(RSP, offset));
         offset += kDoubleSize;
       }
@@ -1370,6 +1380,184 @@
 }
 
 
+void FlowGraphCompiler::EmitTestAndCall(const ICData& ic_data,
+                                        Register class_id_reg,
+                                        intptr_t arg_count,
+                                        const Array& arg_names,
+                                        Label* deopt,
+                                        intptr_t deopt_id,
+                                        intptr_t token_index,
+                                        LocationSummary* locs) {
+  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
+  Label match_found;
+  const intptr_t len = ic_data.NumberOfChecks();
+  GrowableArray<CidTarget> sorted(len);
+  SortICDataByCount(ic_data, &sorted);
+  for (intptr_t i = 0; i < len; i++) {
+    const bool is_last_check = (i == (len - 1));
+    Label next_test;
+    assembler()->cmpl(class_id_reg, Immediate(sorted[i].cid));
+    if (is_last_check) {
+      assembler()->j(NOT_EQUAL, deopt);
+    } else {
+      assembler()->j(NOT_EQUAL, &next_test);
+    }
+    GenerateStaticCall(deopt_id,
+                       token_index,
+                       *sorted[i].target,
+                       arg_count,
+                       arg_names,
+                       locs);
+    if (!is_last_check) {
+      assembler()->jmp(&match_found);
+    }
+    assembler()->Bind(&next_test);
+  }
+  assembler()->Bind(&match_found);
+}
+
+
+void FlowGraphCompiler::EmitDoubleCompareBranch(Condition true_condition,
+                                                FpuRegister left,
+                                                FpuRegister right,
+                                                BranchInstr* branch) {
+  ASSERT(branch != NULL);
+  assembler()->comisd(left, right);
+  BlockEntryInstr* nan_result = (true_condition == NOT_EQUAL) ?
+      branch->true_successor() : branch->false_successor();
+  assembler()->j(PARITY_EVEN, GetBlockLabel(nan_result));
+  branch->EmitBranchOnCondition(this, true_condition);
+}
+
+
+
+void FlowGraphCompiler::EmitDoubleCompareBool(Condition true_condition,
+                                              FpuRegister left,
+                                              FpuRegister right,
+                                              Register result) {
+  assembler()->comisd(left, right);
+  Label is_false, is_true, done;
+  assembler()->j(PARITY_EVEN, &is_false, Assembler::kNearJump);  // NaN false;
+  assembler()->j(true_condition, &is_true, Assembler::kNearJump);
+  assembler()->Bind(&is_false);
+  assembler()->LoadObject(result, Bool::False());
+  assembler()->jmp(&done);
+  assembler()->Bind(&is_true);
+  assembler()->LoadObject(result, Bool::True());
+  assembler()->Bind(&done);
+}
+
+
+Condition FlowGraphCompiler::FlipCondition(Condition condition) {
+  switch (condition) {
+    case EQUAL:         return EQUAL;
+    case NOT_EQUAL:     return NOT_EQUAL;
+    case LESS:          return GREATER;
+    case LESS_EQUAL:    return GREATER_EQUAL;
+    case GREATER:       return LESS;
+    case GREATER_EQUAL: return LESS_EQUAL;
+    case BELOW:         return ABOVE;
+    case BELOW_EQUAL:   return ABOVE_EQUAL;
+    case ABOVE:         return BELOW;
+    case ABOVE_EQUAL:   return BELOW_EQUAL;
+    default:
+      UNIMPLEMENTED();
+      return EQUAL;
+  }
+}
+
+
+bool FlowGraphCompiler::EvaluateCondition(Condition condition,
+                                          intptr_t left,
+                                          intptr_t right) {
+  const uintptr_t unsigned_left = static_cast<uintptr_t>(left);
+  const uintptr_t unsigned_right = static_cast<uintptr_t>(right);
+  switch (condition) {
+    case EQUAL:         return left == right;
+    case NOT_EQUAL:     return left != right;
+    case LESS:          return left < right;
+    case LESS_EQUAL:    return left <= right;
+    case GREATER:       return left > right;
+    case GREATER_EQUAL: return left >= right;
+    case BELOW:         return unsigned_left < unsigned_right;
+    case BELOW_EQUAL:   return unsigned_left <= unsigned_right;
+    case ABOVE:         return unsigned_left > unsigned_right;
+    case ABOVE_EQUAL:   return unsigned_left >= unsigned_right;
+    default:
+      UNIMPLEMENTED();
+      return false;
+  }
+}
+
+
+FieldAddress FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid,
+                                                          Register array,
+                                                          intptr_t index) {
+  const int64_t disp =
+      static_cast<int64_t>(index) * ElementSizeFor(cid) + DataOffsetFor(cid);
+  ASSERT(Utils::IsInt(32, disp));
+  return FieldAddress(array, static_cast<int32_t>(disp));
+}
+
+
+FieldAddress FlowGraphCompiler::ElementAddressForRegIndex(intptr_t cid,
+                                                          Register array,
+                                                          Register index) {
+  // Note that index is smi-tagged, (i.e, times 2) for all arrays with element
+  // size > 1. For Uint8Array and OneByteString the index is expected to be
+  // untagged before accessing.
+  ASSERT(kSmiTagShift == 1);
+  switch (cid) {
+    case kArrayCid:
+    case kImmutableArrayCid:
+      return FieldAddress(
+          array, index, TIMES_HALF_WORD_SIZE, Array::data_offset());
+    case kFloat32ArrayCid:
+      return FieldAddress(array, index, TIMES_2, Float32Array::data_offset());
+    case kFloat64ArrayCid:
+      return FieldAddress(array, index, TIMES_4, Float64Array::data_offset());
+    case kInt8ArrayCid:
+      return FieldAddress(array, index, TIMES_1, Int8Array::data_offset());
+    case kUint8ArrayCid:
+      return FieldAddress(array, index, TIMES_1, Uint8Array::data_offset());
+    case kUint8ClampedArrayCid:
+      return
+          FieldAddress(array, index, TIMES_1, Uint8ClampedArray::data_offset());
+    case kInt16ArrayCid:
+      return FieldAddress(array, index, TIMES_1, Int16Array::data_offset());
+    case kUint16ArrayCid:
+      return FieldAddress(array, index, TIMES_1, Uint16Array::data_offset());
+    case kOneByteStringCid:
+      return FieldAddress(array, index, TIMES_1, OneByteString::data_offset());
+    case kTwoByteStringCid:
+      return FieldAddress(array, index, TIMES_1, TwoByteString::data_offset());
+    default:
+      UNIMPLEMENTED();
+      return FieldAddress(SPREG, 0);
+  }
+}
+
+
+Address FlowGraphCompiler::ExternalElementAddressForIntIndex(intptr_t cid,
+                                                             Register array,
+                                                             intptr_t index) {
+  return Address(array, index * ElementSizeFor(cid));
+}
+
+
+Address FlowGraphCompiler::ExternalElementAddressForRegIndex(intptr_t cid,
+                                                             Register array,
+                                                             Register index) {
+  switch (cid) {
+    case kExternalUint8ArrayCid:
+      return Address(array, index, TIMES_1, 0);
+    default:
+      UNIMPLEMENTED();
+      return Address(SPREG, 0);
+  }
+}
+
+
 #undef __
 #define __ compiler_->assembler()->
 
@@ -1394,18 +1582,18 @@
       MoveMemoryToMemory(destination.ToStackSlotAddress(),
                          source.ToStackSlotAddress());
     }
-  } else if (source.IsXmmRegister()) {
-    if (destination.IsXmmRegister()) {
+  } else if (source.IsFpuRegister()) {
+    if (destination.IsFpuRegister()) {
       // Optimization manual recommends using MOVAPS for register
       // to register moves.
-      __ movaps(destination.xmm_reg(), source.xmm_reg());
+      __ movaps(destination.fpu_reg(), source.fpu_reg());
     } else {
       ASSERT(destination.IsDoubleStackSlot());
-      __ movsd(destination.ToStackSlotAddress(), source.xmm_reg());
+      __ movsd(destination.ToStackSlotAddress(), source.fpu_reg());
     }
   } else if (source.IsDoubleStackSlot()) {
-    if (destination.IsXmmRegister()) {
-      __ movsd(destination.xmm_reg(), source.ToStackSlotAddress());
+    if (destination.IsFpuRegister()) {
+      __ movsd(destination.fpu_reg(), source.ToStackSlotAddress());
     } else {
       ASSERT(destination.IsDoubleStackSlot());
       __ movsd(XMM0, source.ToStackSlotAddress());
@@ -1443,15 +1631,15 @@
     Exchange(destination.reg(), source.ToStackSlotAddress());
   } else if (source.IsStackSlot() && destination.IsStackSlot()) {
     Exchange(destination.ToStackSlotAddress(), source.ToStackSlotAddress());
-  } else if (source.IsXmmRegister() && destination.IsXmmRegister()) {
-    __ movaps(XMM0, source.xmm_reg());
-    __ movaps(source.xmm_reg(), destination.xmm_reg());
-    __ movaps(destination.xmm_reg(), XMM0);
-  } else if (source.IsXmmRegister() || destination.IsXmmRegister()) {
+  } else if (source.IsFpuRegister() && destination.IsFpuRegister()) {
+    __ movaps(XMM0, source.fpu_reg());
+    __ movaps(source.fpu_reg(), destination.fpu_reg());
+    __ movaps(destination.fpu_reg(), XMM0);
+  } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
     ASSERT(destination.IsDoubleStackSlot() || source.IsDoubleStackSlot());
-    XmmRegister reg = source.IsXmmRegister() ? source.xmm_reg()
-                                             : destination.xmm_reg();
-    Address slot_address = source.IsXmmRegister()
+    XmmRegister reg = source.IsFpuRegister() ? source.fpu_reg()
+                                             : destination.fpu_reg();
+    Address slot_address = source.IsFpuRegister()
         ? destination.ToStackSlotAddress()
         : source.ToStackSlotAddress();
 
diff --git a/runtime/vm/flow_graph_compiler_x64.h b/runtime/vm/flow_graph_compiler_x64.h
deleted file mode 100644
index 4c9f690..0000000
--- a/runtime/vm/flow_graph_compiler_x64.h
+++ /dev/null
@@ -1,366 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef VM_FLOW_GRAPH_COMPILER_X64_H_
-#define VM_FLOW_GRAPH_COMPILER_X64_H_
-
-#ifndef VM_FLOW_GRAPH_COMPILER_H_
-#error Include flow_graph_compiler.h instead of flow_graph_compiler_x64.h.
-#endif
-
-namespace dart {
-
-class Code;
-class FlowGraph;
-template <typename T> class GrowableArray;
-class ParsedFunction;
-
-class FlowGraphCompiler : public ValueObject {
- private:
-  struct BlockInfo : public ZoneAllocated {
-   public:
-    BlockInfo() : label() { }
-    Label label;
-  };
-
- public:
-  FlowGraphCompiler(Assembler* assembler,
-                    const FlowGraph& flow_graph,
-                    bool is_optimizing);
-
-  ~FlowGraphCompiler();
-
-  static bool SupportsUnboxedMints();
-
-  // Accessors.
-  Assembler* assembler() const { return assembler_; }
-  const ParsedFunction& parsed_function() const { return parsed_function_; }
-  const GrowableArray<BlockEntryInstr*>& block_order() const {
-    return block_order_;
-  }
-  DescriptorList* pc_descriptors_list() const {
-    return pc_descriptors_list_;
-  }
-  BlockEntryInstr* current_block() const { return current_block_; }
-  void set_current_block(BlockEntryInstr* value) {
-    current_block_ = value;
-  }
-  static bool CanOptimize();
-  bool CanOptimizeFunction() const;
-  bool is_optimizing() const { return is_optimizing_; }
-
-  const GrowableArray<BlockInfo*>& block_info() const { return block_info_; }
-  ParallelMoveResolver* parallel_move_resolver() {
-    return &parallel_move_resolver_;
-  }
-
-  // Constructor is lighweight, major initialization work should occur here.
-  // This makes it easier to measure time spent in the compiler.
-  void InitCompiler();
-
-  void CompileGraph();
-
-  void VisitBlocks();
-
-  // Bail out of the flow graph compiler. Does not return to the caller.
-  void Bailout(const char* reason);
-
-  void LoadDoubleOrSmiToXmm(XmmRegister result,
-                            Register reg,
-                            Register temp,
-                            Label* not_double_or_smi);
-
-  // Returns 'true' if code generation for this function is complete, i.e.,
-  // no fall-through to regular code is needed.
-  bool TryIntrinsify();
-
-  void GenerateCallRuntime(intptr_t token_pos,
-                           const RuntimeEntry& entry,
-                           LocationSummary* locs);
-
-  void GenerateCall(intptr_t token_pos,
-                    const ExternalLabel* label,
-                    PcDescriptors::Kind kind,
-                    LocationSummary* locs);
-
-  void GenerateDartCall(intptr_t deopt_id,
-                        intptr_t token_pos,
-                        const ExternalLabel* label,
-                        PcDescriptors::Kind kind,
-                        LocationSummary* locs);
-
-  void GenerateAssertAssignable(intptr_t token_pos,
-                                const AbstractType& dst_type,
-                                const String& dst_name,
-                                LocationSummary* locs);
-
-  void GenerateInstanceOf(intptr_t token_pos,
-                          const AbstractType& type,
-                          bool negate_result,
-                          LocationSummary* locs);
-
-  void GenerateInstanceCall(intptr_t deopt_id,
-                            intptr_t token_pos,
-                            intptr_t argument_count,
-                            const Array& argument_names,
-                            LocationSummary* locs,
-                            const ICData& ic_data);
-
-  void GenerateStaticCall(intptr_t deopt_id,
-                          intptr_t token_pos,
-                          const Function& function,
-                          intptr_t argument_count,
-                          const Array& argument_names,
-                          LocationSummary* locs);
-
-  void GenerateNumberTypeCheck(Register kClassIdReg,
-                               const AbstractType& type,
-                               Label* is_instance_lbl,
-                               Label* is_not_instance_lbl);
-  void GenerateStringTypeCheck(Register kClassIdReg,
-                               Label* is_instance_lbl,
-                               Label* is_not_instance_lbl);
-  void GenerateListTypeCheck(Register kClassIdReg,
-                             Label* is_instance_lbl);
-
-  void EmitComment(Instruction* instr);
-
-  void EmitOptimizedInstanceCall(ExternalLabel* target_label,
-                                 const ICData& ic_data,
-                                 const Array& arguments_descriptor,
-                                 intptr_t argument_count,
-                                 intptr_t deopt_id,
-                                 intptr_t token_pos,
-                                 LocationSummary* locs);
-
-  void EmitInstanceCall(ExternalLabel* target_label,
-                        const ICData& ic_data,
-                        const Array& arguments_descriptor,
-                        intptr_t argument_count,
-                        intptr_t deopt_id,
-                        intptr_t token_pos,
-                        LocationSummary* locs);
-
-  void EmitMegamorphicInstanceCall(const ICData& ic_data,
-                                   const Array& arguments_descriptor,
-                                   intptr_t argument_count,
-                                   intptr_t deopt_id,
-                                   intptr_t token_pos,
-                                   LocationSummary* locs);
-
-  void EmitTestAndCall(const ICData& ic_data,
-                       Register class_id_reg,
-                       intptr_t arg_count,
-                       const Array& arg_names,
-                       Label* deopt,
-                       intptr_t deopt_id,
-                       intptr_t token_index,
-                       LocationSummary* locs);
-
-  void EmitDoubleCompareBranch(Condition true_condition,
-                               XmmRegister left,
-                               XmmRegister right,
-                               BranchInstr* branch);
-  void EmitDoubleCompareBool(Condition true_condition,
-                             XmmRegister left,
-                             XmmRegister right,
-                             Register result);
-
-  void EmitEqualityRegConstCompare(Register reg,
-                                   const Object& obj,
-                                   bool needs_number_check);
-  void EmitEqualityRegRegCompare(Register left,
-                                 Register right,
-                                 bool needs_number_check);
-  void EmitEqualityRegConstCompare(Register reg, const Object& obj);
-  // Implement equality: if any of the arguments is null do identity check.
-  // Fallthrough calls super equality.
-  void EmitSuperEqualityCallPrologue(Register result, Label* skip_call);
-
-  intptr_t StackSize() const;
-
-  // Returns assembler label associated with the given block entry.
-  Label* GetBlockLabel(BlockEntryInstr* block_entry) const;
-
-  // Returns true if there is a next block after the current one in
-  // the block order and if it is the given block.
-  bool IsNextBlock(BlockEntryInstr* block_entry) const;
-
-  void AddExceptionHandler(intptr_t try_index, intptr_t pc_offset);
-  void AddCurrentDescriptor(PcDescriptors::Kind kind,
-                            intptr_t deopt_id,
-                            intptr_t token_pos);
-
-  void RecordSafepoint(LocationSummary* locs);
-
-  Label* AddDeoptStub(intptr_t deopt_id, DeoptReasonId reason);
-
-  void AddDeoptIndexAtCall(intptr_t deopt_id, intptr_t token_pos);
-
-  void AddSlowPathCode(SlowPathCode* slow_path);
-
-  void FinalizeExceptionHandlers(const Code& code);
-  void FinalizePcDescriptors(const Code& code);
-  void FinalizeDeoptInfo(const Code& code);
-  void FinalizeStackmaps(const Code& code);
-  void FinalizeVarDescriptors(const Code& code);
-  void FinalizeComments(const Code& code);
-  void FinalizeStaticCallTargetsTable(const Code& code);
-
-  const Class& double_class() const { return double_class_; }
-
-  // Returns true if the compiled function has a finally clause.
-  bool HasFinally() const;
-
-  static const int kLocalsOffsetFromFP = (-1 * kWordSize);
-
-  void SaveLiveRegisters(LocationSummary* locs);
-  void RestoreLiveRegisters(LocationSummary* locs);
-
-  intptr_t CurrentTryIndex() const {
-    if (current_block_ == NULL) {
-      return CatchClauseNode::kInvalidTryIndex;
-    }
-    return current_block_->try_index();
-  }
-
-  bool may_reoptimize() const { return may_reoptimize_; }
-
-  static Condition FlipCondition(Condition condition);
-
-  static bool EvaluateCondition(Condition condition, intptr_t l, intptr_t r);
-
-  // Array/list element address computations.
-  static intptr_t DataOffsetFor(intptr_t cid);
-  static intptr_t ElementSizeFor(intptr_t cid);
-  static FieldAddress ElementAddressForIntIndex(intptr_t cid,
-                                                Register array,
-                                                intptr_t offset);
-  static FieldAddress ElementAddressForRegIndex(intptr_t cid,
-                                                Register array,
-                                                Register index);
-
- private:
-  void EmitFrameEntry();
-
-  void AddStaticCallTarget(const Function& function);
-
-  void GenerateDeferredCode();
-
-  void EmitInstructionPrologue(Instruction* instr);
-  void EmitInstructionEpilogue(Instruction* instr);
-
-  // Emit code to load a Value into register 'dst'.
-  void LoadValue(Register dst, Value* value);
-
-  void EmitStaticCall(const Function& function,
-                      const Array& arguments_descriptor,
-                      intptr_t argument_count,
-                      intptr_t deopt_id,
-                      intptr_t token_pos,
-                      LocationSummary* locs);
-
-  // Type checking helper methods.
-  void CheckClassIds(Register class_id_reg,
-                     const GrowableArray<intptr_t>& class_ids,
-                     Label* is_instance_lbl,
-                     Label* is_not_instance_lbl);
-
-  RawSubtypeTestCache* GenerateInlineInstanceof(intptr_t token_pos,
-                                                const AbstractType& type,
-                                                Label* is_instance_lbl,
-                                                Label* is_not_instance_lbl);
-
-  RawSubtypeTestCache* GenerateInstantiatedTypeWithArgumentsTest(
-      intptr_t token_pos,
-      const AbstractType& dst_type,
-      Label* is_instance_lbl,
-      Label* is_not_instance_lbl);
-
-  bool GenerateInstantiatedTypeNoArgumentsTest(intptr_t token_pos,
-                                               const AbstractType& dst_type,
-                                               Label* is_instance_lbl,
-                                               Label* is_not_instance_lbl);
-
-  RawSubtypeTestCache* GenerateUninstantiatedTypeTest(
-      intptr_t token_pos,
-      const AbstractType& dst_type,
-      Label* is_instance_lbl,
-      Label* is_not_instance_label);
-
-  RawSubtypeTestCache* GenerateSubtype1TestCacheLookup(
-      intptr_t token_pos,
-      const Class& type_class,
-      Label* is_instance_lbl,
-      Label* is_not_instance_lbl);
-
-  enum TypeTestStubKind {
-    kTestTypeOneArg,
-    kTestTypeTwoArgs,
-    kTestTypeThreeArgs,
-  };
-
-  RawSubtypeTestCache* GenerateCallSubtypeTestStub(TypeTestStubKind test_kind,
-                                                   Register instance_reg,
-                                                   Register type_arguments_reg,
-                                                   Register temp_reg,
-                                                   Label* is_instance_lbl,
-                                                   Label* is_not_instance_lbl);
-
-  // Returns true if checking against this type is a direct class id comparison.
-  bool TypeCheckAsClassEquality(const AbstractType& type);
-
-  void GenerateBoolToJump(Register bool_reg, Label* is_true, Label* is_false);
-
-  void CopyParameters();
-
-  void GenerateInlinedGetter(intptr_t offset);
-  void GenerateInlinedSetter(intptr_t offset);
-
-  // Map a block number in a forward iteration into the block number in the
-  // corresponding reverse iteration.  Used to obtain an index into
-  // block_order for reverse iterations.
-  intptr_t reverse_index(intptr_t index) const {
-    return block_order_.length() - index - 1;
-  }
-
-  // Perform a greedy local register allocation.  Consider all registers free.
-  void AllocateRegistersLocally(Instruction* instr);
-
-  class Assembler* assembler_;
-  const ParsedFunction& parsed_function_;
-  const GrowableArray<BlockEntryInstr*>& block_order_;
-
-  // Compiler specific per-block state.  Indexed by postorder block number
-  // for convenience.  This is not the block's index in the block order,
-  // which is reverse postorder.
-  BlockEntryInstr* current_block_;
-  ExceptionHandlerList* exception_handlers_list_;
-  DescriptorList* pc_descriptors_list_;
-  StackmapTableBuilder* stackmap_table_builder_;
-  GrowableArray<BlockInfo*> block_info_;
-  GrowableArray<CompilerDeoptInfo*> deopt_infos_;
-  GrowableArray<SlowPathCode*> slow_path_code_;
-  // Stores: [code offset, function, null(code)].
-  const GrowableObjectArray& static_calls_target_table_;
-  const bool is_optimizing_;
-  // Set to true if optimized code has IC calls.
-  bool may_reoptimize_;
-
-  const Class& double_class_;
-
-  ParallelMoveResolver parallel_move_resolver_;
-
-  // Currently instructions generate deopt stubs internally by
-  // calling AddDeoptStub.  To communicate deoptimization environment
-  // that should be used when deoptimizing we store it in this variable.
-  // In future AddDeoptStub should be moved out of the instruction template.
-  Environment* pending_deoptimization_env_;
-
-  DISALLOW_COPY_AND_ASSIGN(FlowGraphCompiler);
-};
-
-}  // namespace dart
-
-#endif  // VM_FLOW_GRAPH_COMPILER_X64_H_
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index c8b8b72..3a71164 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -134,7 +134,7 @@
 
 
 // Pair of an argument name and its value.
-struct NamedArgument : ValueObject {
+struct NamedArgument {
  public:
   String* name;
   Value* value;
@@ -792,7 +792,7 @@
     GrowableArray<NamedArgument> named_args(argument_names_count);
     for (intptr_t i = 0; i < argument_names.Length(); ++i) {
       String& arg_name = String::Handle(Isolate::Current());
-      arg_name ^= argument_names.At(i);
+      arg_name |= argument_names.At(i);
       named_args.Add(
           NamedArgument(&arg_name, (*arguments)[i + fixed_param_count]));
     }
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 7096933..ad4f034 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -56,6 +56,9 @@
             VisitInstanceCall(call);
           }
         }
+      } else if (it.Current()->IsPolymorphicInstanceCall()) {
+        SpecializePolymorphicInstanceCall(
+            it.Current()->AsPolymorphicInstanceCall());
       } else if (it.Current()->IsStrictCompare()) {
         VisitStrictCompare(it.Current()->AsStrictCompare());
       } else if (it.Current()->IsBranch()) {
@@ -117,6 +120,52 @@
 }
 
 
+static const ICData& SpecializeICData(const ICData& ic_data, intptr_t cid) {
+  ASSERT(ic_data.num_args_tested() == 1);
+
+  if ((ic_data.NumberOfChecks() == 1) &&
+      (ic_data.GetReceiverClassIdAt(0) == cid)) {
+    return ic_data;  // Nothing to do
+  }
+
+  const ICData& new_ic_data = ICData::ZoneHandle(ICData::New(
+      Function::Handle(ic_data.function()),
+      String::Handle(ic_data.target_name()),
+      ic_data.deopt_id(),
+      ic_data.num_args_tested()));
+
+  const Function& function =
+      Function::Handle(ic_data.GetTargetForReceiverClassId(cid));
+  if (!function.IsNull()) {
+    new_ic_data.AddReceiverCheck(cid, function);
+  }
+
+  return new_ic_data;
+}
+
+
+void FlowGraphOptimizer::SpecializePolymorphicInstanceCall(
+    PolymorphicInstanceCallInstr* call) {
+  if (!call->with_checks()) {
+    return;  // Already specialized.
+  }
+
+  const intptr_t receiver_cid  = call->ArgumentAt(0)->value()->ResultCid();
+  if (receiver_cid == kDynamicCid) {
+    return;  // No information about receiver was infered.
+  }
+
+  const ICData& ic_data = SpecializeICData(call->ic_data(), receiver_cid);
+
+  const bool with_checks = false;
+  PolymorphicInstanceCallInstr* specialized =
+      new PolymorphicInstanceCallInstr(call->instance_call(),
+                                       ic_data,
+                                       with_checks);
+  call->ReplaceWith(specialized, current_iterator());
+}
+
+
 static void EnsureSSATempIndex(FlowGraph* graph,
                                Definition* defn,
                                Definition* replacement) {
@@ -298,19 +347,6 @@
 }
 
 
-static bool ICDataHasReceiverClassId(const ICData& ic_data, intptr_t class_id) {
-  ASSERT(ic_data.num_args_tested() > 0);
-  const intptr_t len = ic_data.NumberOfChecks();
-  for (intptr_t i = 0; i < len; i++) {
-    const intptr_t test_class_id = ic_data.GetReceiverClassIdAt(i);
-    if (test_class_id == class_id) {
-      return true;
-    }
-  }
-  return false;
-}
-
-
 static bool ICDataHasReceiverArgumentClassIds(const ICData& ic_data,
                                               intptr_t receiver_class_id,
                                               intptr_t argument_class_id) {
@@ -368,18 +404,18 @@
 
 static bool HasOnlyOneSmi(const ICData& ic_data) {
   return (ic_data.NumberOfChecks() == 1)
-      && ICDataHasReceiverClassId(ic_data, kSmiCid);
+      && ic_data.HasReceiverClassId(kSmiCid);
 }
 
 
 static bool HasOnlySmiOrMint(const ICData& ic_data) {
   if (ic_data.NumberOfChecks() == 1) {
-    return ICDataHasReceiverClassId(ic_data, kSmiCid)
-        || ICDataHasReceiverClassId(ic_data, kMintCid);
+    return ic_data.HasReceiverClassId(kSmiCid)
+        || ic_data.HasReceiverClassId(kMintCid);
   }
   return (ic_data.NumberOfChecks() == 2)
-      && ICDataHasReceiverClassId(ic_data, kSmiCid)
-      && ICDataHasReceiverClassId(ic_data, kMintCid);
+      && ic_data.HasReceiverClassId(kSmiCid)
+      && ic_data.HasReceiverClassId(kMintCid);
 }
 
 
@@ -401,7 +437,7 @@
 
 static bool HasOnlyOneDouble(const ICData& ic_data) {
   return (ic_data.NumberOfChecks() == 1)
-      && ICDataHasReceiverClassId(ic_data, kDoubleCid);
+      && ic_data.HasReceiverClassId(kDoubleCid);
 }
 
 
@@ -549,7 +585,11 @@
         value_check = call->ic_data()->AsUnaryClassChecksForArgNr(2);
       }
       break;
+    case kInt8ArrayCid:
     case kUint8ArrayCid:
+    case kUint8ClampedArrayCid:
+    case kInt16ArrayCid:
+    case kUint16ArrayCid:
       // Check that value is always smi.
       value_check = call->ic_data()->AsUnaryClassChecksForArgNr(2);
       if ((value_check.NumberOfChecks() != 1) ||
@@ -600,14 +640,17 @@
         type_args = new Value(load_type_args);
         break;
       }
+      case kInt8ArrayCid:
       case kUint8ArrayCid:
+      case kUint8ClampedArrayCid:
+      case kInt16ArrayCid:
+      case kUint16ArrayCid:
+        ASSERT(value_type.IsIntType());
+        // Fall through.
       case kFloat32ArrayCid:
       case kFloat64ArrayCid: {
-        ConstantInstr* null_constant = new ConstantInstr(Object::ZoneHandle());
-        InsertBefore(call, null_constant, NULL, Definition::kValue);
-        instantiator = new Value(null_constant);
-        type_args = new Value(null_constant);
-        ASSERT((class_id != kUint8ArrayCid) || value_type.IsIntType());
+        instantiator = new Value(flow_graph_->constant_null());
+        type_args = new Value(flow_graph_->constant_null());
         ASSERT((class_id != kFloat32ArrayCid && class_id != kFloat64ArrayCid) ||
                value_type.IsDoubleType());
         ASSERT(value_type.IsInstantiated());
@@ -671,9 +714,12 @@
     case kGrowableObjectArrayCid:
     case kFloat32ArrayCid:
     case kFloat64ArrayCid:
+    case kInt8ArrayCid:
     case kUint8ArrayCid:
     case kUint8ClampedArrayCid:
     case kExternalUint8ArrayCid:
+    case kInt16ArrayCid:
+    case kUint16ArrayCid:
       // Acceptable load index classes.
       break;
     default:
@@ -964,6 +1010,23 @@
 }
 
 
+bool FlowGraphOptimizer::MethodExtractorNeedsClassCheck(
+    InstanceCallInstr* call) const {
+  if (!FLAG_use_cha) return true;
+  Definition* callee_receiver = call->ArgumentAt(0)->value()->definition();
+  ASSERT(callee_receiver != NULL);
+  const Function& function = flow_graph_->parsed_function().function();
+  if (function.IsDynamicFunction() &&
+      callee_receiver->IsParameter() &&
+      (callee_receiver->AsParameter()->index() == 0)) {
+    const String& field_name =
+      String::Handle(Field::NameFromGetter(call->function_name()));
+    return CHA::HasOverride(Class::Handle(function.Owner()), field_name);
+  }
+  return true;
+}
+
+
 void FlowGraphOptimizer::InlineImplicitInstanceGetter(InstanceCallInstr* call) {
   ASSERT(call->HasICData());
   const ICData& ic_data = *call->ic_data();
@@ -1111,6 +1174,8 @@
     }
     InlineImplicitInstanceGetter(call);
     return true;
+  } else if (target.kind() == RawFunction::kMethodExtractor) {
+    return false;
   }
 
   // Not an implicit getter.
@@ -1159,7 +1224,7 @@
 }
 
 
-StringCharCodeAtInstr* FlowGraphOptimizer::BuildStringCharCodeAt(
+LoadIndexedInstr* FlowGraphOptimizer::BuildStringCharCodeAt(
     InstanceCallInstr* call,
     intptr_t cid) {
   Value* str = call->ArgumentAt(0)->value();
@@ -1192,7 +1257,7 @@
                  call->env(),
                  Definition::kEffect);
   }
-  return new StringCharCodeAtInstr(str, index, cid);
+  return new LoadIndexedInstr(str, index, cid);
 }
 
 
@@ -1213,7 +1278,7 @@
       (ic_data.NumberOfChecks() == 1) &&
       ((class_ids[0] == kOneByteStringCid) ||
        (class_ids[0] == kTwoByteStringCid))) {
-    StringCharCodeAtInstr* instr = BuildStringCharCodeAt(call, class_ids[0]);
+    LoadIndexedInstr* instr = BuildStringCharCodeAt(call, class_ids[0]);
     call->ReplaceWith(instr, current_iterator());
     RemovePushArguments(call);
     return true;
@@ -1222,7 +1287,7 @@
       (ic_data.NumberOfChecks() == 1) &&
       (class_ids[0] == kOneByteStringCid)) {
     // TODO(fschneider): Handle TwoByteString.
-    StringCharCodeAtInstr* load_char_code =
+    LoadIndexedInstr* load_char_code =
         BuildStringCharCodeAt(call, class_ids[0]);
     InsertBefore(call, load_char_code, NULL, Definition::kValue);
     StringFromCharCodeInstr* char_at =
@@ -1261,8 +1326,10 @@
       return true;
     }
     if ((recognized_kind == MethodRecognizer::kDoubleTruncate) ||
-        (recognized_kind == MethodRecognizer::kDoubleRound)) {
-      if (!CPUFeatures::sse4_1_supported()) {
+        (recognized_kind == MethodRecognizer::kDoubleRound) ||
+        (recognized_kind == MethodRecognizer::kDoubleFloor) ||
+        (recognized_kind == MethodRecognizer::kDoubleCeil)) {
+      if (!CPUFeatures::double_truncate_round_supported()) {
         return false;
       }
       AddCheckClass(call, call->ArgumentAt(0)->value()->Copy());
@@ -1363,6 +1430,7 @@
 
   const ICData& unary_checks =
       ICData::ZoneHandle(instr->ic_data()->AsUnaryClassChecks());
+
   if ((unary_checks.NumberOfChecks() > FLAG_max_polymorphic_checks) &&
       InstanceCallNeedsClassCheck(instr)) {
     // Too many checks, it will be megamorphic which needs unary checks.
@@ -1395,17 +1463,27 @@
   if (TryInlineInstanceMethod(instr)) {
     return;
   }
-  if (!InstanceCallNeedsClassCheck(instr)) {
-    const bool call_with_checks = false;
-    PolymorphicInstanceCallInstr* call =
-        new PolymorphicInstanceCallInstr(instr, unary_checks,
-                                         call_with_checks);
-    instr->ReplaceWith(call, current_iterator());
-    return;
+
+  const bool has_one_target = unary_checks.HasOneTarget();
+
+  if (has_one_target) {
+    const bool is_method_extraction =
+        Function::Handle(unary_checks.GetTargetAt(0)).IsMethodExtractor();
+
+    if ((is_method_extraction && !MethodExtractorNeedsClassCheck(instr)) ||
+        (!is_method_extraction && !InstanceCallNeedsClassCheck(instr))) {
+      const bool call_with_checks = false;
+      PolymorphicInstanceCallInstr* call =
+          new PolymorphicInstanceCallInstr(instr, unary_checks,
+                                           call_with_checks);
+      instr->ReplaceWith(call, current_iterator());
+      return;
+    }
   }
+
   if (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
     bool call_with_checks;
-    if (unary_checks.HasOneTarget()) {
+    if (has_one_target) {
       // Type propagation has not run yet, we cannot eliminate the check.
       AddCheckClass(instr, instr->ArgumentAt(0)->value()->Copy());
       // Call can still deoptimize, do not detach environment from instr.
@@ -1957,6 +2035,17 @@
     ArrayLengthData(Definition* array, Definition* array_length)
         : array_(array), array_length_(array_length) { }
 
+    ArrayLengthData(const ArrayLengthData& other)
+        : ValueObject(),
+          array_(other.array_),
+          array_length_(other.array_length_) { }
+
+    ArrayLengthData& operator=(const ArrayLengthData& other) {
+      array_ = other.array_;
+      array_length_ = other.array_length_;
+      return *this;
+    }
+
     Definition* array() const { return array_; }
     Definition* array_length() const { return array_length_; }
 
@@ -3178,13 +3267,21 @@
             // will ever be used.
             gen->RemoveAll(kill_by_offset_[offset_in_words]);
 
-            Definition* load = map_->Lookup(instr->AsDefinition());
-            if (load != NULL) {
-              // Store has a corresponding numbered load. Try forwarding
-              // stored value to it.
-              gen->Add(load->expr_id());
-              if (out_values == NULL) out_values = CreateBlockOutValues();
-              (*out_values)[load->expr_id()] = GetStoredValue(instr);
+            // Only forward stores to normal arrays and float64 arrays
+            // to loads because other array stores (intXX/uintXX/float32)
+            // may implicitly convert the value stored.
+            StoreIndexedInstr* array_store = instr->AsStoreIndexed();
+            if (array_store == NULL ||
+                array_store->class_id() == kArrayCid ||
+                array_store->class_id() == kFloat64ArrayCid) {
+              Definition* load = map_->Lookup(instr->AsDefinition());
+              if (load != NULL) {
+                // Store has a corresponding numbered load. Try forwarding
+                // stored value to it.
+                gen->Add(load->expr_id());
+                if (out_values == NULL) out_values = CreateBlockOutValues();
+                (*out_values)[load->expr_id()] = GetStoredValue(instr);
+              }
             }
           }
           ASSERT(instr->IsDefinition() &&
@@ -3967,11 +4064,6 @@
 }
 
 
-void ConstantPropagator::VisitStringCharCodeAt(StringCharCodeAtInstr* instr) {
-  SetValue(instr, non_constant_);
-}
-
-
 void ConstantPropagator::VisitStringFromCharCode(
     StringFromCharCodeInstr* instr) {
   SetValue(instr, non_constant_);
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index 838185c..45285cc 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -53,6 +53,8 @@
   // Attempt to build ICData for call using propagated class-ids.
   bool TryCreateICData(InstanceCallInstr* call);
 
+  void SpecializePolymorphicInstanceCall(PolymorphicInstanceCallInstr* call);
+
   intptr_t PrepareIndexedOp(InstanceCallInstr* call,
                             intptr_t class_id,
                             Value** array,
@@ -70,8 +72,8 @@
   bool TryInlineInstanceMethod(InstanceCallInstr* call);
   void ReplaceWithInstanceOf(InstanceCallInstr* instr);
 
-  StringCharCodeAtInstr* BuildStringCharCodeAt(InstanceCallInstr* call,
-                                               intptr_t cid);
+  LoadIndexedInstr* BuildStringCharCodeAt(InstanceCallInstr* call,
+                                          intptr_t cid);
 
   void AddCheckClass(InstanceCallInstr* call, Value* value);
 
@@ -90,6 +92,7 @@
                         Instruction* deopt_target);
 
   bool InstanceCallNeedsClassCheck(InstanceCallInstr* call) const;
+  bool MethodExtractorNeedsClassCheck(InstanceCallInstr* call) const;
 
   void InlineImplicitInstanceGetter(InstanceCallInstr* call);
   void InlineArrayLengthGetter(InstanceCallInstr* call,
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 07696d0..41d3091 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -277,8 +277,18 @@
 void Heap::PrintSizes() const {
   OS::PrintErr("New space (%"Pd"k of %"Pd"k) "
                "Old space (%"Pd"k of %"Pd"k)\n",
-               (new_space_->in_use() / KB), (new_space_->capacity() / KB),
-               (old_space_->in_use() / KB), (old_space_->capacity() / KB));
+               (Used(kNew) / KB), (Capacity(kNew) / KB),
+               (Used(kOld) / KB), (Capacity(kOld) / KB));
+}
+
+
+intptr_t Heap::Used(Space space) const {
+  return space == kNew ? new_space_->in_use() : old_space_->in_use();
+}
+
+
+intptr_t Heap::Capacity(Space space) const {
+  return space == kNew ? new_space_->capacity() : old_space_->capacity();
 }
 
 
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 00c21a8..3090efa 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -155,6 +155,10 @@
   // Print heap sizes.
   void PrintSizes() const;
 
+  // Return amount of memory used and capacity in a space.
+  intptr_t Used(Space space) const;
+  intptr_t Capacity(Space space) const;
+
   // Returns the [lowest, highest) addresses in the heap.
   void StartEndAddress(uword* start, uword* end) const;
 
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 4a6fe3b..37566d9 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -128,6 +128,7 @@
     if (count > 0) {
       f->Print(" #%"Pd, count);
     }
+    f->Print(" <%p>", static_cast<void*>(target.raw()));
   }
   f->Print("]");
 }
@@ -323,7 +324,12 @@
 
 
 void PolymorphicInstanceCallInstr::PrintOperandsTo(BufferFormatter* f) const {
-  instance_call()->PrintOperandsTo(f);
+  f->Print("%s", instance_call()->function_name().ToCString());
+  for (intptr_t i = 0; i < ArgumentCount(); ++i) {
+    f->Print(", ");
+    ArgumentAt(i)->value()->PrintTo(f);
+  }
+  PrintICData(f, ic_data());
 }
 
 
@@ -372,7 +378,9 @@
 
 
 void StoreInstanceFieldInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", String::Handle(field().name()).ToCString());
+  f->Print("%s {%"Pd"}, ",
+           String::Handle(field().name()).ToCString(),
+           field().Offset());
   instance()->PrintTo(f);
   f->Print(", ");
   value()->PrintTo(f);
diff --git a/runtime/vm/instructions.h b/runtime/vm/instructions.h
index e665b64..97fe299 100644
--- a/runtime/vm/instructions.h
+++ b/runtime/vm/instructions.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -12,7 +12,9 @@
 #elif defined(TARGET_ARCH_X64)
 #include "vm/instructions_x64.h"
 #elif defined(TARGET_ARCH_ARM)
-// No instruction patterns implemented.
+#include "vm/instructions_arm.h"
+#elif defined(TARGET_ARCH_MIPS)
+#include "vm/instructions_mips.h"
 #else
 #error Unknown architecture.
 #endif
diff --git a/runtime/vm/instructions_arm.cc b/runtime/vm/instructions_arm.cc
new file mode 100644
index 0000000..1ba1dcc
--- /dev/null
+++ b/runtime/vm/instructions_arm.cc
@@ -0,0 +1,44 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"  // Needed here to get TARGET_ARCH_ARM.
+#if defined(TARGET_ARCH_ARM)
+
+#include "vm/instructions.h"
+#include "vm/object.h"
+
+namespace dart {
+
+bool InstructionPattern::TestBytesWith(const int* data, int num_bytes) const {
+  UNIMPLEMENTED();
+  return false;
+}
+
+
+uword CallOrJumpPattern::TargetAddress() const {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+void CallOrJumpPattern::SetTargetAddress(uword target) const {
+  UNIMPLEMENTED();
+}
+
+
+const int* CallPattern::pattern() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+const int* JumpPattern::pattern() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_ARM
+
diff --git a/runtime/vm/instructions_arm.h b/runtime/vm/instructions_arm.h
new file mode 100644
index 0000000..c3ea8ea
--- /dev/null
+++ b/runtime/vm/instructions_arm.h
@@ -0,0 +1,99 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Classes that describe assembly patterns as used by inline caches.
+
+#ifndef VM_INSTRUCTIONS_ARM_H_
+#define VM_INSTRUCTIONS_ARM_H_
+
+#ifndef VM_INSTRUCTIONS_H_
+#error Do not include instructions_arm.h directly; use instructions.h instead.
+#endif
+
+#include "vm/allocation.h"
+
+namespace dart {
+
+// Forward declarations.
+class RawClass;
+class Immediate;
+class RawObject;
+
+// Abstract class for all instruction pattern classes.
+class InstructionPattern : public ValueObject {
+ public:
+  explicit InstructionPattern(uword pc) : start_(pc) {
+    ASSERT(pc != 0);
+  }
+  virtual ~InstructionPattern() {}
+
+  // Call to check if the instruction pattern at 'pc' match the instruction.
+  virtual bool IsValid() const {
+    return TestBytesWith(pattern(), pattern_length_in_bytes());
+  }
+
+  // 'pattern' returns the expected byte pattern in form of an integer array
+  // with length of 'pattern_length_in_bytes'. A '-1' element means 'any byte'.
+  virtual const int* pattern() const = 0;
+  virtual int pattern_length_in_bytes() const = 0;
+
+ protected:
+  uword start() const { return start_; }
+
+ private:
+  // Returns true if the 'num_bytes' bytes at 'start_' correspond to
+  // array of integers 'data'. 'data' elements are either a byte or -1, which
+  // represents any byte.
+  bool TestBytesWith(const int* data, int num_bytes) const;
+
+  const uword start_;
+
+  DISALLOW_COPY_AND_ASSIGN(InstructionPattern);
+};
+
+
+class CallOrJumpPattern : public InstructionPattern {
+ public:
+  virtual int pattern_length_in_bytes() const {
+    return kLengthInBytes;
+  }
+  uword TargetAddress() const;
+  void SetTargetAddress(uword new_target) const;
+
+ protected:
+  explicit CallOrJumpPattern(uword pc) : InstructionPattern(pc) {}
+  static const int kLengthInBytes = 0;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CallOrJumpPattern);
+};
+
+
+class CallPattern : public CallOrJumpPattern {
+ public:
+  explicit CallPattern(uword pc) : CallOrJumpPattern(pc) {}
+  static int InstructionLength() {
+    return kLengthInBytes;
+  }
+
+ private:
+  virtual const int* pattern() const;
+
+  DISALLOW_COPY_AND_ASSIGN(CallPattern);
+};
+
+
+class JumpPattern : public CallOrJumpPattern {
+ public:
+  explicit JumpPattern(uword pc) : CallOrJumpPattern(pc) {}
+
+ private:
+  virtual const int* pattern() const;
+
+  DISALLOW_COPY_AND_ASSIGN(JumpPattern);
+};
+
+}  // namespace dart
+
+#endif  // VM_INSTRUCTIONS_ARM_H_
+
diff --git a/runtime/vm/instructions_mips.cc b/runtime/vm/instructions_mips.cc
new file mode 100644
index 0000000..5e115a0
--- /dev/null
+++ b/runtime/vm/instructions_mips.cc
@@ -0,0 +1,44 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"  // Needed here to get TARGET_ARCH_MIPS.
+#if defined(TARGET_ARCH_MIPS)
+
+#include "vm/instructions.h"
+#include "vm/object.h"
+
+namespace dart {
+
+bool InstructionPattern::TestBytesWith(const int* data, int num_bytes) const {
+  UNIMPLEMENTED();
+  return false;
+}
+
+
+uword CallOrJumpPattern::TargetAddress() const {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+void CallOrJumpPattern::SetTargetAddress(uword target) const {
+  UNIMPLEMENTED();
+}
+
+
+const int* CallPattern::pattern() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+const int* JumpPattern::pattern() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_MIPS
+
diff --git a/runtime/vm/instructions_mips.h b/runtime/vm/instructions_mips.h
new file mode 100644
index 0000000..6da4eb0
--- /dev/null
+++ b/runtime/vm/instructions_mips.h
@@ -0,0 +1,99 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Classes that describe assembly patterns as used by inline caches.
+
+#ifndef VM_INSTRUCTIONS_MIPS_H_
+#define VM_INSTRUCTIONS_MIPS_H_
+
+#ifndef VM_INSTRUCTIONS_H_
+#error Do not include instructions_mips.h directly; use instructions.h instead.
+#endif
+
+#include "vm/allocation.h"
+
+namespace dart {
+
+// Forward declarations.
+class RawClass;
+class Immediate;
+class RawObject;
+
+// Abstract class for all instruction pattern classes.
+class InstructionPattern : public ValueObject {
+ public:
+  explicit InstructionPattern(uword pc) : start_(pc) {
+    ASSERT(pc != 0);
+  }
+  virtual ~InstructionPattern() {}
+
+  // Call to check if the instruction pattern at 'pc' match the instruction.
+  virtual bool IsValid() const {
+    return TestBytesWith(pattern(), pattern_length_in_bytes());
+  }
+
+  // 'pattern' returns the expected byte pattern in form of an integer array
+  // with length of 'pattern_length_in_bytes'. A '-1' element means 'any byte'.
+  virtual const int* pattern() const = 0;
+  virtual int pattern_length_in_bytes() const = 0;
+
+ protected:
+  uword start() const { return start_; }
+
+ private:
+  // Returns true if the 'num_bytes' bytes at 'start_' correspond to
+  // array of integers 'data'. 'data' elements are either a byte or -1, which
+  // represents any byte.
+  bool TestBytesWith(const int* data, int num_bytes) const;
+
+  const uword start_;
+
+  DISALLOW_COPY_AND_ASSIGN(InstructionPattern);
+};
+
+
+class CallOrJumpPattern : public InstructionPattern {
+ public:
+  virtual int pattern_length_in_bytes() const {
+    return kLengthInBytes;
+  }
+  uword TargetAddress() const;
+  void SetTargetAddress(uword new_target) const;
+
+ protected:
+  explicit CallOrJumpPattern(uword pc) : InstructionPattern(pc) {}
+  static const int kLengthInBytes = 0;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CallOrJumpPattern);
+};
+
+
+class CallPattern : public CallOrJumpPattern {
+ public:
+  explicit CallPattern(uword pc) : CallOrJumpPattern(pc) {}
+  static int InstructionLength() {
+    return kLengthInBytes;
+  }
+
+ private:
+  virtual const int* pattern() const;
+
+  DISALLOW_COPY_AND_ASSIGN(CallPattern);
+};
+
+
+class JumpPattern : public CallOrJumpPattern {
+ public:
+  explicit JumpPattern(uword pc) : CallOrJumpPattern(pc) {}
+
+ private:
+  virtual const int* pattern() const;
+
+  DISALLOW_COPY_AND_ASSIGN(JumpPattern);
+};
+
+}  // namespace dart
+
+#endif  // VM_INSTRUCTIONS_MIPS_H_
+
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 93b89ff..d5cfa0a 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -103,6 +103,14 @@
 }
 
 
+bool CheckClassInstr::AffectedBySideEffect() const {
+  // The class-id of string objects is not invariant: Externalization of strings
+  // via the API can change the class-id.
+  return unary_checks().HasReceiverClassId(kOneByteStringCid)
+      || unary_checks().HasReceiverClassId(kTwoByteStringCid);
+}
+
+
 bool CheckArrayBoundInstr::AttributesEqual(Instruction* other) const {
   CheckArrayBoundInstr* other_check = other->AsCheckArrayBound();
   ASSERT(other_check != NULL);
@@ -156,13 +164,6 @@
 }
 
 
-bool StringCharCodeAtInstr::AttributesEqual(Instruction* other) const {
-  StringCharCodeAtInstr* other_load = other->AsStringCharCodeAt();
-  ASSERT(other_load != NULL);
-  return class_id() == other_load->class_id();
-}
-
-
 bool LoadIndexedInstr::AttributesEqual(Instruction* other) const {
   LoadIndexedInstr* other_load = other->AsLoadIndexed();
   ASSERT(other_load != NULL);
@@ -1108,16 +1109,6 @@
 }
 
 
-RawAbstractType* StringCharCodeAtInstr::CompileType() const {
-  return Type::IntType();
-}
-
-
-intptr_t StringCharCodeAtInstr::ResultCid() const {
-  return kSmiCid;
-}
-
-
 RawAbstractType* StringFromCharCodeInstr::CompileType() const {
   return Type::StringType();
 }
@@ -1131,9 +1122,14 @@
     case kFloat32ArrayCid :
     case kFloat64ArrayCid :
       return Type::Double();
+    case kInt8ArrayCid:
     case kUint8ArrayCid:
     case kUint8ClampedArrayCid:
     case kExternalUint8ArrayCid:
+    case kInt16ArrayCid:
+    case kUint16ArrayCid:
+    case kOneByteStringCid:
+    case kTwoByteStringCid:
       return Type::IntType();
     default:
       UNIMPLEMENTED();
@@ -1150,9 +1146,14 @@
     case kFloat32ArrayCid :
     case kFloat64ArrayCid :
       return kDoubleCid;
+    case kInt8ArrayCid:
     case kUint8ArrayCid:
     case kUint8ClampedArrayCid:
     case kExternalUint8ArrayCid:
+    case kInt16ArrayCid:
+    case kUint16ArrayCid:
+    case kOneByteStringCid:
+    case kTwoByteStringCid:
       return kSmiCid;
     default:
       UNIMPLEMENTED();
@@ -1165,9 +1166,14 @@
   switch (class_id_) {
     case kArrayCid:
     case kImmutableArrayCid:
+    case kInt8ArrayCid:
     case kUint8ArrayCid:
     case kUint8ClampedArrayCid:
     case kExternalUint8ArrayCid:
+    case kInt16ArrayCid:
+    case kUint16ArrayCid:
+    case kOneByteStringCid:
+    case kTwoByteStringCid:
       return kTagged;
     case kFloat32ArrayCid :
     case kFloat64ArrayCid :
@@ -1190,7 +1196,11 @@
   ASSERT(idx == 2);
   switch (class_id_) {
     case kArrayCid:
+    case kInt8ArrayCid:
     case kUint8ArrayCid:
+    case kUint8ClampedArrayCid:
+    case kInt16ArrayCid:
+    case kUint16ArrayCid:
       return kTagged;
     case kFloat32ArrayCid :
     case kFloat64ArrayCid :
@@ -1748,12 +1758,19 @@
 
 Instruction* CheckClassInstr::Canonicalize(FlowGraphOptimizer* optimizer) {
   const intptr_t value_cid = value()->ResultCid();
-  const intptr_t num_checks = unary_checks().NumberOfChecks();
-  if ((num_checks == 1) &&
-      (value_cid == unary_checks().GetReceiverClassIdAt(0))) {
-    // No checks needed.
-    return NULL;
+  if (value_cid == kDynamicCid) {
+    return this;
   }
+
+  const intptr_t num_checks = unary_checks().NumberOfChecks();
+
+  for (intptr_t i = 0; i < num_checks; i++) {
+    if (value_cid == unary_checks().GetReceiverClassIdAt(i)) {
+      // No checks needed.
+      return NULL;
+    }
+  }
+
   return this;
 }
 
@@ -1797,7 +1814,9 @@
   __ Bind(compiler->GetBlockLabel(this));
   if (IsCatchEntry()) {
     compiler->AddExceptionHandler(catch_try_index(),
-                                  compiler->assembler()->CodeSize());
+                                  try_index(),
+                                  compiler->assembler()->CodeSize(),
+                                  catch_handler_types_);
   }
   if (HasParallelMove()) {
     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
@@ -1880,115 +1899,6 @@
   UNREACHABLE();
 }
 
-LocationSummary* ThrowInstr::MakeLocationSummary() const {
-  return new LocationSummary(0, 0, LocationSummary::kCall);
-}
-
-
-
-void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  compiler->GenerateCallRuntime(token_pos(),
-                                kThrowRuntimeEntry,
-                                locs());
-  __ int3();
-}
-
-
-LocationSummary* ReThrowInstr::MakeLocationSummary() const {
-  return new LocationSummary(0, 0, LocationSummary::kCall);
-}
-
-
-void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  compiler->GenerateCallRuntime(token_pos(),
-                                kReThrowRuntimeEntry,
-                                locs());
-  __ int3();
-}
-
-
-LocationSummary* GotoInstr::MakeLocationSummary() const {
-  return new LocationSummary(0, 0, LocationSummary::kNoCall);
-}
-
-
-void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  // Add deoptimization descriptor for deoptimizing instructions
-  // that may be inserted before this instruction.
-  if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
-                                   GetDeoptId(),
-                                   0);  // No token position.
-  }
-
-  if (HasParallelMove()) {
-    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
-  }
-
-  // We can fall through if the successor is the next block in the list.
-  // Otherwise, we need a jump.
-  if (!compiler->IsNextBlock(successor())) {
-    __ jmp(compiler->GetBlockLabel(successor()));
-  }
-}
-
-
-static Condition NegateCondition(Condition condition) {
-  switch (condition) {
-    case EQUAL:         return NOT_EQUAL;
-    case NOT_EQUAL:     return EQUAL;
-    case LESS:          return GREATER_EQUAL;
-    case LESS_EQUAL:    return GREATER;
-    case GREATER:       return LESS_EQUAL;
-    case GREATER_EQUAL: return LESS;
-    case BELOW:         return ABOVE_EQUAL;
-    case BELOW_EQUAL:   return ABOVE;
-    case ABOVE:         return BELOW_EQUAL;
-    case ABOVE_EQUAL:   return BELOW;
-    default:
-      OS::Print("Error %d\n", condition);
-      UNIMPLEMENTED();
-      return EQUAL;
-  }
-}
-
-
-void ControlInstruction::EmitBranchOnValue(FlowGraphCompiler* compiler,
-                                           bool value) {
-  if (value && compiler->IsNextBlock(false_successor())) {
-    __ jmp(compiler->GetBlockLabel(true_successor()));
-  } else if (!value && compiler->IsNextBlock(true_successor())) {
-    __ jmp(compiler->GetBlockLabel(false_successor()));
-  }
-}
-
-
-void ControlInstruction::EmitBranchOnCondition(FlowGraphCompiler* compiler,
-                                               Condition true_condition) {
-  if (compiler->IsNextBlock(false_successor())) {
-    // If the next block is the false successor we will fall through to it.
-    __ j(true_condition, compiler->GetBlockLabel(true_successor()));
-  } else {
-    // If the next block is the true successor we negate comparison and fall
-    // through to it.
-    ASSERT(compiler->IsNextBlock(true_successor()));
-    Condition false_condition = NegateCondition(true_condition);
-    __ j(false_condition, compiler->GetBlockLabel(false_successor()));
-  }
-}
-
-
-LocationSummary* CurrentContextInstr::MakeLocationSummary() const {
-  return LocationSummary::Make(0,
-                               Location::RequiresRegister(),
-                               LocationSummary::kNoCall);
-}
-
-
-void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ MoveRegister(locs()->out().reg(), CTX);
-}
-
 
 LocationSummary* StoreContextInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 1;
@@ -2015,107 +1925,6 @@
 }
 
 
-LocationSummary* StrictCompareInstr::MakeLocationSummary() const {
-  const intptr_t kNumInputs = 2;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, Location::RegisterOrConstant(left()));
-  locs->set_in(1, Location::RegisterOrConstant(right()));
-  locs->set_out(Location::RequiresRegister());
-  return locs;
-}
-
-
-// Special code for numbers (compare values instead of references.)
-void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
-  Location left = locs()->in(0);
-  Location right = locs()->in(1);
-  if (left.IsConstant() && right.IsConstant()) {
-    // TODO(vegorov): should be eliminated earlier by constant propagation.
-    const bool result = (kind() == Token::kEQ_STRICT) ?
-        left.constant().raw() == right.constant().raw() :
-        left.constant().raw() != right.constant().raw();
-    __ LoadObject(locs()->out().reg(), result ? Bool::True() : Bool::False());
-    return;
-  }
-  if (left.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(right.reg(),
-                                          left.constant(),
-                                          needs_number_check());
-  } else if (right.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(left.reg(),
-                                          right.constant(),
-                                          needs_number_check());
-  } else {
-    compiler->EmitEqualityRegRegCompare(left.reg(),
-                                       right.reg(),
-                                       needs_number_check());
-  }
-
-  Register result = locs()->out().reg();
-  Label load_true, done;
-  Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL;
-  __ j(true_condition, &load_true, Assembler::kNearJump);
-  __ LoadObject(result, Bool::False());
-  __ jmp(&done, Assembler::kNearJump);
-  __ Bind(&load_true);
-  __ LoadObject(result, Bool::True());
-  __ Bind(&done);
-}
-
-
-void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
-                                        BranchInstr* branch) {
-  ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
-  Location left = locs()->in(0);
-  Location right = locs()->in(1);
-  if (left.IsConstant() && right.IsConstant()) {
-    // TODO(vegorov): should be eliminated earlier by constant propagation.
-    const bool result = (kind() == Token::kEQ_STRICT) ?
-        left.constant().raw() == right.constant().raw() :
-        left.constant().raw() != right.constant().raw();
-    branch->EmitBranchOnValue(compiler, result);
-    return;
-  }
-  if (left.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(right.reg(),
-                                          left.constant(),
-                                          needs_number_check());
-  } else if (right.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(left.reg(),
-                                          right.constant(),
-                                          needs_number_check());
-  } else {
-    compiler->EmitEqualityRegRegCompare(left.reg(),
-                                        right.reg(),
-                                        needs_number_check());
-  }
-
-  Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL;
-  branch->EmitBranchOnCondition(compiler, true_condition);
-}
-
-
-void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  // The arguments to the stub include the closure, as does the arguments
-  // descriptor.
-  Register temp_reg = locs()->temp(0).reg();
-  int argument_count = ArgumentCount();
-  const Array& arguments_descriptor =
-      Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
-                                                 argument_names()));
-  __ LoadObject(temp_reg, arguments_descriptor);
-  compiler->GenerateDartCall(deopt_id(),
-                             token_pos(),
-                             &StubCode::CallClosureFunctionLabel(),
-                             PcDescriptors::kOther,
-                             locs());
-  __ Drop(argument_count);
-}
-
-
 LocationSummary* InstanceCallInstr::MakeLocationSummary() const {
   return MakeCallSummary();
 }
@@ -2172,6 +1981,13 @@
 
 void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label skip_call;
+  if (!compiler->is_optimizing()) {
+    // Some static calls can be optimized by the optimizing compiler (e.g. sqrt)
+    // and therefore need a deoptimization descriptor.
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+                                   deopt_id(),
+                                   token_pos());
+  }
   if (function().name() == Symbols::EqualOperator().raw()) {
     compiler->EmitSuperEqualityCallPrologue(locs()->out().reg(), &skip_call);
   }
@@ -2196,107 +2012,6 @@
 }
 
 
-LocationSummary* BooleanNegateInstr::MakeLocationSummary() const {
-  return LocationSummary::Make(1,
-                               Location::RequiresRegister(),
-                               LocationSummary::kNoCall);
-}
-
-
-void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register value = locs()->in(0).reg();
-  Register result = locs()->out().reg();
-
-  Label done;
-  __ LoadObject(result, Bool::True());
-  __ CompareRegisters(result, value);
-  __ j(NOT_EQUAL, &done, Assembler::kNearJump);
-  __ LoadObject(result, Bool::False());
-  __ Bind(&done);
-}
-
-
-LocationSummary* ChainContextInstr::MakeLocationSummary() const {
-  return LocationSummary::Make(1,
-                               Location::NoLocation(),
-                               LocationSummary::kNoCall);
-}
-
-
-void ChainContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register context_value = locs()->in(0).reg();
-
-  // Chain the new context in context_value to its parent in CTX.
-  __ StoreIntoObject(context_value,
-                     FieldAddress(context_value, Context::parent_offset()),
-                     CTX);
-  // Set new context as current context.
-  __ MoveRegister(CTX, context_value);
-}
-
-
-LocationSummary* StoreVMFieldInstr::MakeLocationSummary() const {
-  const intptr_t kNumInputs = 2;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
-                                              : Location::RequiresRegister());
-  locs->set_in(1, Location::RequiresRegister());
-  return locs;
-}
-
-
-void StoreVMFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register value_reg = locs()->in(0).reg();
-  Register dest_reg = locs()->in(1).reg();
-
-  if (value()->NeedsStoreBuffer()) {
-    __ StoreIntoObject(dest_reg, FieldAddress(dest_reg, offset_in_bytes()),
-                       value_reg);
-  } else {
-    __ StoreIntoObjectNoBarrier(
-        dest_reg, FieldAddress(dest_reg, offset_in_bytes()), value_reg);
-  }
-}
-
-
-LocationSummary* AllocateObjectInstr::MakeLocationSummary() const {
-  return MakeCallSummary();
-}
-
-
-void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Class& cls = Class::ZoneHandle(constructor().Owner());
-  const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls));
-  const ExternalLabel label(cls.ToCString(), stub.EntryPoint());
-  compiler->GenerateCall(token_pos(),
-                         &label,
-                         PcDescriptors::kOther,
-                         locs());
-  __ Drop(ArgumentCount());  // Discard arguments.
-}
-
-
-LocationSummary* CreateClosureInstr::MakeLocationSummary() const {
-  return MakeCallSummary();
-}
-
-
-void CreateClosureInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Function& closure_function = function();
-  ASSERT(!closure_function.IsImplicitStaticClosureFunction());
-  const Code& stub = Code::Handle(
-      StubCode::GetAllocationStubForClosure(closure_function));
-  const ExternalLabel label(closure_function.ToCString(), stub.EntryPoint());
-  compiler->GenerateCall(token_pos(),
-                         &label,
-                         PcDescriptors::kOther,
-                         locs());
-  __ Drop(2);  // Discard type arguments and receiver.
-}
-
-
 Environment* Environment::From(const GrowableArray<Definition*>& definitions,
                                intptr_t fixed_parameter_count,
                                const Function& function) {
@@ -2671,8 +2386,26 @@
 
 
 
-void StringCharCodeAtInstr::InferRange() {
-  switch (class_id_) {
+void LoadIndexedInstr::InferRange() {
+  switch (class_id()) {
+    case kInt8ArrayCid:
+      range_ = new Range(RangeBoundary::FromConstant(-128),
+                         RangeBoundary::FromConstant(127));
+      break;
+    case kUint8ArrayCid:
+    case kUint8ClampedArrayCid:
+    case kExternalUint8ArrayCid:
+      range_ = new Range(RangeBoundary::FromConstant(0),
+                         RangeBoundary::FromConstant(255));
+      break;
+    case kInt16ArrayCid:
+      range_ = new Range(RangeBoundary::FromConstant(-32768),
+                         RangeBoundary::FromConstant(32767));
+      break;
+    case kUint16ArrayCid:
+      range_ = new Range(RangeBoundary::FromConstant(0),
+                         RangeBoundary::FromConstant(65535));
+      break;
     case kOneByteStringCid:
       range_ = new Range(RangeBoundary::FromConstant(0),
                          RangeBoundary::FromConstant(0xFF));
@@ -2682,20 +2415,6 @@
                          RangeBoundary::FromConstant(0xFFFF));
       break;
     default:
-      UNIMPLEMENTED();
-  }
-}
-
-
-void LoadIndexedInstr::InferRange() {
-  switch (class_id()) {
-    case kUint8ArrayCid:
-    case kUint8ClampedArrayCid:
-    case kExternalUint8ArrayCid:
-      range_ = new Range(RangeBoundary::FromConstant(0),
-                         RangeBoundary::FromConstant(255));
-      break;
-    default:
       Definition::InferRange();
       break;
   }
@@ -2964,7 +2683,6 @@
   }
 }
 
-
 #undef __
 
 }  // namespace dart
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 9ef1368..0228cfb 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -46,6 +46,8 @@
   V(_Double, toInt, DoubleToInteger, 362666636)                                \
   V(_Double, truncate, DoubleTruncate, 620870996)                              \
   V(_Double, round, DoubleRound, 620870996)                                    \
+  V(_Double, floor, DoubleFloor, 620870996)                                    \
+  V(_Double, ceil, DoubleCeil, 620870996)                                      \
   V(::, sqrt, MathSqrt, 1662640002)                                            \
 
 // Class that recognizes the name and owner of a function and returns the
@@ -272,7 +274,6 @@
   M(UnaryMintOp)                                                               \
   M(CheckArrayBound)                                                           \
   M(Constraint)                                                                \
-  M(StringCharCodeAt)                                                          \
   M(StringFromCharCode)
 
 
@@ -511,7 +512,6 @@
   friend class CheckSmiInstr;
   friend class CheckArrayBoundInstr;
   friend class CheckEitherNonSmiInstr;
-  friend class StringCharCodeAtInstr;
   friend class LICM;
   friend class DoubleToSmiInstr;
   friend class DoubleToDoubleInstr;
@@ -978,7 +978,8 @@
   TargetEntryInstr(intptr_t block_id, intptr_t try_index, intptr_t loop_depth)
       : BlockEntryInstr(block_id, try_index, loop_depth),
         predecessor_(NULL),
-        catch_try_index_(CatchClauseNode::kInvalidTryIndex) { }
+        catch_try_index_(CatchClauseNode::kInvalidTryIndex),
+        catch_handler_types_(Array::ZoneHandle()) { }
 
   DECLARE_INSTRUCTION(TargetEntry)
 
@@ -1002,6 +1003,9 @@
     return catch_try_index_;
   }
   void set_catch_try_index(intptr_t index) { catch_try_index_ = index; }
+  void set_catch_handler_types(const Array& handler_types) {
+    catch_handler_types_ = handler_types.raw();
+  }
 
   virtual void PrepareEntry(FlowGraphCompiler* compiler);
 
@@ -1017,6 +1021,7 @@
 
   BlockEntryInstr* predecessor_;
   intptr_t catch_try_index_;
+  Array& catch_handler_types_;
 
   DISALLOW_COPY_AND_ASSIGN(TargetEntryInstr);
 };
@@ -1609,6 +1614,19 @@
 
   RangeBoundary() : kind_(kUnknown), value_(0), offset_(0) { }
 
+  RangeBoundary(const RangeBoundary& other)
+      : ValueObject(),
+        kind_(other.kind_),
+        value_(other.value_),
+        offset_(other.offset_) { }
+
+  RangeBoundary& operator=(const RangeBoundary& other) {
+    kind_ = other.kind_;
+    value_ = other.value_;
+    offset_ = other.offset_;
+    return *this;
+  }
+
   static RangeBoundary FromConstant(intptr_t val) {
     return RangeBoundary(kConstant, val, 0);
   }
@@ -2279,9 +2297,10 @@
                        Value* left,
                        Value* right)
       : ComparisonInstr(kind, left, right),
-        ic_data_(Isolate::Current()->GetICDataForDeoptId(deopt_id())),
         token_pos_(token_pos),
         receiver_class_id_(kIllegalCid) {
+    // deopt_id() checks receiver_class_id_ value.
+    ic_data_ = Isolate::Current()->GetICDataForDeoptId(deopt_id());
     ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
   }
 
@@ -2346,9 +2365,10 @@
                     Value* left,
                     Value* right)
       : ComparisonInstr(kind, left, right),
-        ic_data_(Isolate::Current()->GetICDataForDeoptId(deopt_id())),
         token_pos_(token_pos),
         operands_class_id_(kIllegalCid) {
+    // deopt_id() checks operands_class_id_ value.
+    ic_data_ = Isolate::Current()->GetICDataForDeoptId(deopt_id());
     ASSERT(Token::IsRelationalOperator(kind));
   }
 
@@ -2670,77 +2690,6 @@
 };
 
 
-class StringCharCodeAtInstr : public TemplateDefinition<2> {
- public:
-  StringCharCodeAtInstr(Value* receiver,
-                        Value* index,
-                        intptr_t class_id)
-      : class_id_(class_id) {
-    ASSERT(receiver != NULL);
-    ASSERT(index != NULL);
-    inputs_[0] = receiver;
-    inputs_[1] = index;
-  }
-
-  DECLARE_INSTRUCTION(StringCharCodeAt)
-  virtual RawAbstractType* CompileType() const;
-
-  Value* receiver() const { return inputs_[0]; }
-  Value* index() const { return inputs_[1]; }
-  intptr_t class_id() const { return class_id_; }
-
-  virtual bool CanDeoptimize() const { return false; }
-
-  virtual bool HasSideEffect() const { return false; }
-
-  virtual intptr_t ResultCid() const;
-
-  virtual bool AttributesEqual(Instruction* other) const;
-
-  virtual bool AffectedBySideEffect() const { return true; }
-
-  virtual void InferRange();
-
- private:
-  const intptr_t class_id_;
-
-  DISALLOW_COPY_AND_ASSIGN(StringCharCodeAtInstr);
-};
-
-
-class StringFromCharCodeInstr : public TemplateDefinition<1> {
- public:
-  explicit StringFromCharCodeInstr(Value* char_code,
-                                   intptr_t cid) : cid_(cid) {
-    ASSERT(char_code != NULL);
-    ASSERT(char_code->definition()->IsStringCharCodeAt() &&
-           (char_code->definition()->AsStringCharCodeAt()->class_id() ==
-            kOneByteStringCid));
-    inputs_[0] = char_code;
-  }
-
-  DECLARE_INSTRUCTION(StringFromCharCode)
-  virtual RawAbstractType* CompileType() const;
-
-  Value* char_code() const { return inputs_[0]; }
-
-  virtual bool CanDeoptimize() const { return false; }
-
-  virtual bool HasSideEffect() const { return false; }
-
-  virtual intptr_t ResultCid() const {  return cid_; }
-
-  virtual bool AttributesEqual(Instruction* other) const { return true; }
-
-  virtual bool AffectedBySideEffect() const { return false; }
-
- private:
-  const intptr_t cid_;
-
-  DISALLOW_COPY_AND_ASSIGN(StringFromCharCodeInstr);
-};
-
-
 class LoadIndexedInstr : public TemplateDefinition<2> {
  public:
   LoadIndexedInstr(Value* array, Value* index, intptr_t class_id)
@@ -2779,6 +2728,39 @@
 };
 
 
+class StringFromCharCodeInstr : public TemplateDefinition<1> {
+ public:
+  explicit StringFromCharCodeInstr(Value* char_code,
+                                   intptr_t cid) : cid_(cid) {
+    ASSERT(char_code != NULL);
+    ASSERT(char_code->definition()->IsLoadIndexed() &&
+           (char_code->definition()->AsLoadIndexed()->class_id() ==
+            kOneByteStringCid));
+    inputs_[0] = char_code;
+  }
+
+  DECLARE_INSTRUCTION(StringFromCharCode)
+  virtual RawAbstractType* CompileType() const;
+
+  Value* char_code() const { return inputs_[0]; }
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual bool HasSideEffect() const { return false; }
+
+  virtual intptr_t ResultCid() const {  return cid_; }
+
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
+
+  virtual bool AffectedBySideEffect() const { return false; }
+
+ private:
+  const intptr_t cid_;
+
+  DISALLOW_COPY_AND_ASSIGN(StringFromCharCodeInstr);
+};
+
+
 class StoreIndexedInstr : public TemplateDefinition<3> {
  public:
   StoreIndexedInstr(Value* array,
@@ -2912,7 +2894,9 @@
  public:
   AllocateObjectInstr(ConstructorCallNode* node,
                       ZoneGrowableArray<PushArgumentInstr*>* arguments)
-      : ast_node_(*node), arguments_(arguments) {
+      : ast_node_(*node),
+        arguments_(arguments),
+        cid_(Class::Handle(node->constructor().Owner()).id()) {
     // Either no arguments or one type-argument and one instantiator.
     ASSERT(arguments->is_empty() || (arguments->length() == 2));
   }
@@ -2934,11 +2918,12 @@
 
   virtual bool HasSideEffect() const { return true; }
 
-  virtual intptr_t ResultCid() const { return kDynamicCid; }
+  virtual intptr_t ResultCid() const { return cid_; }
 
  private:
   const ConstructorCallNode& ast_node_;
   ZoneGrowableArray<PushArgumentInstr*>* const arguments_;
+  const intptr_t cid_;
 
   DISALLOW_COPY_AND_ASSIGN(AllocateObjectInstr);
 };
@@ -3027,16 +3012,18 @@
 
 class CreateClosureInstr : public TemplateDefinition<0> {
  public:
-  CreateClosureInstr(ClosureNode* node,
-                     ZoneGrowableArray<PushArgumentInstr*>* arguments)
-      : ast_node_(*node),
-        arguments_(arguments) { }
+  CreateClosureInstr(const Function& function,
+                     ZoneGrowableArray<PushArgumentInstr*>* arguments,
+                     intptr_t token_pos)
+      : function_(function),
+        arguments_(arguments),
+        token_pos_(token_pos) { }
 
   DECLARE_INSTRUCTION(CreateClosure)
   virtual RawAbstractType* CompileType() const;
 
-  intptr_t token_pos() const { return ast_node_.token_pos(); }
-  const Function& function() const { return ast_node_.function(); }
+  intptr_t token_pos() const { return token_pos_; }
+  const Function& function() const { return function_; }
 
   virtual intptr_t ArgumentCount() const { return arguments_->length(); }
   PushArgumentInstr* ArgumentAt(intptr_t index) const {
@@ -3052,8 +3039,9 @@
   virtual intptr_t ResultCid() const { return kDynamicCid; }
 
  private:
-  const ClosureNode& ast_node_;
+  const Function& function_;
   ZoneGrowableArray<PushArgumentInstr*>* arguments_;
+  intptr_t token_pos_;
 
   DISALLOW_COPY_AND_ASSIGN(CreateClosureInstr);
 };
@@ -4085,7 +4073,7 @@
 
   virtual bool AttributesEqual(Instruction* other) const;
 
-  virtual bool AffectedBySideEffect() const { return false; }
+  virtual bool AffectedBySideEffect() const;
 
   Value* value() const { return inputs_[0]; }
 
@@ -4189,6 +4177,17 @@
     explicit ShallowIterator(Environment* environment)
         : environment_(environment), index_(0) { }
 
+    ShallowIterator(const ShallowIterator& other)
+        : ValueObject(),
+          environment_(other.environment_),
+          index_(other.index_) { }
+
+    ShallowIterator& operator=(const ShallowIterator& other) {
+      environment_ = other.environment_;
+      index_ = other.index_;
+      return *this;
+    }
+
     Environment* environment() const { return environment_; }
 
     void Advance() {
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
new file mode 100644
index 0000000..8838123
--- /dev/null
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -0,0 +1,725 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"  // Needed here to get TARGET_ARCH_ARM.
+#if defined(TARGET_ARCH_ARM)
+
+#include "vm/intermediate_language.h"
+
+#include "lib/error.h"
+#include "vm/dart_entry.h"
+#include "vm/flow_graph_compiler.h"
+#include "vm/locations.h"
+#include "vm/object_store.h"
+#include "vm/parser.h"
+#include "vm/stub_code.h"
+#include "vm/symbols.h"
+
+namespace dart {
+
+DECLARE_FLAG(int, optimization_counter_threshold);
+DECLARE_FLAG(bool, propagate_ic_data);
+
+LocationSummary* Instruction::MakeCallSummary() {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+LocationSummary* PushArgumentInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void PushArgumentInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ReturnInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ClosureCallInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+LocationSummary* LoadLocalInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StoreLocalInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StoreLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ConstantInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* AssertAssignableInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+LocationSummary* AssertBooleanInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void AssertBooleanInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ArgumentDefinitionTestInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ArgumentDefinitionTestInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* EqualityCompareInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void EqualityCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+void EqualityCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                          BranchInstr* branch) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* RelationalOpInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void RelationalOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+void RelationalOpInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                       BranchInstr* branch) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* NativeCallInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StringFromCharCodeInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* LoadIndexedInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StoreIndexedInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StoreInstanceFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* LoadStaticFieldInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* InstanceOfInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CreateArrayInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary*
+AllocateObjectWithBoundsCheckInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void AllocateObjectWithBoundsCheckInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* LoadFieldInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void LoadFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void InstantiateTypeArgumentsInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary*
+ExtractConstructorTypeArgumentsInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ExtractConstructorTypeArgumentsInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary*
+ExtractConstructorInstantiatorInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ExtractConstructorInstantiatorInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* AllocateContextInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CloneContextInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CatchEntryInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CatchEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CheckStackOverflowInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CheckStackOverflowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BinarySmiOpInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BinarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BoxDoubleInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxDoubleInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* MathSqrtInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void MathSqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnarySmiOpInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* SmiToDoubleInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* DoubleToIntegerInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* DoubleToSmiInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* DoubleToDoubleInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BranchInstr::MakeLocationSummary() const {
+  UNREACHABLE();
+  return NULL;
+}
+
+
+void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CheckClassInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CheckSmiInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CheckArrayBoundInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxIntegerInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BoxIntegerInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BinaryMintOpInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BinaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ShiftMintOpInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ShiftMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnaryMintOpInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ThrowInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+
+void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ReThrowInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* GotoInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+void ControlInstruction::EmitBranchOnValue(FlowGraphCompiler* compiler,
+                                           bool value) {
+  UNIMPLEMENTED();
+}
+
+
+void ControlInstruction::EmitBranchOnCondition(FlowGraphCompiler* compiler,
+                                               Condition true_condition) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CurrentContextInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StrictCompareInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                        BranchInstr* branch) {
+  UNIMPLEMENTED();
+}
+
+
+void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BooleanNegateInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ChainContextInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ChainContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StoreVMFieldInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StoreVMFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* AllocateObjectInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CreateClosureInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CreateClosureInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_ARM
+
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 9172a5c..c336720 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -8,6 +8,7 @@
 #include "vm/intermediate_language.h"
 
 #include "lib/error.h"
+#include "vm/dart_entry.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
@@ -267,8 +268,8 @@
     const intptr_t kNumTemps = 1;
     LocationSummary* locs =
         new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    locs->set_in(0, Location::RequiresXmmRegister());
-    locs->set_in(1, Location::RequiresXmmRegister());
+    locs->set_in(0, Location::RequiresFpuRegister());
+    locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_temp(0, Location::RequiresRegister());
     locs->set_out(Location::RequiresRegister());
     return locs;
@@ -277,8 +278,8 @@
     const intptr_t kNumTemps = 0;
     LocationSummary* locs =
         new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    locs->set_in(0, Location::RequiresXmmRegister());
-    locs->set_in(1, Location::RequiresXmmRegister());
+    locs->set_in(0, Location::RequiresFpuRegister());
+    locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(Location::RequiresRegister());
     return locs;
   }
@@ -341,7 +342,7 @@
   const Array& kNoArgumentNames = Array::Handle();
   const int kNumArgumentsChecked = 2;
 
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label check_identity;
   __ cmpl(Address(ESP, 0 * kWordSize), raw_null);
@@ -527,7 +528,7 @@
   __ testl(left, Immediate(kSmiTagMask));
   __ j(ZERO, deopt);
   // 'left' is not Smi.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label identity_compare;
   __ cmpl(right, raw_null);
@@ -578,7 +579,7 @@
   ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
   Register left = locs->in(0).reg();
   Register right = locs->in(1).reg();
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label done, identity_compare, non_null_compare;
   __ cmpl(right, raw_null);
@@ -664,8 +665,8 @@
                                       Token::Kind kind,
                                       BranchInstr* branch) {
   ASSERT(Token::IsEqualityOperator(kind));
-  XmmRegister left = locs.in(0).xmm_reg();
-  XmmRegister right = locs.in(1).xmm_reg();
+  XmmRegister left = locs.in(0).fpu_reg();
+  XmmRegister right = locs.in(1).fpu_reg();
   Register temp = locs.temp(0).reg();
   __ movaps(XMM0, left);
   __ pcmpeqq(XMM0, right);
@@ -693,8 +694,8 @@
                                         const LocationSummary& locs,
                                         Token::Kind kind,
                                         BranchInstr* branch) {
-  XmmRegister left = locs.in(0).xmm_reg();
-  XmmRegister right = locs.in(1).xmm_reg();
+  XmmRegister left = locs.in(0).fpu_reg();
+  XmmRegister right = locs.in(1).fpu_reg();
   Register left_tmp = locs.temp(0).reg();
   Register right_tmp = locs.temp(1).reg();
   Register result = branch == NULL ? locs.out().reg() : kNoRegister;
@@ -773,8 +774,8 @@
                                    const LocationSummary& locs,
                                    Token::Kind kind,
                                    BranchInstr* branch) {
-  XmmRegister left = locs.in(0).xmm_reg();
-  XmmRegister right = locs.in(1).xmm_reg();
+  XmmRegister left = locs.in(0).fpu_reg();
+  XmmRegister right = locs.in(1).fpu_reg();
 
   Condition true_condition = TokenKindToDoubleCondition(kind);
   if (branch != NULL) {
@@ -883,8 +884,8 @@
     const intptr_t kNumTemps = 2;
     LocationSummary* locs =
         new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    locs->set_in(0, Location::RequiresXmmRegister());
-    locs->set_in(1, Location::RequiresXmmRegister());
+    locs->set_in(0, Location::RequiresFpuRegister());
+    locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_temp(0, Location::RequiresRegister());
     locs->set_temp(1, Location::RequiresRegister());
     locs->set_out(Location::RequiresRegister());
@@ -893,8 +894,8 @@
   if (operands_class_id() == kDoubleCid) {
     LocationSummary* summary =
         new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    summary->set_in(0, Location::RequiresXmmRegister());
-    summary->set_in(1, Location::RequiresXmmRegister());
+    summary->set_in(0, Location::RequiresFpuRegister());
+    summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(Location::RequiresRegister());
     return summary;
   } else if (operands_class_id() == kSmiCid) {
@@ -1066,51 +1067,6 @@
 }
 
 
-LocationSummary* StringCharCodeAtInstr::MakeLocationSummary() const {
-  const intptr_t kNumInputs = 2;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, Location::RequiresRegister());
-  locs->set_in(1, CanBeImmediateIndex(index(), class_id())
-                    ? Location::RegisterOrSmiConstant(index())
-                    : Location::RequiresRegister());
-  locs->set_out(Location::RequiresRegister());
-  return locs;
-}
-
-
-void StringCharCodeAtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register str = locs()->in(0).reg();
-  Location index = locs()->in(1);
-  Register result = locs()->out().reg();
-
-  ASSERT((class_id() == kOneByteStringCid) ||
-         (class_id() == kTwoByteStringCid));
-
-  FieldAddress element_address = index.IsRegister() ?
-      FlowGraphCompiler::ElementAddressForRegIndex(
-          class_id(), str, index.reg()) :
-      FlowGraphCompiler::ElementAddressForIntIndex(
-          class_id(), str, Smi::Cast(index.constant()).Value());
-
-  if (class_id() == kOneByteStringCid) {
-    if (index.IsRegister()) {
-      __ SmiUntag(index.reg());
-    }
-    __ movzxb(result, element_address);
-    if (index.IsRegister()) {
-      __ SmiTag(index.reg());  // Retag index.
-    }
-    __ SmiTag(result);
-  } else {
-    // Don't untag smi-index and use TIMES_1 for two byte strings.
-    __ movzxw(result, element_address);
-    __ SmiTag(result);
-  }
-}
-
-
 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
@@ -1141,11 +1097,14 @@
   LocationSummary* locs =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
+  // The smi index is either untagged and tagged again at the end of the
+  // operation (element size == 1), or it is left smi tagged (for all element
+  // sizes > 1).
   locs->set_in(1, CanBeImmediateIndex(index(), class_id())
                     ? Location::RegisterOrSmiConstant(index())
                     : Location::RequiresRegister());
   if (representation() == kUnboxedDouble) {
-    locs->set_out(Location::RequiresXmmRegister());
+    locs->set_out(Location::RequiresFpuRegister());
   } else {
     locs->set_out(Location::RequiresRegister());
   }
@@ -1159,9 +1118,11 @@
 
   if (class_id() == kExternalUint8ArrayCid) {
     Register result = locs()->out().reg();
-    Address element_address = index.IsRegister()
-        ? Address(result, index.reg(), TIMES_1, 0)
-        : Address(result, Smi::Cast(index.constant()).Value());
+    const Address& element_address = index.IsRegister()
+        ? FlowGraphCompiler::ExternalElementAddressForRegIndex(
+            class_id(), result, index.reg())
+        : FlowGraphCompiler::ExternalElementAddressForIntIndex(
+            class_id(), result, Smi::Cast(index.constant()).Value());
     if (index.IsRegister()) {
       __ SmiUntag(index.reg());
     }
@@ -1177,19 +1138,19 @@
     return;
   }
 
-  FieldAddress element_address = index.IsRegister() ?
-      FlowGraphCompiler::ElementAddressForRegIndex(
-          class_id(), array, index.reg()) :
-      FlowGraphCompiler::ElementAddressForIntIndex(
+  FieldAddress element_address = index.IsRegister()
+      ? FlowGraphCompiler::ElementAddressForRegIndex(
+          class_id(), array, index.reg())
+      : FlowGraphCompiler::ElementAddressForIntIndex(
           class_id(), array, Smi::Cast(index.constant()).Value());
 
   if (representation() == kUnboxedDouble) {
-    XmmRegister result = locs()->out().xmm_reg();
+    XmmRegister result = locs()->out().fpu_reg();
     if (class_id() == kFloat32ArrayCid) {
       // Load single precision float.
       __ movss(result, element_address);
       // Promote to double.
-      __ cvtss2sd(result, locs()->out().xmm_reg());
+      __ cvtss2sd(result, locs()->out().fpu_reg());
     } else {
       ASSERT(class_id() == kFloat64ArrayCid);
       __ movsd(result, element_address);
@@ -1198,21 +1159,38 @@
   }
 
   Register result = locs()->out().reg();
-  if ((class_id() == kUint8ArrayCid) ||
-      (class_id() == kUint8ClampedArrayCid)) {
-    if (index.IsRegister()) {
-      __ SmiUntag(index.reg());
-    }
-    __ movzxb(result, element_address);
-    __ SmiTag(result);
-    if (index.IsRegister()) {
-      __ SmiTag(index.reg());  // Re-tag.
-    }
-    return;
+  switch (class_id()) {
+    case kInt8ArrayCid:
+    case kUint8ArrayCid:
+    case kUint8ClampedArrayCid:
+    case kOneByteStringCid:
+      if (index.IsRegister()) {
+        __ SmiUntag(index.reg());
+      }
+      if (class_id() == kInt8ArrayCid) {
+        __ movsxb(result, element_address);
+      } else {
+        __ movzxb(result, element_address);
+      }
+      __ SmiTag(result);
+      if (index.IsRegister()) {
+        __ SmiTag(index.reg());  // Re-tag.
+      }
+      break;
+    case kInt16ArrayCid:
+      __ movsxw(result, element_address);
+      __ SmiTag(result);
+      break;
+    case kUint16ArrayCid:
+    case kTwoByteStringCid:
+      __ movzxw(result, element_address);
+      __ SmiTag(result);
+      break;
+    default:
+      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
+      __ movl(result, element_address);
+      break;
   }
-
-  ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
-  __ movl(result, element_address);
 }
 
 
@@ -1222,6 +1200,9 @@
   LocationSummary* locs =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
+  // The smi index is either untagged and tagged again at the end of the
+  // operation (element size == 1), or it is left smi tagged (for all element
+  // sizes > 1).
   locs->set_in(1, CanBeImmediateIndex(index(), class_id())
                     ? Location::RegisterOrSmiConstant(index())
                     : Location::RequiresRegister());
@@ -1231,18 +1212,25 @@
                         ? Location::WritableRegister()
                         : Location::RegisterOrConstant(value()));
       break;
+    case kInt8ArrayCid:
     case kUint8ArrayCid:
+    case kUint8ClampedArrayCid:
       // TODO(fschneider): Add location constraint for byte registers (EAX,
       // EBX, ECX, EDX) instead of using a fixed register.
       locs->set_in(2, Location::FixedRegisterOrSmiConstant(value(), EAX));
       break;
+    case kInt16ArrayCid:
+    case kUint16ArrayCid:
+      // Writable register because the value must be untagged before storing.
+      locs->set_in(2, Location::WritableRegister());
+      break;
     case kFloat32ArrayCid:
       // Need temp register for float-to-double conversion.
-      locs->AddTemp(Location::RequiresXmmRegister());
+      locs->AddTemp(Location::RequiresFpuRegister());
       // Fall through.
     case kFloat64ArrayCid:
       // TODO(srdjan): Support Float64 constants.
-      locs->set_in(2, Location::RequiresXmmRegister());
+      locs->set_in(2, Location::RequiresFpuRegister());
       break;
     default:
       UNREACHABLE();
@@ -1275,6 +1263,7 @@
         __ StoreIntoObjectNoBarrier(array, element_address, value);
       }
       break;
+    case kInt8ArrayCid:
     case kUint8ArrayCid:
       if (index.IsRegister()) {
         __ SmiUntag(index.reg());
@@ -1292,14 +1281,56 @@
         __ SmiTag(index.reg());  // Re-tag.
       }
       break;
+    case kUint8ClampedArrayCid: {
+      if (index.IsRegister()) {
+        __ SmiUntag(index.reg());
+      }
+      if (locs()->in(2).IsConstant()) {
+        const Smi& constant = Smi::Cast(locs()->in(2).constant());
+        intptr_t value = constant.Value();
+        // Clamp to 0x0 or 0xFF respectively.
+        if (value > 0xFF) {
+          value = 0xFF;
+        } else if (value < 0) {
+          value = 0;
+        }
+        __ movb(element_address,
+                Immediate(static_cast<int8_t>(value)));
+      } else {
+        ASSERT(locs()->in(2).reg() == EAX);
+        Label store_value, store_0xff;
+        __ SmiUntag(EAX);
+        __ cmpl(EAX, Immediate(0xFF));
+        __ j(BELOW_EQUAL, &store_value, Assembler::kNearJump);
+        // Clamp to 0x0 or 0xFF respectively.
+        __ j(GREATER, &store_0xff);
+        __ xorl(EAX, EAX);
+        __ jmp(&store_value, Assembler::kNearJump);
+        __ Bind(&store_0xff);
+        __ movl(EAX, Immediate(0xFF));
+        __ Bind(&store_value);
+        __ movb(element_address, AL);
+      }
+      if (index.IsRegister()) {
+        __ SmiTag(index.reg());  // Re-tag.
+      }
+      break;
+    }
+    case kInt16ArrayCid:
+    case kUint16ArrayCid: {
+        Register value = locs()->in(2).reg();
+        __ SmiUntag(value);
+        __ movw(element_address, value);
+        break;
+      }
     case kFloat32ArrayCid:
       // Convert to single precision.
-      __ cvtsd2ss(locs()->temp(0).xmm_reg(), locs()->in(2).xmm_reg());
+      __ cvtsd2ss(locs()->temp(0).fpu_reg(), locs()->in(2).fpu_reg());
       // Store.
-      __ movss(element_address, locs()->temp(0).xmm_reg());
+      __ movss(element_address, locs()->temp(0).fpu_reg());
       break;
     case kFloat64ArrayCid:
-      __ movsd(element_address, locs()->in(2).xmm_reg());
+      __ movsd(element_address, locs()->in(2).fpu_reg());
       break;
     default:
       UNREACHABLE();
@@ -1418,7 +1449,7 @@
 void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // Allocate the array.  EDX = length, ECX = element type.
   ASSERT(locs()->in(0).reg() == ECX);
-  __ movl(EDX,  Immediate(Smi::RawValue(ArgumentCount())));
+  __ movl(EDX, Immediate(Smi::RawValue(ArgumentCount())));
   compiler->GenerateCall(token_pos(),
                          &StubCode::AllocateArrayLabel(),
                          PcDescriptors::kOther,
@@ -1509,7 +1540,7 @@
   Label type_arguments_instantiated;
   const intptr_t len = type_arguments().Length();
   if (type_arguments().IsRawInstantiatedRaw(len)) {
-    const Immediate raw_null =
+    const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
     __ cmpl(instantiator_reg, raw_null);
     __ j(EQUAL, &type_arguments_instantiated, Assembler::kNearJump);
@@ -1572,7 +1603,7 @@
   Label type_arguments_instantiated;
   const intptr_t len = type_arguments().Length();
   if (type_arguments().IsRawInstantiatedRaw(len)) {
-    const Immediate raw_null =
+    const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
     __ cmpl(instantiator_reg, raw_null);
     __ j(EQUAL, &type_arguments_instantiated, Assembler::kNearJump);
@@ -1586,7 +1617,7 @@
     Label type_arguments_uninstantiated;
     __ CompareClassId(instantiator_reg, kTypeArgumentsCid, temp_reg);
     __ j(NOT_EQUAL, &type_arguments_uninstantiated, Assembler::kNearJump);
-    Immediate arguments_length =
+    const Immediate& arguments_length =
         Immediate(Smi::RawValue(type_arguments().Length()));
     __ cmpl(FieldAddress(instantiator_reg, TypeArguments::length_offset()),
         arguments_length);
@@ -1628,7 +1659,7 @@
   Label done;
   const intptr_t len = type_arguments().Length();
   if (type_arguments().IsRawInstantiatedRaw(len)) {
-    const Immediate raw_null =
+    const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
     Label instantiator_not_null;
     __ cmpl(instantiator_reg, raw_null);
@@ -1654,7 +1685,7 @@
     // instantiator will have the wrong class (Null instead of TypeArguments).
     __ CompareClassId(instantiator_reg, kTypeArgumentsCid, temp_reg);
     __ j(NOT_EQUAL, &done, Assembler::kNearJump);
-    Immediate arguments_length =
+    const Immediate& arguments_length =
         Immediate(Smi::RawValue(type_arguments().Length()));
     __ cmpl(FieldAddress(instantiator_reg, TypeArguments::length_offset()),
         arguments_length);
@@ -2088,7 +2119,7 @@
       new LocationSummary(kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresXmmRegister());
+  summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(Location::RequiresRegister());
   return summary;
 }
@@ -2131,7 +2162,7 @@
   compiler->AddSlowPathCode(slow_path);
 
   Register out_reg = locs()->out().reg();
-  XmmRegister value = locs()->in(0).xmm_reg();
+  XmmRegister value = locs()->in(0).fpu_reg();
 
   AssemblerMacros::TryAllocate(compiler->assembler(),
                                compiler->double_class(),
@@ -2150,7 +2181,7 @@
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (CanDeoptimize()) summary->set_temp(0, Location::RequiresRegister());
-  summary->set_out(Location::RequiresXmmRegister());
+  summary->set_out(Location::RequiresFpuRegister());
   return summary;
 }
 
@@ -2158,7 +2189,7 @@
 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const intptr_t value_cid = value()->ResultCid();
   const Register value = locs()->in(0).reg();
-  const XmmRegister result = locs()->out().xmm_reg();
+  const XmmRegister result = locs()->out().fpu_reg();
 
   if (value_cid == kDoubleCid) {
     __ movsd(result, FieldAddress(value, Double::value_offset()));
@@ -2168,7 +2199,7 @@
     __ SmiTag(value);  // Restore input register.
   } else {
     Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptBinaryDoubleOp);
-    compiler->LoadDoubleOrSmiToXmm(result,
+    compiler->LoadDoubleOrSmiToFpu(result,
                                    value,
                                    locs()->temp(0).reg(),
                                    deopt);
@@ -2181,18 +2212,18 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* summary =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresXmmRegister());
-  summary->set_in(1, Location::RequiresXmmRegister());
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(Location::SameAsFirstInput());
   return summary;
 }
 
 
 void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  XmmRegister left = locs()->in(0).xmm_reg();
-  XmmRegister right = locs()->in(1).xmm_reg();
+  XmmRegister left = locs()->in(0).fpu_reg();
+  XmmRegister right = locs()->in(1).fpu_reg();
 
-  ASSERT(locs()->out().xmm_reg() == left);
+  ASSERT(locs()->out().fpu_reg() == left);
 
   switch (op_kind()) {
     case Token::kADD: __ addsd(left, right); break;
@@ -2209,14 +2240,14 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* summary =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresXmmRegister());
-  summary->set_out(Location::RequiresXmmRegister());
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(Location::RequiresFpuRegister());
   return summary;
 }
 
 
 void MathSqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ sqrtsd(locs()->out().xmm_reg(), locs()->in(0).xmm_reg());
+  __ sqrtsd(locs()->out().fpu_reg(), locs()->in(0).fpu_reg());
 }
 
 
@@ -2336,7 +2367,7 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* result = new LocationSummary(
       kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  result->set_in(0, Location::RequiresXmmRegister());
+  result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(Location::RequiresRegister());
   return result;
 }
@@ -2345,7 +2376,7 @@
 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptDoubleToSmi);
   Register result = locs()->out().reg();
-  XmmRegister value = locs()->in(0).xmm_reg();
+  XmmRegister value = locs()->in(0).fpu_reg();
   __ cvttsd2si(result, value);
   // Overflow is signalled with minint.
   Label do_call, done;
@@ -2362,23 +2393,35 @@
       (recognized_kind() == MethodRecognizer::kDoubleRound) ? 1 : 0;
   LocationSummary* result =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  result->set_in(0, Location::RequiresXmmRegister());
-  result->set_out(Location::RequiresXmmRegister());
+  result->set_in(0, Location::RequiresFpuRegister());
+  result->set_out(Location::RequiresFpuRegister());
   if (recognized_kind() == MethodRecognizer::kDoubleRound) {
-    result->set_temp(0, Location::RequiresXmmRegister());
+    result->set_temp(0, Location::RequiresFpuRegister());
   }
   return result;
 }
 
 
 void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  XmmRegister value = locs()->in(0).xmm_reg();
-  XmmRegister result = locs()->out().xmm_reg();
-  if (recognized_kind() == MethodRecognizer::kDoubleTruncate) {
-    __ roundsd(result, value,  Assembler::kRoundToZero);
-  } else {
-    XmmRegister temp = locs()->temp(0).xmm_reg();
-    __ DoubleRound(result, value, temp);
+  XmmRegister value = locs()->in(0).fpu_reg();
+  XmmRegister result = locs()->out().fpu_reg();
+  switch (recognized_kind()) {
+    case MethodRecognizer::kDoubleTruncate:
+      __ roundsd(result, value,  Assembler::kRoundToZero);
+      break;
+    case MethodRecognizer::kDoubleFloor:
+      __ roundsd(result, value,  Assembler::kRoundDown);
+      break;
+    case MethodRecognizer::kDoubleCeil:
+      __ roundsd(result, value,  Assembler::kRoundUp);
+      break;
+    case MethodRecognizer::kDoubleRound: {
+      XmmRegister temp = locs()->temp(0).fpu_reg();
+      __ DoubleRound(result, value, temp);
+      break;
+    }
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -2397,6 +2440,7 @@
   }
   ASSERT(ic_data().num_args_tested() == 1);
   if (!with_checks()) {
+    ASSERT(ic_data().HasOneTarget());
     const Function& target = Function::ZoneHandle(ic_data().GetTargetAt(0));
     compiler->GenerateStaticCall(instance_call()->deopt_id(),
                                  instance_call()->token_pos(),
@@ -2570,7 +2614,7 @@
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (CanDeoptimize()) summary->set_temp(0, Location::RequiresRegister());
-  summary->set_out(Location::RequiresXmmRegister());
+  summary->set_out(Location::RequiresFpuRegister());
   return summary;
 }
 
@@ -2578,7 +2622,7 @@
 void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const intptr_t value_cid = value()->ResultCid();
   const Register value = locs()->in(0).reg();
-  const XmmRegister result = locs()->out().xmm_reg();
+  const XmmRegister result = locs()->out().fpu_reg();
 
   if (value_cid == kMintCid) {
     __ movsd(result, FieldAddress(value, Mint::value_offset()));
@@ -2614,7 +2658,7 @@
       new LocationSummary(kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresXmmRegister());
+  summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_temp(0, Location::RegisterLocation(EAX));
   summary->set_temp(1, Location::RegisterLocation(EDX));
   // TODO(fschneider): Save one temp by using result register as a temp.
@@ -2661,7 +2705,7 @@
   compiler->AddSlowPathCode(slow_path);
 
   Register out_reg = locs()->out().reg();
-  XmmRegister value = locs()->in(0).xmm_reg();
+  XmmRegister value = locs()->in(0).fpu_reg();
 
   // Unboxed operations produce smis or mint-sized values.
   // Check if value fits into a smi.
@@ -2705,8 +2749,8 @@
       const intptr_t kNumTemps = 0;
       LocationSummary* summary =
           new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-      summary->set_in(0, Location::RequiresXmmRegister());
-      summary->set_in(1, Location::RequiresXmmRegister());
+      summary->set_in(0, Location::RequiresFpuRegister());
+      summary->set_in(1, Location::RequiresFpuRegister());
       summary->set_out(Location::SameAsFirstInput());
       return summary;
     }
@@ -2715,8 +2759,8 @@
       const intptr_t kNumTemps = 2;
       LocationSummary* summary =
           new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-      summary->set_in(0, Location::RequiresXmmRegister());
-      summary->set_in(1, Location::RequiresXmmRegister());
+      summary->set_in(0, Location::RequiresFpuRegister());
+      summary->set_in(1, Location::RequiresFpuRegister());
       summary->set_temp(0, Location::RequiresRegister());
       summary->set_temp(1, Location::RequiresRegister());
       summary->set_out(Location::SameAsFirstInput());
@@ -2730,10 +2774,10 @@
 
 
 void BinaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  XmmRegister left = locs()->in(0).xmm_reg();
-  XmmRegister right = locs()->in(1).xmm_reg();
+  XmmRegister left = locs()->in(0).fpu_reg();
+  XmmRegister right = locs()->in(1).fpu_reg();
 
-  ASSERT(locs()->out().xmm_reg() == left);
+  ASSERT(locs()->out().fpu_reg() == left);
 
   switch (op_kind()) {
     case Token::kBIT_AND: __ andpd(left, right); break;
@@ -2777,7 +2821,7 @@
   const intptr_t kNumTemps = op_kind() == Token::kSHL ? 2 : 1;
   LocationSummary* summary =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresXmmRegister());
+  summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RegisterLocation(ECX));
   summary->set_temp(0, Location::RequiresRegister());
   if (op_kind() == Token::kSHL) {
@@ -2789,9 +2833,9 @@
 
 
 void ShiftMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  XmmRegister left = locs()->in(0).xmm_reg();
+  XmmRegister left = locs()->in(0).fpu_reg();
   ASSERT(locs()->in(1).reg() == ECX);
-  ASSERT(locs()->out().xmm_reg() == left);
+  ASSERT(locs()->out().fpu_reg() == left);
 
   Label* deopt  = compiler->AddDeoptStub(deopt_id(),
                                          kDeoptShiftMintOp);
@@ -2805,7 +2849,7 @@
   // shrd is undefined with count > operand size (32)
   // TODO(fschneider): Support shift counts > 31 without deoptimization.
   __ SmiUntag(ECX);
-  const Immediate kCountLimit = Immediate(31);
+  const Immediate& kCountLimit = Immediate(31);
   __ cmpl(ECX, kCountLimit);
   __ j(ABOVE, deopt);
   switch (op_kind()) {
@@ -2847,7 +2891,7 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* summary =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresXmmRegister());
+  summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(Location::SameAsFirstInput());
   return summary;
 }
@@ -2855,15 +2899,326 @@
 
 void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(op_kind() == Token::kBIT_NOT);
-  XmmRegister value = locs()->in(0).xmm_reg();
-  ASSERT(value == locs()->out().xmm_reg());
+  XmmRegister value = locs()->in(0).fpu_reg();
+  ASSERT(value == locs()->out().fpu_reg());
   __ pcmpeqq(XMM0, XMM0);  // Generate all 1's.
   __ pxor(value, XMM0);
 }
 
 
+LocationSummary* ThrowInstr::MakeLocationSummary() const {
+  return new LocationSummary(0, 0, LocationSummary::kCall);
+}
+
+
+
+void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  compiler->GenerateCallRuntime(token_pos(),
+                                kThrowRuntimeEntry,
+                                locs());
+  __ int3();
+}
+
+
+LocationSummary* ReThrowInstr::MakeLocationSummary() const {
+  return new LocationSummary(0, 0, LocationSummary::kCall);
+}
+
+
+void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  compiler->GenerateCallRuntime(token_pos(),
+                                kReThrowRuntimeEntry,
+                                locs());
+  __ int3();
+}
+
+
+LocationSummary* GotoInstr::MakeLocationSummary() const {
+  return new LocationSummary(0, 0, LocationSummary::kNoCall);
+}
+
+
+void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // Add deoptimization descriptor for deoptimizing instructions
+  // that may be inserted before this instruction.
+  if (!compiler->is_optimizing()) {
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+                                   GetDeoptId(),
+                                   0);  // No token position.
+  }
+
+  if (HasParallelMove()) {
+    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
+  }
+
+  // We can fall through if the successor is the next block in the list.
+  // Otherwise, we need a jump.
+  if (!compiler->IsNextBlock(successor())) {
+    __ jmp(compiler->GetBlockLabel(successor()));
+  }
+}
+
+
+static Condition NegateCondition(Condition condition) {
+  switch (condition) {
+    case EQUAL:         return NOT_EQUAL;
+    case NOT_EQUAL:     return EQUAL;
+    case LESS:          return GREATER_EQUAL;
+    case LESS_EQUAL:    return GREATER;
+    case GREATER:       return LESS_EQUAL;
+    case GREATER_EQUAL: return LESS;
+    case BELOW:         return ABOVE_EQUAL;
+    case BELOW_EQUAL:   return ABOVE;
+    case ABOVE:         return BELOW_EQUAL;
+    case ABOVE_EQUAL:   return BELOW;
+    default:
+      OS::Print("Error %d\n", condition);
+      UNIMPLEMENTED();
+      return EQUAL;
+  }
+}
+
+
+void ControlInstruction::EmitBranchOnValue(FlowGraphCompiler* compiler,
+                                           bool value) {
+  if (value && compiler->IsNextBlock(false_successor())) {
+    __ jmp(compiler->GetBlockLabel(true_successor()));
+  } else if (!value && compiler->IsNextBlock(true_successor())) {
+    __ jmp(compiler->GetBlockLabel(false_successor()));
+  }
+}
+
+
+void ControlInstruction::EmitBranchOnCondition(FlowGraphCompiler* compiler,
+                                               Condition true_condition) {
+  if (compiler->IsNextBlock(false_successor())) {
+    // If the next block is the false successor we will fall through to it.
+    __ j(true_condition, compiler->GetBlockLabel(true_successor()));
+  } else {
+    // If the next block is the true successor we negate comparison and fall
+    // through to it.
+    ASSERT(compiler->IsNextBlock(true_successor()));
+    Condition false_condition = NegateCondition(true_condition);
+    __ j(false_condition, compiler->GetBlockLabel(false_successor()));
+  }
+}
+
+
+LocationSummary* CurrentContextInstr::MakeLocationSummary() const {
+  return LocationSummary::Make(0,
+                               Location::RequiresRegister(),
+                               LocationSummary::kNoCall);
+}
+
+
+void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  __ MoveRegister(locs()->out().reg(), CTX);
+}
+
+
+LocationSummary* StrictCompareInstr::MakeLocationSummary() const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::RegisterOrConstant(left()));
+  locs->set_in(1, Location::RegisterOrConstant(right()));
+  locs->set_out(Location::RequiresRegister());
+  return locs;
+}
+
+
+// Special code for numbers (compare values instead of references.)
+void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
+  Location left = locs()->in(0);
+  Location right = locs()->in(1);
+  if (left.IsConstant() && right.IsConstant()) {
+    // TODO(vegorov): should be eliminated earlier by constant propagation.
+    const bool result = (kind() == Token::kEQ_STRICT) ?
+        left.constant().raw() == right.constant().raw() :
+        left.constant().raw() != right.constant().raw();
+    __ LoadObject(locs()->out().reg(), result ? Bool::True() : Bool::False());
+    return;
+  }
+  if (left.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(right.reg(),
+                                          left.constant(),
+                                          needs_number_check());
+  } else if (right.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(left.reg(),
+                                          right.constant(),
+                                          needs_number_check());
+  } else {
+    compiler->EmitEqualityRegRegCompare(left.reg(),
+                                       right.reg(),
+                                       needs_number_check());
+  }
+
+  Register result = locs()->out().reg();
+  Label load_true, done;
+  Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL;
+  __ j(true_condition, &load_true, Assembler::kNearJump);
+  __ LoadObject(result, Bool::False());
+  __ jmp(&done, Assembler::kNearJump);
+  __ Bind(&load_true);
+  __ LoadObject(result, Bool::True());
+  __ Bind(&done);
+}
+
+
+void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                        BranchInstr* branch) {
+  ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
+  Location left = locs()->in(0);
+  Location right = locs()->in(1);
+  if (left.IsConstant() && right.IsConstant()) {
+    // TODO(vegorov): should be eliminated earlier by constant propagation.
+    const bool result = (kind() == Token::kEQ_STRICT) ?
+        left.constant().raw() == right.constant().raw() :
+        left.constant().raw() != right.constant().raw();
+    branch->EmitBranchOnValue(compiler, result);
+    return;
+  }
+  if (left.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(right.reg(),
+                                          left.constant(),
+                                          needs_number_check());
+  } else if (right.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(left.reg(),
+                                          right.constant(),
+                                          needs_number_check());
+  } else {
+    compiler->EmitEqualityRegRegCompare(left.reg(),
+                                        right.reg(),
+                                        needs_number_check());
+  }
+
+  Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL;
+  branch->EmitBranchOnCondition(compiler, true_condition);
+}
+
+
+void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // The arguments to the stub include the closure, as does the arguments
+  // descriptor.
+  Register temp_reg = locs()->temp(0).reg();
+  int argument_count = ArgumentCount();
+  const Array& arguments_descriptor =
+      Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
+                                                 argument_names()));
+  __ LoadObject(temp_reg, arguments_descriptor);
+  compiler->GenerateDartCall(deopt_id(),
+                             token_pos(),
+                             &StubCode::CallClosureFunctionLabel(),
+                             PcDescriptors::kOther,
+                             locs());
+  __ Drop(argument_count);
+}
+
+
+LocationSummary* BooleanNegateInstr::MakeLocationSummary() const {
+  return LocationSummary::Make(1,
+                               Location::RequiresRegister(),
+                               LocationSummary::kNoCall);
+}
+
+
+void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value = locs()->in(0).reg();
+  Register result = locs()->out().reg();
+
+  Label done;
+  __ LoadObject(result, Bool::True());
+  __ CompareRegisters(result, value);
+  __ j(NOT_EQUAL, &done, Assembler::kNearJump);
+  __ LoadObject(result, Bool::False());
+  __ Bind(&done);
+}
+
+
+LocationSummary* ChainContextInstr::MakeLocationSummary() const {
+  return LocationSummary::Make(1,
+                               Location::NoLocation(),
+                               LocationSummary::kNoCall);
+}
+
+
+void ChainContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register context_value = locs()->in(0).reg();
+
+  // Chain the new context in context_value to its parent in CTX.
+  __ StoreIntoObject(context_value,
+                     FieldAddress(context_value, Context::parent_offset()),
+                     CTX);
+  // Set new context as current context.
+  __ MoveRegister(CTX, context_value);
+}
+
+
+LocationSummary* StoreVMFieldInstr::MakeLocationSummary() const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
+                                              : Location::RequiresRegister());
+  locs->set_in(1, Location::RequiresRegister());
+  return locs;
+}
+
+
+void StoreVMFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value_reg = locs()->in(0).reg();
+  Register dest_reg = locs()->in(1).reg();
+
+  if (value()->NeedsStoreBuffer()) {
+    __ StoreIntoObject(dest_reg, FieldAddress(dest_reg, offset_in_bytes()),
+                       value_reg);
+  } else {
+    __ StoreIntoObjectNoBarrier(
+        dest_reg, FieldAddress(dest_reg, offset_in_bytes()), value_reg);
+  }
+}
+
+
+LocationSummary* AllocateObjectInstr::MakeLocationSummary() const {
+  return MakeCallSummary();
+}
+
+
+void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Class& cls = Class::ZoneHandle(constructor().Owner());
+  const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls));
+  const ExternalLabel label(cls.ToCString(), stub.EntryPoint());
+  compiler->GenerateCall(token_pos(),
+                         &label,
+                         PcDescriptors::kOther,
+                         locs());
+  __ Drop(ArgumentCount());  // Discard arguments.
+}
+
+
+LocationSummary* CreateClosureInstr::MakeLocationSummary() const {
+  return MakeCallSummary();
+}
+
+
+void CreateClosureInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Function& closure_function = function();
+  ASSERT(!closure_function.IsImplicitStaticClosureFunction());
+  const Code& stub = Code::Handle(
+      StubCode::GetAllocationStubForClosure(closure_function));
+  const ExternalLabel label(closure_function.ToCString(), stub.EntryPoint());
+  compiler->GenerateCall(token_pos(),
+                         &label,
+                         PcDescriptors::kOther,
+                         locs());
+  __ Drop(2);  // Discard type arguments and receiver.
+}
+
 }  // namespace dart
 
 #undef __
 
-#endif  // defined TARGET_ARCH_X64
+#endif  // defined TARGET_ARCH_IA32
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
new file mode 100644
index 0000000..5fdbc56
--- /dev/null
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -0,0 +1,725 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"  // Needed here to get TARGET_ARCH_MIPS.
+#if defined(TARGET_ARCH_MIPS)
+
+#include "vm/intermediate_language.h"
+
+#include "lib/error.h"
+#include "vm/dart_entry.h"
+#include "vm/flow_graph_compiler.h"
+#include "vm/locations.h"
+#include "vm/object_store.h"
+#include "vm/parser.h"
+#include "vm/stub_code.h"
+#include "vm/symbols.h"
+
+namespace dart {
+
+DECLARE_FLAG(int, optimization_counter_threshold);
+DECLARE_FLAG(bool, propagate_ic_data);
+
+LocationSummary* Instruction::MakeCallSummary() {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+LocationSummary* PushArgumentInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void PushArgumentInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ReturnInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ClosureCallInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+LocationSummary* LoadLocalInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StoreLocalInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StoreLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ConstantInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* AssertAssignableInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+LocationSummary* AssertBooleanInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void AssertBooleanInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ArgumentDefinitionTestInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ArgumentDefinitionTestInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* EqualityCompareInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void EqualityCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+void EqualityCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                          BranchInstr* branch) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* RelationalOpInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void RelationalOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+void RelationalOpInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                       BranchInstr* branch) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* NativeCallInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StringFromCharCodeInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* LoadIndexedInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StoreIndexedInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StoreInstanceFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* LoadStaticFieldInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* InstanceOfInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CreateArrayInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary*
+AllocateObjectWithBoundsCheckInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void AllocateObjectWithBoundsCheckInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* LoadFieldInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void LoadFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void InstantiateTypeArgumentsInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary*
+ExtractConstructorTypeArgumentsInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ExtractConstructorTypeArgumentsInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary*
+ExtractConstructorInstantiatorInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ExtractConstructorInstantiatorInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* AllocateContextInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CloneContextInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CatchEntryInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CatchEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CheckStackOverflowInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CheckStackOverflowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BinarySmiOpInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BinarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BoxDoubleInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxDoubleInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* MathSqrtInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void MathSqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnarySmiOpInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* SmiToDoubleInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* DoubleToIntegerInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* DoubleToSmiInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* DoubleToDoubleInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BranchInstr::MakeLocationSummary() const {
+  UNREACHABLE();
+  return NULL;
+}
+
+
+void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CheckClassInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CheckSmiInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CheckArrayBoundInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxIntegerInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BoxIntegerInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BinaryMintOpInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BinaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ShiftMintOpInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ShiftMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnaryMintOpInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ThrowInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+
+void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ReThrowInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* GotoInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+void ControlInstruction::EmitBranchOnValue(FlowGraphCompiler* compiler,
+                                           bool value) {
+  UNIMPLEMENTED();
+}
+
+
+void ControlInstruction::EmitBranchOnCondition(FlowGraphCompiler* compiler,
+                                               Condition true_condition) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CurrentContextInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StrictCompareInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                        BranchInstr* branch) {
+  UNIMPLEMENTED();
+}
+
+
+void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BooleanNegateInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ChainContextInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ChainContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StoreVMFieldInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StoreVMFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* AllocateObjectInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CreateClosureInstr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CreateClosureInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_MIPS
+
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 2ac35d3..1a59275 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -8,6 +8,7 @@
 #include "vm/intermediate_language.h"
 
 #include "lib/error.h"
+#include "vm/dart_entry.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
@@ -274,8 +275,8 @@
     const intptr_t kNumTemps =  0;
     LocationSummary* locs =
         new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    locs->set_in(0, Location::RequiresXmmRegister());
-    locs->set_in(1, Location::RequiresXmmRegister());
+    locs->set_in(0, Location::RequiresFpuRegister());
+    locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(Location::RequiresRegister());
     return locs;
   }
@@ -338,7 +339,7 @@
   const Array& kNoArgumentNames = Array::Handle();
   const int kNumArgumentsChecked = 2;
 
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label check_identity;
   __ cmpq(Address(RSP, 0 * kWordSize), raw_null);
@@ -525,7 +526,7 @@
   __ testq(left, Immediate(kSmiTagMask));
   __ j(ZERO, deopt);
   // 'left' is not Smi.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label identity_compare;
   __ cmpq(right, raw_null);
@@ -576,7 +577,7 @@
   ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
   Register left = locs->in(0).reg();
   Register right = locs->in(1).reg();
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label done, identity_compare, non_null_compare;
   __ cmpq(right, raw_null);
@@ -661,8 +662,8 @@
                                    const LocationSummary& locs,
                                    Token::Kind kind,
                                    BranchInstr* branch) {
-  XmmRegister left = locs.in(0).xmm_reg();
-  XmmRegister right = locs.in(1).xmm_reg();
+  XmmRegister left = locs.in(0).fpu_reg();
+  XmmRegister right = locs.in(1).fpu_reg();
 
   Condition true_condition = TokenKindToDoubleCondition(kind);
   if (branch != NULL) {
@@ -764,8 +765,8 @@
   if (operands_class_id() == kDoubleCid) {
     LocationSummary* summary =
         new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    summary->set_in(0, Location::RequiresXmmRegister());
-    summary->set_in(1, Location::RequiresXmmRegister());
+    summary->set_in(0, Location::RequiresFpuRegister());
+    summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(Location::RequiresRegister());
     return summary;
   } else if (operands_class_id() == kSmiCid) {
@@ -930,51 +931,6 @@
 }
 
 
-LocationSummary* StringCharCodeAtInstr::MakeLocationSummary() const {
-  const intptr_t kNumInputs = 2;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, Location::RequiresRegister());
-  locs->set_in(1, CanBeImmediateIndex(index(), class_id())
-                    ? Location::RegisterOrSmiConstant(index())
-                    : Location::RequiresRegister());
-  locs->set_out(Location::RequiresRegister());
-  return locs;
-}
-
-
-void StringCharCodeAtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register str = locs()->in(0).reg();
-  Location index = locs()->in(1);
-  Register result = locs()->out().reg();
-
-  ASSERT((class_id() == kOneByteStringCid) ||
-         (class_id() == kTwoByteStringCid));
-
-  FieldAddress element_address = index.IsRegister() ?
-      FlowGraphCompiler::ElementAddressForRegIndex(
-          class_id(), str, index.reg()) :
-      FlowGraphCompiler::ElementAddressForIntIndex(
-          class_id(), str, Smi::Cast(index.constant()).Value());
-
-  if (class_id() == kOneByteStringCid) {
-    if (index.IsRegister()) {
-      __ SmiUntag(index.reg());
-    }
-    __ movzxb(result, element_address);
-    if (index.IsRegister()) {
-      __ SmiTag(index.reg());  // Retag index.
-    }
-    __ SmiTag(result);
-  } else {
-    // Don't untag smi-index and use TIMES_1 for two byte strings.
-    __ movzxw(result, element_address);
-    __ SmiTag(result);
-  }
-}
-
-
 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
@@ -1005,11 +961,14 @@
   LocationSummary* locs =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
+  // The smi index is either untagged and tagged again at the end of the
+  // operation (element size == 1), or it is left smi tagged (for all element
+  // sizes > 1).
   locs->set_in(1, CanBeImmediateIndex(index(), class_id())
                     ? Location::RegisterOrSmiConstant(index())
                     : Location::RequiresRegister());
   if (representation() == kUnboxedDouble) {
-    locs->set_out(Location::RequiresXmmRegister());
+    locs->set_out(Location::RequiresFpuRegister());
   } else {
     locs->set_out(Location::RequiresRegister());
   }
@@ -1024,8 +983,10 @@
   if (class_id() == kExternalUint8ArrayCid) {
     Register result = locs()->out().reg();
     Address element_address = index.IsRegister()
-        ? Address(result, index.reg(), TIMES_1, 0)
-        : Address(result, Smi::Cast(index.constant()).Value());
+        ? FlowGraphCompiler::ExternalElementAddressForRegIndex(
+            class_id(), result, index.reg())
+        : FlowGraphCompiler::ExternalElementAddressForIntIndex(
+            class_id(), result, Smi::Cast(index.constant()).Value());
     if (index.IsRegister()) {
       __ SmiUntag(index.reg());
     }
@@ -1048,12 +1009,12 @@
           class_id(), array, Smi::Cast(index.constant()).Value());
 
   if (representation() == kUnboxedDouble) {
-    XmmRegister result = locs()->out().xmm_reg();
+    XmmRegister result = locs()->out().fpu_reg();
     if (class_id() == kFloat32ArrayCid) {
       // Load single precision float.
       __ movss(result, element_address);
       // Promote to double.
-      __ cvtss2sd(result, locs()->out().xmm_reg());
+      __ cvtss2sd(result, locs()->out().fpu_reg());
     } else {
       ASSERT(class_id() == kFloat64ArrayCid);
       __ movsd(result, element_address);
@@ -1062,29 +1023,49 @@
   }
 
   Register result = locs()->out().reg();
-  if ((class_id() == kUint8ArrayCid) ||
-      (class_id() == kUint8ClampedArrayCid)) {
-    if (index.IsRegister()) {
-      __ SmiUntag(index.reg());
-    }
-    __ movzxb(result, element_address);
-    __ SmiTag(result);
-    if (index.IsRegister()) {
-      __ SmiTag(index.reg());  // Re-tag.
-    }
-    return;
+  switch (class_id()) {
+    case kInt8ArrayCid:
+    case kUint8ArrayCid:
+    case kUint8ClampedArrayCid:
+    case kOneByteStringCid:
+      if (index.IsRegister()) {
+        __ SmiUntag(index.reg());
+      }
+      if (class_id() == kInt8ArrayCid) {
+        __ movsxb(result, element_address);
+      } else {
+        __ movzxb(result, element_address);
+      }
+      __ SmiTag(result);
+      if (index.IsRegister()) {
+        __ SmiTag(index.reg());  // Re-tag.
+      }
+      break;
+    case kInt16ArrayCid:
+      __ movsxw(result, element_address);
+      __ SmiTag(result);
+      break;
+    case kUint16ArrayCid:
+    case kTwoByteStringCid:
+      __ movzxw(result, element_address);
+      __ SmiTag(result);
+      break;
+    default:
+      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
+      __ movq(result, element_address);
+      break;
   }
-
-  ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
-  __ movq(result, element_address);
 }
 
 
 LocationSummary* StoreIndexedInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 3;
-  const intptr_t numTemps = 0;
+  const intptr_t kNumTemps = 0;
   LocationSummary* locs =
-      new LocationSummary(kNumInputs, numTemps, LocationSummary::kNoCall);
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  // The smi index is either untagged and tagged again at the end of the
+  // operation (element size == 1), or it is left smi tagged (for all element
+  // sizes > 1).
   locs->set_in(0, Location::RequiresRegister());
   locs->set_in(1, CanBeImmediateIndex(index(), class_id())
                     ? Location::RegisterOrSmiConstant(index())
@@ -1095,18 +1076,25 @@
                         ? Location::WritableRegister()
                         : Location::RegisterOrConstant(value()));
       break;
+    case kInt8ArrayCid:
     case kUint8ArrayCid:
+    case kUint8ClampedArrayCid:
       // TODO(fschneider): Add location constraint for byte registers (RAX,
       // RBX, RCX, RDX) instead of using a fixed register.
       locs->set_in(2, Location::FixedRegisterOrSmiConstant(value(), RAX));
       break;
+    case kInt16ArrayCid:
+    case kUint16ArrayCid:
+      // Writable register because the value must be untagged before storing.
+      locs->set_in(2, Location::WritableRegister());
+      break;
     case kFloat32ArrayCid:
       // Need temp register for float-to-double conversion.
-      locs->AddTemp(Location::RequiresXmmRegister());
+      locs->AddTemp(Location::RequiresFpuRegister());
       // Fall through.
     case kFloat64ArrayCid:
       // TODO(srdjan): Support Float64 constants.
-      locs->set_in(2, Location::RequiresXmmRegister());
+      locs->set_in(2, Location::RequiresFpuRegister());
       break;
     default:
       UNREACHABLE();
@@ -1139,6 +1127,7 @@
         __ StoreIntoObjectNoBarrier(array, element_address, value);
       }
       break;
+    case kInt8ArrayCid:
     case kUint8ArrayCid:
       if (index.IsRegister()) {
         __ SmiUntag(index.reg());
@@ -1156,14 +1145,56 @@
         __ SmiTag(index.reg());  // Re-tag.
       }
       break;
+    case kUint8ClampedArrayCid: {
+      if (index.IsRegister()) {
+        __ SmiUntag(index.reg());
+      }
+      if (locs()->in(2).IsConstant()) {
+        const Smi& constant = Smi::Cast(locs()->in(2).constant());
+        intptr_t value = constant.Value();
+        // Clamp to 0x0 or 0xFF respectively.
+        if (value > 0xFF) {
+          value = 0xFF;
+        } else if (value < 0) {
+          value = 0;
+        }
+        __ movb(element_address,
+                Immediate(static_cast<int8_t>(value)));
+      } else {
+        ASSERT(locs()->in(2).reg() == RAX);
+        Label store_value, store_0xff;
+        __ SmiUntag(RAX);
+        __ cmpq(RAX, Immediate(0xFF));
+        __ j(BELOW_EQUAL, &store_value, Assembler::kNearJump);
+        // Clamp to 0x0 or 0xFF respectively.
+        __ j(GREATER, &store_0xff);
+        __ xorq(RAX, RAX);
+        __ jmp(&store_value, Assembler::kNearJump);
+        __ Bind(&store_0xff);
+        __ movq(RAX, Immediate(0xFF));
+        __ Bind(&store_value);
+        __ movb(element_address, RAX);
+      }
+      if (index.IsRegister()) {
+        __ SmiTag(index.reg());  // Re-tag.
+      }
+      break;
+    }
+    case kInt16ArrayCid:
+    case kUint16ArrayCid: {
+        Register value = locs()->in(2).reg();
+        __ SmiUntag(value);
+        __ movw(element_address, value);
+        break;
+      }
     case kFloat32ArrayCid:
       // Convert to single precision.
-      __ cvtsd2ss(locs()->temp(0).xmm_reg(), locs()->in(2).xmm_reg());
+      __ cvtsd2ss(locs()->temp(0).fpu_reg(), locs()->in(2).fpu_reg());
       // Store.
-      __ movss(element_address, locs()->temp(0).xmm_reg());
+      __ movss(element_address, locs()->temp(0).fpu_reg());
       break;
     case kFloat64ArrayCid:
-      __ movsd(element_address, locs()->in(2).xmm_reg());
+      __ movsd(element_address, locs()->in(2).fpu_reg());
       break;
     default:
       UNREACHABLE();
@@ -1368,7 +1399,7 @@
   Label type_arguments_instantiated;
   const intptr_t len = type_arguments().Length();
   if (type_arguments().IsRawInstantiatedRaw(len)) {
-    const Immediate raw_null =
+    const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
     __ cmpq(instantiator_reg, raw_null);
     __ j(EQUAL, &type_arguments_instantiated, Assembler::kNearJump);
@@ -1429,7 +1460,7 @@
   Label type_arguments_instantiated;
   const intptr_t len = type_arguments().Length();
   if (type_arguments().IsRawInstantiatedRaw(len)) {
-    const Immediate raw_null =
+    const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
     __ cmpq(instantiator_reg, raw_null);
     __ j(EQUAL, &type_arguments_instantiated, Assembler::kNearJump);
@@ -1443,7 +1474,7 @@
     Label type_arguments_uninstantiated;
     __ CompareClassId(instantiator_reg, kTypeArgumentsCid);
     __ j(NOT_EQUAL, &type_arguments_uninstantiated, Assembler::kNearJump);
-    Immediate arguments_length =
+    const Immediate& arguments_length =
         Immediate(Smi::RawValue(type_arguments().Length()));
     __ cmpq(FieldAddress(instantiator_reg, TypeArguments::length_offset()),
         arguments_length);
@@ -1483,7 +1514,7 @@
   Label done;
   const intptr_t len = type_arguments().Length();
   if (type_arguments().IsRawInstantiatedRaw(len)) {
-    const Immediate raw_null =
+    const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
     Label instantiator_not_null;
     __ cmpq(instantiator_reg, raw_null);
@@ -1509,7 +1540,7 @@
     // instantiator will have the wrong class (Null instead of TypeArguments).
     __ CompareClassId(instantiator_reg, kTypeArgumentsCid);
     __ j(NOT_EQUAL, &done, Assembler::kNearJump);
-    Immediate arguments_length =
+    const Immediate& arguments_length =
         Immediate(Smi::RawValue(type_arguments().Length()));
     __ cmpq(FieldAddress(instantiator_reg, TypeArguments::length_offset()),
         arguments_length);
@@ -1969,7 +2000,7 @@
       new LocationSummary(kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresXmmRegister());
+  summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(Location::RequiresRegister());
   return summary;
 }
@@ -2012,7 +2043,7 @@
   compiler->AddSlowPathCode(slow_path);
 
   Register out_reg = locs()->out().reg();
-  XmmRegister value = locs()->in(0).xmm_reg();
+  XmmRegister value = locs()->in(0).fpu_reg();
 
   AssemblerMacros::TryAllocate(compiler->assembler(),
                                compiler->double_class(),
@@ -2031,7 +2062,7 @@
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (CanDeoptimize()) summary->set_temp(0, Location::RequiresRegister());
-  summary->set_out(Location::RequiresXmmRegister());
+  summary->set_out(Location::RequiresFpuRegister());
   return summary;
 }
 
@@ -2039,7 +2070,7 @@
 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const intptr_t value_cid = value()->ResultCid();
   const Register value = locs()->in(0).reg();
-  const XmmRegister result = locs()->out().xmm_reg();
+  const XmmRegister result = locs()->out().fpu_reg();
 
   if (value_cid == kDoubleCid) {
     __ movsd(result, FieldAddress(value, Double::value_offset()));
@@ -2049,7 +2080,7 @@
     __ SmiTag(value);  // Restore input register.
   } else {
     Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptBinaryDoubleOp);
-    compiler->LoadDoubleOrSmiToXmm(result,
+    compiler->LoadDoubleOrSmiToFpu(result,
                                    value,
                                    locs()->temp(0).reg(),
                                    deopt);
@@ -2062,18 +2093,18 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* summary =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresXmmRegister());
-  summary->set_in(1, Location::RequiresXmmRegister());
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(Location::SameAsFirstInput());
   return summary;
 }
 
 
 void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  XmmRegister left = locs()->in(0).xmm_reg();
-  XmmRegister right = locs()->in(1).xmm_reg();
+  XmmRegister left = locs()->in(0).fpu_reg();
+  XmmRegister right = locs()->in(1).fpu_reg();
 
-  ASSERT(locs()->out().xmm_reg() == left);
+  ASSERT(locs()->out().fpu_reg() == left);
 
   switch (op_kind()) {
     case Token::kADD: __ addsd(left, right); break;
@@ -2090,14 +2121,14 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* summary =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresXmmRegister());
-  summary->set_out(Location::RequiresXmmRegister());
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(Location::RequiresFpuRegister());
   return summary;
 }
 
 
 void MathSqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ sqrtsd(locs()->out().xmm_reg(), locs()->in(0).xmm_reg());
+  __ sqrtsd(locs()->out().fpu_reg(), locs()->in(0).fpu_reg());
 }
 
 
@@ -2222,7 +2253,7 @@
   const intptr_t kNumTemps = 1;
   LocationSummary* result = new LocationSummary(
       kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  result->set_in(0, Location::RequiresXmmRegister());
+  result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(Location:: Location::RequiresRegister());
   result->set_temp(0, Location::RequiresRegister());
   return result;
@@ -2232,7 +2263,7 @@
 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptDoubleToSmi);
   Register result = locs()->out().reg();
-  XmmRegister value = locs()->in(0).xmm_reg();
+  XmmRegister value = locs()->in(0).fpu_reg();
   Register temp = locs()->temp(0).reg();
 
   __ cvttsd2siq(result, value);
@@ -2252,23 +2283,35 @@
       (recognized_kind() == MethodRecognizer::kDoubleRound) ? 1 : 0;
   LocationSummary* result =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  result->set_in(0, Location::RequiresXmmRegister());
-  result->set_out(Location::RequiresXmmRegister());
+  result->set_in(0, Location::RequiresFpuRegister());
+  result->set_out(Location::RequiresFpuRegister());
   if (recognized_kind() == MethodRecognizer::kDoubleRound) {
-    result->set_temp(0, Location::RequiresXmmRegister());
+    result->set_temp(0, Location::RequiresFpuRegister());
   }
   return result;
 }
 
 
 void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  XmmRegister value = locs()->in(0).xmm_reg();
-  XmmRegister result = locs()->out().xmm_reg();
-  if (recognized_kind() == MethodRecognizer::kDoubleTruncate) {
-    __ roundsd(result, value,  Assembler::kRoundToZero);
-  } else {
-    XmmRegister temp = locs()->temp(0).xmm_reg();
-    __ DoubleRound(result, value, temp);
+  XmmRegister value = locs()->in(0).fpu_reg();
+  XmmRegister result = locs()->out().fpu_reg();
+  switch (recognized_kind()) {
+    case MethodRecognizer::kDoubleTruncate:
+      __ roundsd(result, value,  Assembler::kRoundToZero);
+      break;
+    case MethodRecognizer::kDoubleFloor:
+      __ roundsd(result, value,  Assembler::kRoundDown);
+      break;
+    case MethodRecognizer::kDoubleCeil:
+      __ roundsd(result, value,  Assembler::kRoundUp);
+      break;
+    case MethodRecognizer::kDoubleRound: {
+      XmmRegister temp = locs()->temp(0).fpu_reg();
+      __ DoubleRound(result, value, temp);
+      break;
+    }
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -2287,6 +2330,7 @@
   }
   ASSERT(ic_data().num_args_tested() == 1);
   if (!with_checks()) {
+    ASSERT(ic_data().HasOneTarget());
     const Function& target = Function::ZoneHandle(ic_data().GetTargetAt(0));
     compiler->GenerateStaticCall(instance_call()->deopt_id(),
                                  instance_call()->token_pos(),
@@ -2506,6 +2550,317 @@
   UNIMPLEMENTED();
 }
 
+
+LocationSummary* ThrowInstr::MakeLocationSummary() const {
+  return new LocationSummary(0, 0, LocationSummary::kCall);
+}
+
+
+void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  compiler->GenerateCallRuntime(token_pos(),
+                                kThrowRuntimeEntry,
+                                locs());
+  __ int3();
+}
+
+
+LocationSummary* ReThrowInstr::MakeLocationSummary() const {
+  return new LocationSummary(0, 0, LocationSummary::kCall);
+}
+
+
+void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  compiler->GenerateCallRuntime(token_pos(),
+                                kReThrowRuntimeEntry,
+                                locs());
+  __ int3();
+}
+
+
+LocationSummary* GotoInstr::MakeLocationSummary() const {
+  return new LocationSummary(0, 0, LocationSummary::kNoCall);
+}
+
+
+void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // Add deoptimization descriptor for deoptimizing instructions
+  // that may be inserted before this instruction.
+  if (!compiler->is_optimizing()) {
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+                                   GetDeoptId(),
+                                   0);  // No token position.
+  }
+
+  if (HasParallelMove()) {
+    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
+  }
+
+  // We can fall through if the successor is the next block in the list.
+  // Otherwise, we need a jump.
+  if (!compiler->IsNextBlock(successor())) {
+    __ jmp(compiler->GetBlockLabel(successor()));
+  }
+}
+
+
+static Condition NegateCondition(Condition condition) {
+  switch (condition) {
+    case EQUAL:         return NOT_EQUAL;
+    case NOT_EQUAL:     return EQUAL;
+    case LESS:          return GREATER_EQUAL;
+    case LESS_EQUAL:    return GREATER;
+    case GREATER:       return LESS_EQUAL;
+    case GREATER_EQUAL: return LESS;
+    case BELOW:         return ABOVE_EQUAL;
+    case BELOW_EQUAL:   return ABOVE;
+    case ABOVE:         return BELOW_EQUAL;
+    case ABOVE_EQUAL:   return BELOW;
+    default:
+      OS::Print("Error %d\n", condition);
+      UNIMPLEMENTED();
+      return EQUAL;
+  }
+}
+
+
+void ControlInstruction::EmitBranchOnValue(FlowGraphCompiler* compiler,
+                                           bool value) {
+  if (value && compiler->IsNextBlock(false_successor())) {
+    __ jmp(compiler->GetBlockLabel(true_successor()));
+  } else if (!value && compiler->IsNextBlock(true_successor())) {
+    __ jmp(compiler->GetBlockLabel(false_successor()));
+  }
+}
+
+
+void ControlInstruction::EmitBranchOnCondition(FlowGraphCompiler* compiler,
+                                               Condition true_condition) {
+  if (compiler->IsNextBlock(false_successor())) {
+    // If the next block is the false successor we will fall through to it.
+    __ j(true_condition, compiler->GetBlockLabel(true_successor()));
+  } else {
+    // If the next block is the true successor we negate comparison and fall
+    // through to it.
+    ASSERT(compiler->IsNextBlock(true_successor()));
+    Condition false_condition = NegateCondition(true_condition);
+    __ j(false_condition, compiler->GetBlockLabel(false_successor()));
+  }
+}
+
+
+LocationSummary* CurrentContextInstr::MakeLocationSummary() const {
+  return LocationSummary::Make(0,
+                               Location::RequiresRegister(),
+                               LocationSummary::kNoCall);
+}
+
+
+void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  __ MoveRegister(locs()->out().reg(), CTX);
+}
+
+
+LocationSummary* StrictCompareInstr::MakeLocationSummary() const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::RegisterOrConstant(left()));
+  locs->set_in(1, Location::RegisterOrConstant(right()));
+  locs->set_out(Location::RequiresRegister());
+  return locs;
+}
+
+
+// Special code for numbers (compare values instead of references.)
+void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
+  Location left = locs()->in(0);
+  Location right = locs()->in(1);
+  if (left.IsConstant() && right.IsConstant()) {
+    // TODO(vegorov): should be eliminated earlier by constant propagation.
+    const bool result = (kind() == Token::kEQ_STRICT) ?
+        left.constant().raw() == right.constant().raw() :
+        left.constant().raw() != right.constant().raw();
+    __ LoadObject(locs()->out().reg(), result ? Bool::True() : Bool::False());
+    return;
+  }
+  if (left.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(right.reg(),
+                                          left.constant(),
+                                          needs_number_check());
+  } else if (right.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(left.reg(),
+                                          right.constant(),
+                                          needs_number_check());
+  } else {
+    compiler->EmitEqualityRegRegCompare(left.reg(),
+                                       right.reg(),
+                                       needs_number_check());
+  }
+
+  Register result = locs()->out().reg();
+  Label load_true, done;
+  Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL;
+  __ j(true_condition, &load_true, Assembler::kNearJump);
+  __ LoadObject(result, Bool::False());
+  __ jmp(&done, Assembler::kNearJump);
+  __ Bind(&load_true);
+  __ LoadObject(result, Bool::True());
+  __ Bind(&done);
+}
+
+
+void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                        BranchInstr* branch) {
+  ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
+  Location left = locs()->in(0);
+  Location right = locs()->in(1);
+  if (left.IsConstant() && right.IsConstant()) {
+    // TODO(vegorov): should be eliminated earlier by constant propagation.
+    const bool result = (kind() == Token::kEQ_STRICT) ?
+        left.constant().raw() == right.constant().raw() :
+        left.constant().raw() != right.constant().raw();
+    branch->EmitBranchOnValue(compiler, result);
+    return;
+  }
+  if (left.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(right.reg(),
+                                          left.constant(),
+                                          needs_number_check());
+  } else if (right.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(left.reg(),
+                                          right.constant(),
+                                          needs_number_check());
+  } else {
+    compiler->EmitEqualityRegRegCompare(left.reg(),
+                                        right.reg(),
+                                        needs_number_check());
+  }
+
+  Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL;
+  branch->EmitBranchOnCondition(compiler, true_condition);
+}
+
+
+void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // The arguments to the stub include the closure, as does the arguments
+  // descriptor.
+  Register temp_reg = locs()->temp(0).reg();
+  int argument_count = ArgumentCount();
+  const Array& arguments_descriptor =
+      Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
+                                                 argument_names()));
+  __ LoadObject(temp_reg, arguments_descriptor);
+  compiler->GenerateDartCall(deopt_id(),
+                             token_pos(),
+                             &StubCode::CallClosureFunctionLabel(),
+                             PcDescriptors::kOther,
+                             locs());
+  __ Drop(argument_count);
+}
+
+
+LocationSummary* BooleanNegateInstr::MakeLocationSummary() const {
+  return LocationSummary::Make(1,
+                               Location::RequiresRegister(),
+                               LocationSummary::kNoCall);
+}
+
+
+void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value = locs()->in(0).reg();
+  Register result = locs()->out().reg();
+
+  Label done;
+  __ LoadObject(result, Bool::True());
+  __ CompareRegisters(result, value);
+  __ j(NOT_EQUAL, &done, Assembler::kNearJump);
+  __ LoadObject(result, Bool::False());
+  __ Bind(&done);
+}
+
+
+LocationSummary* ChainContextInstr::MakeLocationSummary() const {
+  return LocationSummary::Make(1,
+                               Location::NoLocation(),
+                               LocationSummary::kNoCall);
+}
+
+
+void ChainContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register context_value = locs()->in(0).reg();
+
+  // Chain the new context in context_value to its parent in CTX.
+  __ StoreIntoObject(context_value,
+                     FieldAddress(context_value, Context::parent_offset()),
+                     CTX);
+  // Set new context as current context.
+  __ MoveRegister(CTX, context_value);
+}
+
+
+LocationSummary* StoreVMFieldInstr::MakeLocationSummary() const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
+                                              : Location::RequiresRegister());
+  locs->set_in(1, Location::RequiresRegister());
+  return locs;
+}
+
+
+void StoreVMFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value_reg = locs()->in(0).reg();
+  Register dest_reg = locs()->in(1).reg();
+
+  if (value()->NeedsStoreBuffer()) {
+    __ StoreIntoObject(dest_reg, FieldAddress(dest_reg, offset_in_bytes()),
+                       value_reg);
+  } else {
+    __ StoreIntoObjectNoBarrier(
+        dest_reg, FieldAddress(dest_reg, offset_in_bytes()), value_reg);
+  }
+}
+
+
+LocationSummary* AllocateObjectInstr::MakeLocationSummary() const {
+  return MakeCallSummary();
+}
+
+
+void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Class& cls = Class::ZoneHandle(constructor().Owner());
+  const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls));
+  const ExternalLabel label(cls.ToCString(), stub.EntryPoint());
+  compiler->GenerateCall(token_pos(),
+                         &label,
+                         PcDescriptors::kOther,
+                         locs());
+  __ Drop(ArgumentCount());  // Discard arguments.
+}
+
+
+LocationSummary* CreateClosureInstr::MakeLocationSummary() const {
+  return MakeCallSummary();
+}
+
+
+void CreateClosureInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Function& closure_function = function();
+  ASSERT(!closure_function.IsImplicitStaticClosureFunction());
+  const Code& stub = Code::Handle(
+      StubCode::GetAllocationStubForClosure(closure_function));
+  const ExternalLabel label(closure_function.ToCString(), stub.EntryPoint());
+  compiler->GenerateCall(token_pos(),
+                         &label,
+                         PcDescriptors::kOther,
+                         locs());
+  __ Drop(2);  // Discard type arguments and receiver.
+}
+
 }  // namespace dart
 
 #undef __
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 05b7116..de3defe 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -74,12 +74,97 @@
 }
 
 
+bool Intrinsifier::GrowableArray_add(Assembler* assembler) {
+  return false;
+}
+
+
 bool Intrinsifier::ByteArrayBase_getLength(Assembler* assembler) {
   return false;
 }
 
 
-bool Intrinsifier::ByteArrayBase_getIndexed(Assembler* assembler) {
+bool Intrinsifier::Int8Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Int8Array_setIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Uint8Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Uint8Array_setIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::UintClamped8Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Uint8ClampedArray_setIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Int16Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Uint16Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Int32Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Uint32Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Int64Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Uint64Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Float32Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Float32Array_setIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Float64Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Float64Array_setIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::ExternalUint8Array_getIndexed(Assembler* assembler) {
   return false;
 }
 
@@ -104,7 +189,6 @@
 }
 
 
-
 bool Intrinsifier::Integer_mulFromInteger(Assembler* assembler) {
   return false;
 }
@@ -165,12 +249,12 @@
 }
 
 
-bool Intrinsifier::Integer_lessThan(Assembler* assembler) {
+bool Intrinsifier::Integer_greaterThanFromInt(Assembler* assembler) {
   return false;
 }
 
 
-bool Intrinsifier::Integer_greaterThanFromInt(Assembler* assembler) {
+bool Intrinsifier::Integer_lessThan(Assembler* assembler) {
   return false;
 }
 
@@ -275,6 +359,11 @@
 }
 
 
+bool Intrinsifier::Double_toInt(Assembler* assembler) {
+  return false;
+}
+
+
 bool Intrinsifier::Math_sqrt(Assembler* assembler) {
   return false;
 }
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index 3022eab..29b1477 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
@@ -46,7 +46,7 @@
   __ cmpl(EDI, Immediate(0));
   __ j(LESS, &fall_through);
   // Check for maximum allowed length.
-  const Immediate max_len =
+  const Immediate& max_len =
       Immediate(reinterpret_cast<int32_t>(Smi::New(Array::kMaxElements)));
   __ cmpl(EDI, max_len);
   __ j(GREATER, &fall_through);
@@ -117,7 +117,7 @@
   // EBX: new object end address.
   // EDI: iterator which initially points to the start of the variable
   // data area to be initialized.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ leal(EDI, FieldAddress(EAX, sizeof(RawArray)));
   Label done;
@@ -194,7 +194,7 @@
     const intptr_t type_args_field_offset =
         ComputeObjectArrayTypeArgumentsOffset();
     // Inline simple tests (Smi, null), fallthrough if not positive.
-    const Immediate raw_null =
+    const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
     Label checked_ok;
     __ movl(EDI, Address(ESP, + 1 * kWordSize));  // Value.
@@ -441,7 +441,8 @@
   // Compare length with capacity.
   __ cmpl(EBX, FieldAddress(EDI, Array::length_offset()));
   __ j(EQUAL, &fall_through, Assembler::kNearJump);  // Must grow data.
-  const Immediate value_one = Immediate(reinterpret_cast<int32_t>(Smi::New(1)));
+  const Immediate& value_one =
+      Immediate(reinterpret_cast<int32_t>(Smi::New(1)));
   // len = len + 1;
   __ addl(FieldAddress(EAX, GrowableObjectArray::length_offset()), value_one);
   __ movl(EAX, Address(ESP, + 1 * kWordSize));  // Value
@@ -449,7 +450,7 @@
   __ StoreIntoObject(EDI,
                      FieldAddress(EDI, EBX, TIMES_2, Array::data_offset()),
                      EAX);
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<int32_t>(Object::null()));
   __ movl(EAX, raw_null);
   __ ret();
@@ -1255,7 +1256,7 @@
   Label fall_through, shift_count_ok;
   TestBothArgumentsSmis(assembler, &fall_through);
   // Can destroy ECX since we are not falling through.
-  Immediate count_limit = Immediate(0x1F);
+  const Immediate& count_limit = Immediate(0x1F);
   // Check that the count is not larger than what the hardware can handle.
   // For shifting right a Smi the result is the same for all numbers
   // >= count_limit.
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
new file mode 100644
index 0000000..bd4d751
--- /dev/null
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -0,0 +1,408 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"  // Needed here to get TARGET_ARCH_MIPS.
+#if defined(TARGET_ARCH_MIPS)
+
+#include "vm/intrinsifier.h"
+
+namespace dart {
+
+bool Intrinsifier::ObjectArray_Allocate(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Array_getLength(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::ImmutableArray_getLength(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::ImmutableArray_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Array_setIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::GArray_Allocate(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::GrowableArray_getLength(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::GrowableArray_getCapacity(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::GrowableArray_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::GrowableArray_setIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::GrowableArray_setLength(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::GrowableArray_setData(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::GrowableArray_add(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::ByteArrayBase_getLength(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Int8Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Int8Array_setIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Uint8Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Uint8Array_setIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::UintClamped8Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Uint8ClampedArray_setIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Int16Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Uint16Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Int32Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Uint32Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Int64Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Uint64Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Float32Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Float32Array_setIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Float64Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Float64Array_setIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::ExternalUint8Array_getIndexed(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_addFromInteger(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_add(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_subFromInteger(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_sub(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_mulFromInteger(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_mul(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_modulo(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_truncDivide(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_negate(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_bitAndFromInteger(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_bitAnd(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_bitOrFromInteger(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_bitOr(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_bitXorFromInteger(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_bitXor(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_shl(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_greaterThanFromInt(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_lessThan(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_greaterThan(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_lessEqualThan(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_greaterEqualThan(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_equal(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Integer_sar(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Smi_bitNegate(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Double_greaterThan(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Double_greaterEqualThan(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Double_lessThan(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Double_equal(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Double_lessEqualThan(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Double_add(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Double_mul(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Double_sub(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Double_div(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Double_fromInteger(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Double_getIsNaN(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Double_getIsNegative(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Double_toInt(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Math_sqrt(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Math_sin(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Math_cos(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::Object_equal(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::String_getHashCode(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::String_getLength(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::String_charCodeAt(Assembler* assembler) {
+  return false;
+}
+
+
+bool Intrinsifier::String_getIsEmpty(Assembler* assembler) {
+  return false;
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index 2460256..855a316 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -45,7 +45,7 @@
   __ cmpq(RDI, Immediate(0));
   __ j(LESS, &fall_through);
   // Check for maximum allowed length.
-  const Immediate max_len =
+  const Immediate& max_len =
       Immediate(reinterpret_cast<int64_t>(Smi::New(Array::kMaxElements)));
   __ cmpq(RDI, max_len);
   __ j(GREATER, &fall_through);
@@ -117,7 +117,7 @@
   // RCX: new object end address.
   // RDI: iterator which initially points to the start of the variable
   // data area to be initialized.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ leaq(RDI, FieldAddress(RAX, sizeof(RawArray)));
   Label done;
@@ -394,7 +394,8 @@
   // Compare length with capacity.
   __ cmpq(RCX, FieldAddress(RDX, Array::length_offset()));
   __ j(EQUAL, &fall_through, Assembler::kNearJump);  // Must grow data.
-  const Immediate value_one = Immediate(reinterpret_cast<int64_t>(Smi::New(1)));
+  const Immediate& value_one =
+      Immediate(reinterpret_cast<int64_t>(Smi::New(1)));
   // len = len + 1;
   __ addq(FieldAddress(RAX, GrowableObjectArray::length_offset()), value_one);
   __ movq(RAX, Address(RSP, + 1 * kWordSize));  // Value
@@ -402,7 +403,7 @@
   __ StoreIntoObject(RDX,
                      FieldAddress(RDX, RCX, TIMES_4, Array::data_offset()),
                      RAX);
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<int64_t>(Object::null()));
   __ movq(RAX, raw_null);
   __ ret();
@@ -1133,7 +1134,7 @@
 bool Intrinsifier::Integer_sar(Assembler* assembler) {
   Label fall_through, shift_count_ok;
   TestBothArgumentsSmis(assembler, &fall_through);
-  Immediate count_limit = Immediate(0x3F);
+  const Immediate& count_limit = Immediate(0x3F);
   // Check that the count is not larger than what the hardware can handle.
   // For shifting right a Smi the result is the same for all numbers
   // >= count_limit.
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index f76e292..72aa5cd 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -282,7 +282,7 @@
       gc_prologue_callbacks_(),
       gc_epilogue_callbacks_(),
       deopt_cpu_registers_copy_(NULL),
-      deopt_xmm_registers_copy_(NULL),
+      deopt_fpu_registers_copy_(NULL),
       deopt_frame_copy_(NULL),
       deopt_frame_copy_size_(0),
       deferred_doubles_(NULL),
@@ -432,7 +432,7 @@
     return &ICData::ZoneHandle();
   }
   ICData& ic_data_handle = ICData::ZoneHandle();
-  ic_data_handle ^= array_handle.At(deopt_id);
+  ic_data_handle |= array_handle.At(deopt_id);
   return &ic_data_handle;
 }
 
@@ -457,7 +457,7 @@
   const int func_len = class_functions.IsNull() ? 0 : class_functions.Length();
   for (int j = 0; j < func_len; j++) {
     Function& function = Function::Handle();
-    function ^= class_functions.At(j);
+    function |= class_functions.At(j);
     if (function.usage_counter() > 0) {
       functions->Add(&function);
     }
@@ -474,7 +474,7 @@
   Library& library = Library::Handle();
   GrowableArray<const Function*> invoked_functions;
   for (int i = 0; i < libraries.Length(); i++) {
-    library ^= libraries.At(i);
+    library |= libraries.At(i);
     Class& cls = Class::Handle();
     ClassDictionaryIterator iter(library);
     while (iter.HasNext()) {
@@ -483,7 +483,7 @@
     }
     Array& anon_classes = Array::Handle(library.raw_ptr()->anonymous_classes_);
     for (int i = 0; i < library.raw_ptr()->num_anonymous_; i++) {
-      cls ^= anon_classes.At(i);
+      cls |= anon_classes.At(i);
       AddFunctionsFromClass(cls, &invoked_functions);
     }
   }
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 597ecea..f79bd4f 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -300,12 +300,12 @@
     ASSERT((value == NULL) || (deopt_cpu_registers_copy_ == NULL));
     deopt_cpu_registers_copy_ = value;
   }
-  double* deopt_xmm_registers_copy() const {
-    return deopt_xmm_registers_copy_;
+  double* deopt_fpu_registers_copy() const {
+    return deopt_fpu_registers_copy_;
   }
-  void set_deopt_xmm_registers_copy(double* value) {
-    ASSERT((value == NULL) || (deopt_xmm_registers_copy_ == NULL));
-    deopt_xmm_registers_copy_ = value;
+  void set_deopt_fpu_registers_copy(double* value) {
+    ASSERT((value == NULL) || (deopt_fpu_registers_copy_ == NULL));
+    deopt_fpu_registers_copy_ = value;
   }
   intptr_t* deopt_frame_copy() const { return deopt_frame_copy_; }
   void SetDeoptFrameCopy(intptr_t* value, intptr_t size) {
@@ -378,7 +378,7 @@
 
   // Deoptimization support.
   intptr_t* deopt_cpu_registers_copy_;
-  double* deopt_xmm_registers_copy_;
+  double* deopt_fpu_registers_copy_;
   intptr_t* deopt_frame_copy_;
   intptr_t deopt_frame_copy_size_;
   DeferredDouble* deferred_doubles_;
diff --git a/runtime/vm/locations.cc b/runtime/vm/locations.cc
index 21f8423..49db8ae 100644
--- a/runtime/vm/locations.cc
+++ b/runtime/vm/locations.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -103,7 +103,7 @@
   switch (kind()) {
     case kInvalid: return "?";
     case kRegister: return Assembler::RegisterName(reg());
-    case kXmmRegister: return Assembler::XmmRegisterName(xmm_reg());
+    case kFpuRegister: return Assembler::FpuRegisterName(fpu_reg());
     case kStackSlot: return "S";
     case kDoubleStackSlot: return "DS";
     case kUnallocated:
@@ -114,7 +114,7 @@
           return "P";
         case kRequiresRegister:
           return "R";
-        case kRequiresXmmRegister:
+        case kRequiresFpuRegister:
           return "DR";
         case kWritableRegister:
           return "WR";
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index 8ab272f..fcd9c81 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -63,15 +63,22 @@
     // register code.
     kRegister = 6,
 
-    // XmmRegister location represents a fixed xmm register.  Payload contains
+    // FpuRegister location represents a fixed fpu register.  Payload contains
     // its code.
-    kXmmRegister = 7,
+    kFpuRegister = 7,
   };
 
   Location() : value_(kInvalidLocation) {
     ASSERT(IsInvalid());
   }
 
+  Location(const Location& other) : ValueObject(), value_(other.value_) { }
+
+  Location& operator=(const Location& other) {
+    value_ = other.value_;
+    return *this;
+  }
+
   bool IsInvalid() const {
     return value_ == kInvalidLocation;
   }
@@ -98,7 +105,7 @@
     kAny,
     kPrefersRegister,
     kRequiresRegister,
-    kRequiresXmmRegister,
+    kRequiresFpuRegister,
     kWritableRegister,
     kSameAsFirstInput,
   };
@@ -128,8 +135,8 @@
     return UnallocatedLocation(kRequiresRegister);
   }
 
-  static Location RequiresXmmRegister() {
-    return UnallocatedLocation(kRequiresXmmRegister);
+  static Location RequiresFpuRegister() {
+    return UnallocatedLocation(kRequiresFpuRegister);
   }
 
   static Location WritableRegister() {
@@ -169,7 +176,7 @@
     return RegisterField::decode(payload());
   }
 
-  // XMM registers and double spill slots can contain either doubles
+  // FPU registers and double spill slots can contain either doubles
   // or 64-bit integers.
   enum Representation {
     kDouble,
@@ -177,24 +184,24 @@
   };
 
   Representation representation() const {
-    ASSERT(IsXmmRegister() || IsDoubleStackSlot());
+    ASSERT(IsFpuRegister() || IsDoubleStackSlot());
     return RepresentationField::decode(payload());
   }
 
-  // XmmRegister locations.
-  static Location XmmRegisterLocation(XmmRegister reg, Representation rep) {
+  // FpuRegister locations.
+  static Location FpuRegisterLocation(FpuRegister reg, Representation rep) {
     uword payload =
-        XmmRegisterField::encode(reg) | RepresentationField::encode(rep);
-    return Location(kXmmRegister, payload);
+        FpuRegisterField::encode(reg) | RepresentationField::encode(rep);
+    return Location(kFpuRegister, payload);
   }
 
-  bool IsXmmRegister() const {
-    return kind() == kXmmRegister;
+  bool IsFpuRegister() const {
+    return kind() == kFpuRegister;
   }
 
-  XmmRegister xmm_reg() const {
-    ASSERT(IsXmmRegister());
-    return XmmRegisterField::decode(payload());
+  FpuRegister fpu_reg() const {
+    ASSERT(IsFpuRegister());
+    return FpuRegisterField::decode(payload());
   }
 
   static bool IsMachineRegisterKind(Kind kind) {
@@ -207,8 +214,8 @@
     if (kind == kRegister) {
       return RegisterLocation(static_cast<Register>(reg));
     } else {
-      ASSERT(kind == kXmmRegister);
-      return XmmRegisterLocation(static_cast<XmmRegister>(reg), rep);
+      ASSERT(kind == kFpuRegister);
+      return FpuRegisterLocation(static_cast<FpuRegister>(reg), rep);
     }
   }
 
@@ -304,7 +311,7 @@
   typedef BitField<Policy, 0, 3> PolicyField;
 
   // Layout for register locations payload. The representation bit is only used
-  // for XmmRegister and unused for Register.
+  // for FpuRegister and unused for Register.
   static const intptr_t kBitsForRepresentation = 1;
   static const intptr_t kBitsForRegister =
       kBitsForPayload - kBitsForRepresentation;
@@ -314,9 +321,9 @@
   typedef BitField<Register,
                    kBitsForRepresentation,
                    kBitsForRegister> RegisterField;
-  typedef BitField<XmmRegister,
+  typedef BitField<FpuRegister,
                    kBitsForRepresentation,
-                   kBitsForRegister> XmmRegisterField;
+                   kBitsForRegister> FpuRegisterField;
 
   // Layout for stack slots. The representation bit is only used for
   // DoubleStackSlot and unused for StackSlot.
@@ -337,25 +344,25 @@
 
 class RegisterSet : public ValueObject {
  public:
-  RegisterSet() : cpu_registers_(0), xmm_registers_(0) {
+  RegisterSet() : cpu_registers_(0), fpu_registers_(0) {
     ASSERT(kNumberOfCpuRegisters < (kWordSize * kBitsPerByte));
-    ASSERT(kNumberOfXmmRegisters < (kWordSize * kBitsPerByte));
+    ASSERT(kNumberOfFpuRegisters < (kWordSize * kBitsPerByte));
   }
 
 
   void Add(Location loc) {
     if (loc.IsRegister()) {
       cpu_registers_ |= (1 << loc.reg());
-    } else if (loc.IsXmmRegister()) {
-      xmm_registers_ |= (1 << loc.xmm_reg());
+    } else if (loc.IsFpuRegister()) {
+      fpu_registers_ |= (1 << loc.fpu_reg());
     }
   }
 
   void Remove(Location loc) {
     if (loc.IsRegister()) {
       cpu_registers_ &= ~(1 << loc.reg());
-    } else if (loc.IsXmmRegister()) {
-      xmm_registers_ &= ~(1 << loc.xmm_reg());
+    } else if (loc.IsFpuRegister()) {
+      fpu_registers_ &= ~(1 << loc.fpu_reg());
     }
   }
 
@@ -363,14 +370,14 @@
     return (cpu_registers_ & (1 << reg)) != 0;
   }
 
-  bool ContainsXmmRegister(XmmRegister xmm_reg) {
-    return (xmm_registers_ & (1 << xmm_reg)) != 0;
+  bool ContainsFpuRegister(FpuRegister fpu_reg) {
+    return (fpu_registers_ & (1 << fpu_reg)) != 0;
   }
 
-  intptr_t xmm_regs_count() {
+  intptr_t fpu_regs_count() {
     intptr_t count = 0;
-    for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; reg_idx++) {
-      if (ContainsXmmRegister(static_cast<XmmRegister>(reg_idx))) {
+    for (intptr_t reg_idx = 0; reg_idx < kNumberOfFpuRegisters; reg_idx++) {
+      if (ContainsFpuRegister(static_cast<FpuRegister>(reg_idx))) {
         count++;
       }
     }
@@ -379,7 +386,7 @@
 
  private:
   intptr_t cpu_registers_;
-  intptr_t xmm_registers_;
+  intptr_t fpu_registers_;
 
   DISALLOW_COPY_AND_ASSIGN(RegisterSet);
 };
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 40fc1b7..c53878b 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -515,9 +515,8 @@
 
 // Make unused space in an object whose type has been transformed safe
 // for traversing during GC.
-// The unused part of the transformed object is marked as an Array
-// object or a regular Object so that it can be traversed during garbage
-// collection.
+// The unused part of the transformed object is marked as an Int8Array
+// object.
 void Object::MakeUnusedSpaceTraversable(const Object& obj,
                                         intptr_t original_size,
                                         intptr_t used_size) {
@@ -528,29 +527,17 @@
     intptr_t leftover_size = original_size - used_size;
 
     uword addr = RawObject::ToAddr(obj.raw()) + used_size;
-    if (leftover_size >= Array::InstanceSize(0)) {
-      // As we have enough space to use an array object, update the leftover
-      // space as an Array object.
-      RawArray* raw = reinterpret_cast<RawArray*>(RawObject::FromAddr(addr));
-      uword tags = 0;
-      tags = RawObject::SizeTag::update(leftover_size, tags);
-      tags = RawObject::ClassIdTag::update(kArrayCid, tags);
-      raw->ptr()->tags_ = tags;
-      intptr_t leftover_len =
-          ((leftover_size - Array::InstanceSize(0)) / kWordSize);
-      ASSERT(Array::InstanceSize(leftover_len) == leftover_size);
-      raw->ptr()->tags_ = tags;
-      raw->ptr()->length_ = Smi::New(leftover_len);
-    } else {
-      // Update the leftover space as a basic object.
-      ASSERT(leftover_size == Object::InstanceSize());
-      RawObject* raw =
-          reinterpret_cast<RawObject*>(RawObject::FromAddr(addr));
-      uword tags = 0;
-      tags = RawObject::SizeTag::update(leftover_size, tags);
-      tags = RawObject::ClassIdTag::update(kInstanceCid, tags);
-      raw->ptr()->tags_ = tags;
-    }
+    ASSERT(Int8Array::InstanceSize(0) == Object::InstanceSize());
+    // Update the leftover space as an Int8Array object.
+    RawInt8Array* raw =
+        reinterpret_cast<RawInt8Array*>(RawObject::FromAddr(addr));
+    uword tags = 0;
+    tags = RawObject::SizeTag::update(leftover_size, tags);
+    tags = RawObject::ClassIdTag::update(kInt8ArrayCid, tags);
+    raw->ptr()->tags_ = tags;
+    intptr_t leftover_len = (leftover_size - Int8Array::InstanceSize(0));
+    ASSERT(Int8Array::InstanceSize(leftover_len) == leftover_size);
+    raw->ptr()->length_ = Smi::New(leftover_len);
   }
 }
 
@@ -968,6 +955,15 @@
   if (!error.IsNull()) {
     return error.raw();
   }
+  const Script& collection_dev_script =
+      Script::Handle(Bootstrap::LoadCollectionDevScript(false));
+  const Library& collection_dev_lib =
+      Library::Handle(Library::CollectionDevLibrary());
+  ASSERT(!collection_dev_lib.IsNull());
+  error = Bootstrap::Compile(collection_dev_lib, collection_dev_script);
+  if (!error.IsNull()) {
+    return error.raw();
+  }
   const Script& math_script = Script::Handle(Bootstrap::LoadMathScript(false));
   const Library& math_lib = Library::Handle(Library::MathLibrary());
   ASSERT(!math_lib.IsNull());
@@ -1200,6 +1196,32 @@
 }
 
 
+void Object::CheckHandle() const {
+#if defined(DEBUG)
+  if (raw_ != Object::null()) {
+    if ((reinterpret_cast<uword>(raw_) & kSmiTagMask) == kSmiTag) {
+      ASSERT(vtable() == Smi::handle_vtable_);
+      return;
+    }
+    intptr_t cid = raw_->GetClassId();
+    if (cid >= kNumPredefinedCids) {
+      cid = kInstanceCid;
+    }
+    ASSERT(vtable() == builtin_vtables_[cid]);
+    Isolate* isolate = Isolate::Current();
+    if (FLAG_verify_handles) {
+      Heap* isolate_heap = isolate->heap();
+      Heap* vm_isolate_heap = Dart::vm_isolate()->heap();
+      ASSERT(isolate_heap->Contains(RawObject::ToAddr(raw_)) ||
+             vm_isolate_heap->Contains(RawObject::ToAddr(raw_)));
+    }
+    ASSERT(builtin_vtables_[cid] ==
+           isolate->class_table()->At(cid)->ptr()->handle_vtable_);
+  }
+#endif
+}
+
+
 RawObject* Object::Allocate(intptr_t cls_id,
                             intptr_t size,
                             Heap::Space space) {
@@ -1428,7 +1450,7 @@
   const Array& field_array = Array::Handle(fields());
   Field& field = Field::Handle();
   for (intptr_t i = 0; i < field_array.Length(); ++i) {
-    field ^= field_array.At(i);
+    field |= field_array.At(i);
     if (!field.is_static()) {
       return true;
     }
@@ -1436,6 +1458,7 @@
   return false;
 }
 
+
 void Class::SetFunctions(const Array& value) const {
   ASSERT(!value.IsNull());
 #if defined(DEBUG)
@@ -1443,7 +1466,7 @@
   Function& func = Function::Handle();
   intptr_t len = value.Length();
   for (intptr_t i = 0; i < len; i++) {
-    func ^= value.At(i);
+    func |= value.At(i);
     ASSERT(func.Owner() == raw());
   }
 #endif
@@ -1451,6 +1474,14 @@
 }
 
 
+void Class::AddFunction(const Function& function) const {
+  const Array& arr = Array::Handle(functions());
+  const Array& new_arr = Array::Handle(Array::Grow(arr, arr.Length() + 1));
+  new_arr.SetAt(arr.Length(), function);
+  SetFunctions(new_arr);
+}
+
+
 void Class::AddClosureFunction(const Function& function) const {
   GrowableObjectArray& closures =
       GrowableObjectArray::Handle(raw_ptr()->closure_functions_);
@@ -1475,7 +1506,7 @@
   intptr_t best_fit_token_pos = -1;
   intptr_t best_fit_index = -1;
   for (intptr_t i = 0; i < num_closures; i++) {
-    closure ^= closures.At(i);
+    closure |= closures.At(i);
     ASSERT(!closure.IsNull());
     if ((closure.token_pos() <= token_pos) &&
         (token_pos < closure.end_token_pos()) &&
@@ -1486,7 +1517,7 @@
   }
   closure = Function::null();
   if (best_fit_index >= 0) {
-    closure ^= closures.At(best_fit_index);
+    closure |= closures.At(best_fit_index);
   }
   return closure.raw();
 }
@@ -1643,7 +1674,7 @@
   Field& field = Field::Handle();
   intptr_t len = flds.Length();
   for (intptr_t i = 0; i < len; i++) {
-    field ^= flds.At(i);
+    field |= flds.At(i);
     // Offset is computed only for instance fields.
     if (!field.is_static()) {
       ASSERT(field.Offset() == 0);
@@ -1699,7 +1730,7 @@
   const GrowableObjectArray& new_functions = GrowableObjectArray::Handle(
       GrowableObjectArray::New(orig_len));
   for (intptr_t i = 0; i < orig_len; i++) {
-    orig_func ^= orig_list.At(i);
+    orig_func |= orig_list.At(i);
     member_name = orig_func.name();
     func = patch.LookupFunction(member_name);
     if (func.IsNull()) {
@@ -1714,7 +1745,7 @@
     }
   }
   for (intptr_t i = 0; i < patch_len; i++) {
-    func ^= patch_list.At(i);
+    func |= patch_list.At(i);
     func.set_owner(patch_class);
     new_functions.Add(func);
   }
@@ -1732,7 +1763,7 @@
   Field& orig_field = Field::Handle();
   new_list = Array::New(patch_len + orig_len);
   for (intptr_t i = 0; i < patch_len; i++) {
-    field ^= patch_list.At(i);
+    field |= patch_list.At(i);
     field.set_owner(*this);
     member_name = field.name();
     // TODO(iposva): Verify non-public fields only.
@@ -1745,7 +1776,7 @@
     new_list.SetAt(i, field);
   }
   for (intptr_t i = 0; i < orig_len; i++) {
-    field ^= orig_list.At(i);
+    field |= orig_list.At(i);
     new_list.SetAt(patch_len + i, field);
   }
   SetFields(new_list);
@@ -1760,7 +1791,7 @@
   Field& field = Field::Handle();
   intptr_t len = value.Length();
   for (intptr_t i = 0; i < len; i++) {
-    field ^= value.At(i);
+    field |= value.At(i);
     ASSERT(field.owner() == raw());
   }
 #endif
@@ -2204,6 +2235,16 @@
 }
 
 
+RawFunction* Class::LookupDynamicFunctionAllowPrivate(
+    const String& name) const {
+  Function& function = Function::Handle(LookupFunctionAllowPrivate(name));
+  if (function.IsNull() || !function.IsDynamicFunction()) {
+    return Function::null();
+  }
+  return function.raw();
+}
+
+
 RawFunction* Class::LookupStaticFunction(const String& name) const {
   Function& function = Function::Handle(LookupFunction(name));
   if (function.IsNull() || !function.IsStaticFunction()) {
@@ -2213,6 +2254,15 @@
 }
 
 
+RawFunction* Class::LookupStaticFunctionAllowPrivate(const String& name) const {
+  Function& function = Function::Handle(LookupFunctionAllowPrivate(name));
+  if (function.IsNull() || !function.IsStaticFunction()) {
+    return Function::null();
+  }
+  return function.raw();
+}
+
+
 RawFunction* Class::LookupConstructor(const String& name) const {
   Function& function = Function::Handle(LookupFunction(name));
   if (function.IsNull() || !function.IsConstructor()) {
@@ -2233,6 +2283,7 @@
 }
 
 
+// Returns true if 'prefix' and 'accessor_name' match 'name'.
 static bool MatchesAccessorName(const String& name,
                                 const char* prefix,
                                 intptr_t prefix_length,
@@ -2266,16 +2317,49 @@
     return Function::null();
   }
   Function& function = Function::Handle(isolate, Function::null());
+  const intptr_t len = funcs.Length();
+  if (name.IsSymbol()) {
+    // Quick Symbol compare.
+    NoGCScope no_gc;
+    for (intptr_t i = 0; i < len; i++) {
+      function |= funcs.At(i);
+      if (function.name() == name.raw()) {
+        return function.raw();
+      }
+    }
+  } else {
+    String& function_name = String::Handle(isolate, String::null());
+    for (intptr_t i = 0; i < len; i++) {
+      function |= funcs.At(i);
+      function_name |= function.name();
+      if (function_name.Equals(name)) {
+        return function.raw();
+      }
+    }
+  }
+  // No function found.
+  return Function::null();
+}
+
+
+RawFunction* Class::LookupFunctionAllowPrivate(const String& name) const {
+  Isolate* isolate = Isolate::Current();
+  ASSERT(name.IsOneByteString());
+  Array& funcs = Array::Handle(isolate, functions());
+  if (funcs.IsNull()) {
+    // This can occur, e.g., for Null classes.
+    return Function::null();
+  }
+  Function& function = Function::Handle(isolate, Function::null());
   String& function_name = String::Handle(isolate, String::null());
   intptr_t len = funcs.Length();
   for (intptr_t i = 0; i < len; i++) {
-    function ^= funcs.At(i);
-    function_name ^= function.name();
+    function |= funcs.At(i);
+    function_name |= function.name();
     if (OneByteString::EqualsIgnoringPrivateKey(function_name, name)) {
       return function.raw();
     }
   }
-
   // No function found.
   return Function::null();
 }
@@ -2300,8 +2384,8 @@
   String& function_name = String::Handle(isolate, String::null());
   intptr_t len = funcs.Length();
   for (intptr_t i = 0; i < len; i++) {
-    function ^= funcs.At(i);
-    function_name ^= function.name();
+    function |= funcs.At(i);
+    function_name |= function.name();
     if (MatchesAccessorName(function_name, prefix, prefix_length, name)) {
       return function.raw();
     }
@@ -2323,7 +2407,7 @@
   Array& funcs = Array::Handle(functions());
   intptr_t len = funcs.Length();
   for (intptr_t i = 0; i < len; i++) {
-    func ^= funcs.At(i);
+    func |= funcs.At(i);
     if ((func.token_pos() <= token_pos) &&
         (token_pos <= func.end_token_pos())) {
       return func.raw();
@@ -2372,8 +2456,8 @@
   String& field_name = String::Handle(isolate, String::null());
   intptr_t len = flds.Length();
   for (intptr_t i = 0; i < len; i++) {
-    field ^= flds.At(i);
-    field_name ^= field.name();
+    field |= flds.At(i);
+    field_name |= field.name();
     if (OneByteString::EqualsIgnoringPrivateKey(field_name, name)) {
       return field.raw();
     }
@@ -2924,7 +3008,7 @@
   // Last element of the array is the number of used elements.
   intptr_t table_size = table.Length() - 1;
   Smi& used = Smi::Handle(isolate);
-  used ^= table.At(table_size);
+  used |= table.At(table_size);
   intptr_t used_elements = used.Value() + 1;
   used = Smi::New(used_elements);
   table.SetAt(table_size, used);
@@ -3220,6 +3304,21 @@
 }
 
 
+RawFunction* Function::extracted_method_closure() const {
+  ASSERT(kind() == RawFunction::kMethodExtractor);
+  const Object& obj = Object::Handle(raw_ptr()->data_);
+  ASSERT(obj.IsFunction());
+  return Function::Cast(obj).raw();
+}
+
+
+void Function::set_extracted_method_closure(const Function& value) const {
+  ASSERT(kind() == RawFunction::kMethodExtractor);
+  ASSERT(raw_ptr()->data_ == Object::null());
+  set_data(value);
+}
+
+
 RawFunction* Function::parent_function() const {
   if (IsClosureFunction()) {
     const Object& obj = Object::Handle(raw_ptr()->data_);
@@ -3412,7 +3511,7 @@
 RawString* Function::ParameterNameAt(intptr_t index) const {
   const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names_);
   String& parameter_name = String::Handle();
-  parameter_name ^= parameter_names.At(index);
+  parameter_name |= parameter_names.At(index);
   return parameter_name.raw();
 }
 
@@ -3631,13 +3730,13 @@
   String& argument_name = String::Handle();
   String& parameter_name = String::Handle();
   for (int i = 0; i < num_named_arguments; i++) {
-    argument_name ^= argument_names.At(i);
+    argument_name |= argument_names.At(i);
     ASSERT(argument_name.IsSymbol());
     bool found = false;
     const int num_positional_args = num_arguments - num_named_arguments;
     const int num_parameters = NumParameters();
     for (int j = num_positional_args; !found && (j < num_parameters); j++) {
-      parameter_name ^= ParameterNameAt(j);
+      parameter_name |= ParameterNameAt(j);
       ASSERT(argument_name.IsSymbol());
       if (argument_name.Equals(parameter_name)) {
         found = true;
@@ -3997,9 +4096,9 @@
   // Set closure function's context scope.
   ContextScope& context_scope = ContextScope::Handle();
   if (is_static()) {
-    context_scope ^= ContextScope::New(0);
+    context_scope |= ContextScope::New(0);
   } else {
-    context_scope ^= LocalScope::CreateImplicitClosureScope(*this);
+    context_scope |= LocalScope::CreateImplicitClosureScope(*this);
   }
   closure_function.set_context_scope(context_scope);
 
@@ -4309,6 +4408,9 @@
     case RawFunction::kConstImplicitGetter:
       kind_str = " const-getter";
       break;
+    case RawFunction::kMethodExtractor:
+      kind_str = " method-extractor";
+      break;
     default:
       UNREACHABLE();
   }
@@ -5110,7 +5212,7 @@
       const Array& symbols = Array::Handle(isolate,
                                            object_store->keyword_symbols());
       ASSERT(!symbols.IsNull());
-      str ^= symbols.At(kind - Token::kFirstKeyword);
+      str |= symbols.At(kind - Token::kFirstKeyword);
       ASSERT(!str.IsNull());
       return str.raw();
     }
@@ -5493,7 +5595,7 @@
   // Insert the object at the empty slot.
   dict.SetAt(index, obj);
   Smi& used = Smi::Handle();
-  used ^= dict.At(dict_size);
+  used |= dict.At(dict_size);
   intptr_t used_elements = used.Value() + 1;  // One more element added.
   used = Smi::New(used_elements);
   dict.SetAt(dict_size, used);  // Update used count.
@@ -5517,7 +5619,7 @@
     Namespace& ns = Namespace::Handle();
     Object& obj = Object::Handle();
     for (int i = 0; i < exports.Length(); i++) {
-      ns ^= exports.At(i);
+      ns |= exports.At(i);
       obj = ns.Lookup(name);
       if (!obj.IsNull()) {
         return obj.raw();
@@ -5599,7 +5701,7 @@
       }
       bool is_unique = true;
       for (int i = 0; i < scripts.Length(); i++) {
-        script_obj ^= scripts.At(i);
+        script_obj |= scripts.At(i);
         if (script_obj.raw() == owner_script.raw()) {
           // We already have a reference to this script.
           is_unique = false;
@@ -5627,7 +5729,7 @@
   String& script_url = String::Handle();
   intptr_t num_scripts = scripts.Length();
   for (int i = 0; i < num_scripts; i++) {
-    script ^= scripts.At(i);
+    script |= scripts.At(i);
     script_url = script.url();
     if (script_url.Equals(url)) {
       return script.raw();
@@ -5681,7 +5783,7 @@
   Array& anon_classes = Array::Handle(this->raw_ptr()->anonymous_classes_);
   intptr_t num_anonymous = raw_ptr()->num_anonymous_;
   for (int i = 0; i < num_anonymous; i++) {
-    cls ^= anon_classes.At(i);
+    cls |= anon_classes.At(i);
     ASSERT(!cls.IsNull());
     if (script.raw() == cls.script()) {
       func = cls.LookupFunctionAtToken(token_pos);
@@ -5730,10 +5832,10 @@
   Namespace& import = Namespace::Handle();
   Object& obj = Object::Handle();
   for (intptr_t j = 0; j < this->num_imports(); j++) {
-    import ^= imports.At(j);
+    import |= imports.At(j);
     obj = import.Lookup(name);
     if (!obj.IsNull() && obj.IsField()) {
-      field ^= obj.raw();
+      field |= obj.raw();
       return field.raw();
     }
   }
@@ -5752,7 +5854,7 @@
   }
   if (!obj.IsNull()) {
     if (obj.IsField()) {
-      field ^= obj.raw();
+      field |= obj.raw();
       return field.raw();
     }
   }
@@ -5779,10 +5881,10 @@
   Namespace& import = Namespace::Handle();
   Object& obj = Object::Handle();
   for (intptr_t j = 0; j < this->num_imports(); j++) {
-    import ^= imports.At(j);
+    import |= imports.At(j);
     obj = import.Lookup(name);
     if (!obj.IsNull() && obj.IsFunction()) {
-      function ^= obj.raw();
+      function |= obj.raw();
       return function.raw();
     }
   }
@@ -5817,7 +5919,7 @@
   const Array& imports = Array::Handle(this->imports());
   Namespace& import = Namespace::Handle();
   for (intptr_t j = 0; j < this->num_imports(); j++) {
-    import ^= imports.At(j);
+    import |= imports.At(j);
     obj = import.Lookup(name);
     if (!obj.IsNull()) {
       return obj.raw();
@@ -5906,7 +6008,7 @@
   }
   const Array& import_list = Array::Handle(imports());
   Namespace& import = Namespace::Handle();
-  import ^= import_list.At(index);
+  import |= import_list.At(index);
   return import.raw();
 }
 
@@ -6052,6 +6154,11 @@
   const Library& math_lib = Library::Handle(Library::MathLibrary());
   const Namespace& math_ns = Namespace::Handle(
       Namespace::New(math_lib, Array::Handle(), Array::Handle()));
+  Library::InitCollectionDevLibrary(isolate);
+  const Library& collection_dev_lib =
+      Library::Handle(Library::CollectionDevLibrary());
+  const Namespace& collection_dev_ns = Namespace::Handle(
+      Namespace::New(collection_dev_lib, Array::Handle(), Array::Handle()));
   Library::InitCollectionLibrary(isolate);
   const Library& collection_lib =
       Library::Handle(Library::CollectionLibrary());
@@ -6059,6 +6166,7 @@
       Namespace::New(collection_lib, Array::Handle(), Array::Handle()));
   core_lib.AddImport(math_ns);
   core_lib.AddImport(collection_ns);
+  core_lib.AddImport(collection_dev_ns);
   isolate->object_store()->set_root_library(Library::Handle());
 
   // Hook up predefined classes without setting their library pointers. These
@@ -6076,11 +6184,24 @@
   const Library& math_lib = Library::Handle(Library::MathLibrary());
   const Namespace& math_ns = Namespace::Handle(
       Namespace::New(math_lib, Array::Handle(), Array::Handle()));
+  const Library& collection_dev_lib =
+      Library::Handle(Library::CollectionDevLibrary());
+  const Namespace& collection_dev_ns = Namespace::Handle(
+      Namespace::New(collection_dev_lib, Array::Handle(), Array::Handle()));
   lib.AddImport(math_ns);
+  lib.AddImport(collection_dev_ns);
   isolate->object_store()->set_collection_library(lib);
 }
 
 
+void Library::InitCollectionDevLibrary(Isolate* isolate) {
+  const String& url = String::Handle(Symbols::New("dart:collection-dev"));
+  const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true));
+  lib.Register();
+  isolate->object_store()->set_collection_dev_library(lib);
+}
+
+
 void Library::InitMathLibrary(Isolate* isolate) {
   const String& url = String::Handle(Symbols::New("dart:math"));
   const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true));
@@ -6168,7 +6289,7 @@
   GrowableObjectArray& libs = GrowableObjectArray::Handle(
       isolate, isolate->object_store()->libraries());
   for (int i = 0; i < libs.Length(); i++) {
-    lib ^= libs.At(i);
+    lib |= libs.At(i);
     lib_url = lib.url();
     if (lib_url.Equals(url)) {
       return lib.raw();
@@ -6191,8 +6312,8 @@
   Library& lib = Library::Handle();
   String& lib_url = String::Handle();
   for (int i = 0; i < libs.Length(); i++) {
-    lib ^= libs.At(i);
-    lib_url ^= lib.url();
+    lib |= libs.At(i);
+    lib_url |= lib.url();
     lib_key = lib_url.Hash();
     if (lib_key == key) {
       return true;
@@ -6202,11 +6323,27 @@
 }
 
 
+static bool IsPrivate(const String& name) {
+  if (ShouldBePrivate(name)) return true;
+  // Factory names: List._fromLiteral.
+  for (intptr_t i = 1; i < name.Length() - 1; i++) {
+    if (name.CharAt(i) == '.') {
+      if (name.CharAt(i + 1) == '_') {
+        return true;
+      }
+    }
+  }
+  return false;
+}
+
+
+// Cannot handle qualified names properly as it only appends private key to
+// the end (e.g. _Alfa.foo -> _Alfa.foo@...).
 RawString* Library::PrivateName(const String& name) const {
-  ASSERT(ShouldBePrivate(name));
+  ASSERT(IsPrivate(name));
   // ASSERT(strchr(name, '@') == NULL);
   String& str = String::Handle();
-  str ^= name.raw();
+  str |= name.raw();
   str = String::Concat(str, String::Handle(this->private_key()));
   str = Symbols::New(str);
   return str.raw();
@@ -6220,7 +6357,7 @@
   ASSERT(!libs.IsNull());
   if ((0 <= index) && (index < libs.Length())) {
     Library& lib = Library::Handle();
-    lib ^= libs.At(index);
+    lib |= libs.At(index);
     return lib.raw();
   }
   return Library::null();
@@ -6253,6 +6390,11 @@
 }
 
 
+RawLibrary* Library::CollectionDevLibrary() {
+  return Isolate::Current()->object_store()->collection_dev_library();
+}
+
+
 RawLibrary* Library::MathLibrary() {
   return Isolate::Current()->object_store()->math_library();
 }
@@ -6292,7 +6434,7 @@
   if ((index >= 0) || (index < num_imports())) {
     const Array& imports = Array::Handle(this->imports());
     Namespace& import = Namespace::Handle();
-    import ^= imports.At(index);
+    import |= imports.At(index);
     return import.library();
   }
   return Library::null();
@@ -6340,7 +6482,7 @@
   Object& obj = Object::Handle();
   Namespace& import = Namespace::Handle();
   for (intptr_t i = 0; i < num_imports(); i++) {
-    import ^= imports.At(i);
+    import |= imports.At(i);
     obj = import.Lookup(class_name);
     if (!obj.IsNull() && obj.IsClass()) {
       // TODO(hausner):
@@ -6414,7 +6556,7 @@
     String& hidden = String::Handle();
     intptr_t num_names = names.Length();
     for (intptr_t i = 0; i < num_names; i++) {
-      hidden ^= names.At(i);
+      hidden |= names.At(i);
       if (name.Equals(hidden)) {
         return true;
       }
@@ -6427,7 +6569,7 @@
     String& shown = String::Handle();
     intptr_t num_names = names.Length();
     for (intptr_t i = 0; i < num_names; i++) {
-      shown ^= names.At(i);
+      shown |= names.At(i);
       if (name.Equals(shown)) {
         return false;
       }
@@ -6486,10 +6628,10 @@
   Library& lib = Library::Handle();
   Class& cls = Class::Handle();
   for (int i = 0; i < libs.Length(); i++) {
-    lib ^= libs.At(i);
+    lib |= libs.At(i);
     ClassDictionaryIterator it(lib);
     while (it.HasNext()) {
-      cls ^= it.GetNextClass();
+      cls |= it.GetNextClass();
       error = Compiler::CompileAllFunctions(cls);
       if (!error.IsNull()) {
         return error.raw();
@@ -6497,7 +6639,7 @@
     }
     Array& anon_classes = Array::Handle(lib.raw_ptr()->anonymous_classes_);
     for (int i = 0; i < lib.raw_ptr()->num_anonymous_; i++) {
-      cls ^= anon_classes.At(i);
+      cls |= anon_classes.At(i);
       error = Compiler::CompileAllFunctions(cls);
       if (!error.IsNull()) {
         return error.raw();
@@ -6826,7 +6968,7 @@
   const Array& names = Array::Handle(raw_ptr()->names_);
   ASSERT(Length() == names.Length());
   String& name = String::Handle();
-  name ^= names.At(var_index);
+  name |= names.At(var_index);
   return name.raw();
 }
 
@@ -6884,43 +7026,68 @@
 
 
 intptr_t ExceptionHandlers::Length() const {
-  return Smi::Value(raw_ptr()->length_);
+  return raw_ptr()->length_;
 }
 
 
-void ExceptionHandlers::SetLength(intptr_t value) const {
-  // This is only safe because we create a new Smi, which does not cause
-  // heap allocation.
-  raw_ptr()->length_ = Smi::New(value);
+void ExceptionHandlers::SetHandlerInfo(intptr_t try_index,
+                                       intptr_t outer_try_index,
+                                       intptr_t handler_pc) const {
+  ASSERT((try_index >= 0) && (try_index < Length()));
+  RawExceptionHandlers::HandlerInfo* info = &raw_ptr()->data_[try_index];
+  info->outer_try_index = outer_try_index;
+  info->handler_pc = handler_pc;
+}
+
+void ExceptionHandlers::GetHandlerInfo(
+                            intptr_t try_index,
+                            RawExceptionHandlers::HandlerInfo* info) const {
+  ASSERT((try_index >= 0) && (try_index < Length()));
+  ASSERT(info != NULL);
+  RawExceptionHandlers::HandlerInfo* data = &raw_ptr()->data_[try_index];
+  info->outer_try_index = data->outer_try_index;
+  info->handler_pc = data->handler_pc;
 }
 
 
-intptr_t ExceptionHandlers::TryIndex(intptr_t index) const {
-  return *(EntryAddr(index, kTryIndexEntry));
+intptr_t ExceptionHandlers::HandlerPC(intptr_t try_index) const {
+  ASSERT((try_index >= 0) && (try_index < Length()));
+  return raw_ptr()->data_[try_index].handler_pc;
 }
 
 
-void ExceptionHandlers::SetTryIndex(intptr_t index, intptr_t value) const {
-  *(EntryAddr(index, kTryIndexEntry)) = value;
+intptr_t ExceptionHandlers::OuterTryIndex(intptr_t try_index) const {
+  ASSERT((try_index >= 0) && (try_index < Length()));
+  return raw_ptr()->data_[try_index].outer_try_index;
 }
 
 
-intptr_t ExceptionHandlers::HandlerPC(intptr_t index) const {
-  return *(EntryAddr(index, kHandlerPcEntry));
+void ExceptionHandlers::SetHandledTypes(intptr_t try_index,
+                                        const Array& handled_types) const {
+  ASSERT((try_index >= 0) && (try_index < Length()));
+  const Array& handled_types_data =
+      Array::Handle(raw_ptr()->handled_types_data_);
+  handled_types_data.SetAt(try_index, handled_types);
 }
 
 
-void ExceptionHandlers::SetHandlerPC(intptr_t index,
-                                     intptr_t value) const {
-  *(EntryAddr(index, kHandlerPcEntry)) = value;
+RawArray* ExceptionHandlers::GetHandledTypes(intptr_t try_index) const {
+  ASSERT((try_index >= 0) && (try_index < Length()));
+  Array& array = Array::Handle(raw_ptr()->handled_types_data_);
+  array ^= array.At(try_index);
+  return array.raw();
+}
+
+
+void ExceptionHandlers::set_handled_types_data(const Array& value) const {
+  StorePointer(&raw_ptr()->handled_types_data_, value.raw());
 }
 
 
 RawExceptionHandlers* ExceptionHandlers::New(intptr_t num_handlers) {
   ASSERT(Object::exception_handlers_class() != Class::null());
-  if (num_handlers < 0 || num_handlers > kMaxElements) {
-    // This should be caught before we reach here.
-    FATAL1("Fatal error in ExceptionHandlers::New: "
+  if (num_handlers < 0 || num_handlers >= kMaxHandlers) {
+    FATAL1("Fatal error in ExceptionHandlers::New(): "
            "invalid num_handlers %"Pd"\n",
            num_handlers);
   }
@@ -6932,8 +7099,10 @@
                                       Heap::kOld);
     NoGCScope no_gc;
     result ^= raw;
-    result.SetLength(num_handlers);
+    result.raw_ptr()->length_ = num_handlers;
   }
+  const Array& handled_types_data = Array::Handle(Array::New(num_handlers));
+  result.set_handled_types_data(handled_types_data);
   return result.raw();
 }
 
@@ -6942,22 +7111,50 @@
   if (Length() == 0) {
     return "No exception handlers\n";
   }
+  Array& handled_types = Array::Handle();
+  Type& type = Type::Handle();
+  RawExceptionHandlers::HandlerInfo info;
   // First compute the buffer size required.
-  const char* kFormat = "%"Pd" => %#"Px"\n";
+  const char* kFormat = "%"Pd" => %#"Px"  (%"Pd" types) (outer %"Pd")\n";
+  const char* kFormat2 = "  %d. %s\n";
   intptr_t len = 1;  // Trailing '\0'.
   for (intptr_t i = 0; i < Length(); i++) {
-    len += OS::SNPrint(NULL, 0, kFormat, TryIndex(i), HandlerPC(i));
+    GetHandlerInfo(i, &info);
+    handled_types = GetHandledTypes(i);
+    ASSERT(!handled_types.IsNull());
+    intptr_t num_types = handled_types.Length();
+    len += OS::SNPrint(NULL, 0, kFormat,
+                       i,
+                       info.handler_pc,
+                       num_types,
+                       info.outer_try_index);
+    for (int k = 0; k < num_types; k++) {
+      type ^= handled_types.At(k);
+      ASSERT(!type.IsNull());
+      len += OS::SNPrint(NULL, 0, kFormat2, k, type.ToCString());
+    }
   }
   // Allocate the buffer.
   char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len);
   // Layout the fields in the buffer.
-  intptr_t index = 0;
+  intptr_t num_chars = 0;
   for (intptr_t i = 0; i < Length(); i++) {
-    index += OS::SNPrint((buffer + index),
-                         (len - index),
-                         kFormat,
-                         TryIndex(i),
-                         HandlerPC(i));
+    GetHandlerInfo(i, &info);
+    handled_types = GetHandledTypes(i);
+    intptr_t num_types = handled_types.Length();
+    num_chars += OS::SNPrint((buffer + num_chars),
+                             (len - num_chars),
+                             kFormat,
+                             i,
+                             info.handler_pc,
+                             num_types,
+                             info.outer_try_index);
+    for (int k = 0; k < num_types; k++) {
+      type ^= handled_types.At(k);
+      num_chars += OS::SNPrint((buffer + num_chars),
+                               (len - num_chars),
+                               kFormat2, k, type.ToCString());
+    }
   }
   return buffer;
 }
@@ -7104,7 +7301,7 @@
 
 intptr_t Code::Comments::PCOffsetAt(intptr_t idx) const {
   Smi& result = Smi::Handle();
-  result ^= comments_.At(idx * kNumberOfEntries + kPCOffsetEntry);
+  result |= comments_.At(idx * kNumberOfEntries + kPCOffsetEntry);
   return result.Value();
 }
 
@@ -7117,7 +7314,7 @@
 
 RawString* Code::Comments::CommentAt(intptr_t idx) const {
   String& result = String::Handle();
-  result ^= comments_.At(idx * kNumberOfEntries + kCommentEntry);
+  result |= comments_.At(idx * kNumberOfEntries + kCommentEntry);
   return result.raw();
 }
 
@@ -7184,7 +7381,7 @@
   for (intptr_t i = 0; i < array.Length(); i += kSCallTableEntryLength) {
     if (array.At(i) == raw_code_offset) {
       Function& function = Function::Handle();
-      function ^= array.At(i + kSCallTableFunctionEntry);
+      function |= array.At(i + kSCallTableFunctionEntry);
       return function.raw();
     }
   }
@@ -7469,7 +7666,7 @@
   *maps = stackmaps();
   *map = Stackmap::null();
   for (intptr_t i = 0; i < maps->Length(); i++) {
-    *map ^= maps->At(i);
+    *map |= maps->At(i);
     ASSERT(!map->IsNull());
     if (map->PC() == pc) {
       return map->raw();  // We found a stack map for this frame.
@@ -7784,10 +7981,10 @@
   intptr_t data_pos = index * TestEntryLength();
   Smi& smi = Smi::Handle();
   for (intptr_t i = 0; i < num_args_tested(); i++) {
-    smi ^= data.At(data_pos++);
+    smi |= data.At(data_pos++);
     class_ids->Add(smi.Value());
   }
-  (*target) ^= data.At(data_pos++);
+  (*target) |= data.At(data_pos++);
 }
 
 
@@ -7800,9 +7997,9 @@
   const Array& data = Array::Handle(ic_data());
   intptr_t data_pos = index * TestEntryLength();
   Smi& smi = Smi::Handle();
-  smi ^= data.At(data_pos);
+  smi |= data.At(data_pos);
   *class_id = smi.Value();
-  *target ^= data.At(data_pos + 1);
+  *target |= data.At(data_pos + 1);
 }
 
 
@@ -7819,7 +8016,7 @@
   const Array& data = Array::Handle(ic_data());
   const intptr_t data_pos = index * TestEntryLength();
   Smi& smi = Smi::Handle();
-  smi ^= data.At(data_pos);
+  smi |= data.At(data_pos);
   return smi.Value();
 }
 
@@ -7837,7 +8034,7 @@
   const intptr_t data_pos = index * TestEntryLength() +
       CountIndexFor(num_args_tested());
   Smi& smi = Smi::Handle();
-  smi ^= data.At(data_pos);
+  smi |= data.At(data_pos);
   return smi.Value();
 }
 
@@ -7933,6 +8130,19 @@
 }
 
 
+bool ICData::HasReceiverClassId(intptr_t class_id) const {
+  ASSERT(num_args_tested() > 0);
+  const intptr_t len = NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
+    const intptr_t test_class_id = GetReceiverClassIdAt(i);
+    if (test_class_id == class_id) {
+      return true;
+    }
+  }
+  return false;
+}
+
+
 // Returns true if all targets are the same.
 // TODO(srdjan): if targets are native use their C_function to compare.
 bool ICData::HasOneTarget() const {
@@ -8056,9 +8266,9 @@
 
     // Rehash the valid entries.
     for (intptr_t i = 0; i < old_capacity; ++i) {
-      class_id ^= GetClassId(old_buckets, i);
+      class_id |= GetClassId(old_buckets, i);
       if (class_id.Value() != kIllegalCid) {
-        target ^= GetTargetFunction(old_buckets, i);
+        target |= GetTargetFunction(old_buckets, i);
         Insert(class_id, target);
       }
     }
@@ -8076,7 +8286,7 @@
   Smi& probe = Smi::Handle();
   intptr_t i = index;
   do {
-    probe ^= GetClassId(backing_array, i);
+    probe |= GetClassId(backing_array, i);
     if (probe.Value() == kIllegalCid) {
       SetEntry(backing_array, i, class_id, target);
       set_filled_entry_count(filled_entry_count() + 1);
@@ -8151,12 +8361,12 @@
   Array& data = Array::Handle(cache());
   intptr_t data_pos = ix * kTestEntryLength;
   Smi& instance_class_id_handle = Smi::Handle();
-  instance_class_id_handle ^= data.At(data_pos + kInstanceClassId);
+  instance_class_id_handle |= data.At(data_pos + kInstanceClassId);
   *instance_class_id = instance_class_id_handle.Value();
   *instance_type_arguments ^= data.At(data_pos + kInstanceTypeArguments);
   *instantiator_type_arguments ^=
       data.At(data_pos + kInstantiatorTypeArguments);
-  *test_result ^= data.At(data_pos + kTestResult);
+  *test_result |= data.At(data_pos + kTestResult);
 }
 
 
@@ -9472,7 +9682,7 @@
   if (IsSmi()) return raw();
   if (IsMint()) {
     Mint& mint = Mint::Handle();
-    mint ^= raw();
+    mint |= raw();
     if (Smi::IsValid64(mint.value())) {
       return Smi::New(mint.value());
     } else {
@@ -9481,7 +9691,7 @@
   }
   ASSERT(IsBigint());
   Bigint& big_value = Bigint::Handle();
-  big_value ^= raw();
+  big_value |= raw();
   if (BigintOperations::FitsIntoSmi(big_value)) {
     return BigintOperations::ToSmi(big_value);
   } else if (BigintOperations::FitsIntoMint(big_value)) {
@@ -9502,8 +9712,8 @@
   if (IsSmi() && other.IsSmi()) {
     Smi& left_smi = Smi::Handle();
     Smi& right_smi = Smi::Handle();
-    left_smi ^= raw();
-    right_smi ^= other.raw();
+    left_smi |= raw();
+    right_smi |= other.raw();
     const intptr_t left_value = left_smi.Value();
     const intptr_t right_value = right_smi.Value();
     switch (operation) {
@@ -9600,8 +9810,8 @@
   if (IsSmi() && other.IsSmi()) {
     Smi& op1 = Smi::Handle();
     Smi& op2 = Smi::Handle();
-    op1 ^= raw();
-    op2 ^= other.raw();
+    op1 |= raw();
+    op2 |= other.raw();
     intptr_t result = 0;
     switch (kind) {
       case Token::kBIT_AND:
@@ -9795,7 +10005,7 @@
   Mint& canonical_value = Mint::Handle();
   intptr_t index = 0;
   while (index < constants_len) {
-    canonical_value ^= constants.At(index);
+    canonical_value |= constants.At(index);
     if (canonical_value.IsNull()) {
       break;
     }
@@ -9949,7 +10159,7 @@
   Double& canonical_value = Double::Handle();
   intptr_t index = 0;
   while (index < constants_len) {
-    canonical_value ^= constants.At(index);
+    canonical_value |= constants.At(index);
     if (canonical_value.IsNull()) {
       break;
     }
@@ -9995,16 +10205,16 @@
   ASSERT(!IsNull());
   if (IsSmi()) {
     Smi& smi = Smi::Handle();
-    smi ^= raw();
+    smi |= raw();
     return BigintOperations::NewFromSmi(smi);
   } else if (IsMint()) {
     Mint& mint = Mint::Handle();
-    mint ^= raw();
+    mint |= raw();
     return BigintOperations::NewFromInt64(mint.value());
   } else {
     ASSERT(IsBigint());
     Bigint& big = Bigint::Handle();
-    big ^= raw();
+    big |= raw();
     ASSERT(!BigintOperations::FitsIntoSmi(big));
     return big.raw();
   }
@@ -10082,7 +10292,7 @@
   Bigint& canonical_value = Bigint::Handle();
   intptr_t index = 0;
   while (index < constants_len) {
-    canonical_value ^= constants.At(index);
+    canonical_value |= constants.At(index);
     if (canonical_value.IsNull()) {
       break;
     }
@@ -10180,17 +10390,6 @@
 };
 
 
-intptr_t String::Hash() const {
-  intptr_t result = Smi::Value(raw_ptr()->hash_);
-  if (result != 0) {
-    return result;
-  }
-  result = String::Hash(*this, 0, this->Length());
-  this->SetHash(result);
-  return result;
-}
-
-
 intptr_t String::Hash(const String& str, intptr_t begin_index, intptr_t len) {
   ASSERT(begin_index >= 0);
   ASSERT(len >= 0);
@@ -10489,10 +10688,10 @@
   String& result = String::Handle();
   intptr_t char_size = str.CharSize();
   if (char_size == kOneByteChar) {
-    result ^= OneByteString::New(len, space);
+    result |= OneByteString::New(len, space);
   } else {
     ASSERT(char_size == kTwoByteChar);
-    result ^= TwoByteString::New(len, space);
+    result |= TwoByteString::New(len, space);
   }
   String::Copy(result, 0, str, 0, len);
   return result.raw();
@@ -10661,7 +10860,7 @@
   String& str = String::Handle();
   intptr_t char_size = kOneByteChar;
   for (intptr_t i = 0; i < strings_len; i++) {
-    str ^= strings.At(i);
+    str |= strings.At(i);
     result_len += str.Length();
     char_size = Utils::Maximum(char_size, str.CharSize());
   }
@@ -10709,9 +10908,9 @@
     }
   }
   if (is_one_byte_string) {
-    result ^= OneByteString::New(length, space);
+    result |= OneByteString::New(length, space);
   } else {
-    result ^= TwoByteString::New(length, space);
+    result |= TwoByteString::New(length, space);
   }
   String::Copy(result, 0, str, begin_index, length);
   return result.raw();
@@ -11073,7 +11272,7 @@
   intptr_t strings_len = strings.Length();
   intptr_t pos = 0;
   for (intptr_t i = 0; i < strings_len; i++) {
-    str ^= strings.At(i);
+    str |= strings.At(i);
     intptr_t str_len = str.Length();
     String::Copy(result, pos, str, 0, str_len);
     pos += str_len;
@@ -11242,7 +11441,7 @@
   intptr_t strings_len = strings.Length();
   intptr_t pos = 0;
   for (intptr_t i = 0; i < strings_len; i++) {
-    str ^= strings.At(i);
+    str |= strings.At(i);
     intptr_t str_len = str.Length();
     String::Copy(result, pos, str, 0, str_len);
     pos += str_len;
@@ -12426,7 +12625,7 @@
 RawJSRegExp* JSRegExp::FromDataStartAddress(void* data) {
   JSRegExp& regexp = JSRegExp::Handle();
   intptr_t addr = reinterpret_cast<intptr_t>(data) - sizeof(RawJSRegExp);
-  regexp ^= RawObject::FromAddr(addr);
+  regexp |= RawObject::FromAddr(addr);
   return regexp.raw();
 }
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 4d70090..2df948e 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -33,6 +33,12 @@
 class LocalScope;
 class Symbols;
 
+#if defined(DEBUG)
+#define CHECK_HANDLE() CheckHandle();
+#else
+#define CHECK_HANDLE()
+#endif
+
 #define OBJECT_IMPLEMENTATION(object, super)                                   \
  public:  /* NOLINT */                                                         \
   Raw##object* raw() const { return reinterpret_cast<Raw##object*>(raw_); }    \
@@ -44,6 +50,10 @@
     initializeHandle(this, value);                                             \
     ASSERT(IsNull() || Is##object());                                          \
   }                                                                            \
+  void operator|=(RawObject* value) {                                          \
+    raw_ = value;                                                              \
+    CHECK_HANDLE();                                                            \
+  }                                                                            \
   static object& Handle(Isolate* isolate, Raw##object* raw_ptr) {              \
     object* obj =                                                              \
         reinterpret_cast<object*>(VMHandles::AllocateHandle(isolate));         \
@@ -366,6 +376,7 @@
   }
 
   inline void SetRaw(RawObject* value);
+  void CheckHandle() const;
 
   cpp_vtable vtable() const { return bit_copy<cpp_vtable>(*this); }
   void set_vtable(cpp_vtable value) { *vtable_address() = value; }
@@ -699,15 +710,19 @@
 
   RawArray* functions() const { return raw_ptr()->functions_; }
   void SetFunctions(const Array& value) const;
+  void AddFunction(const Function& function) const;
 
   void AddClosureFunction(const Function& function) const;
   RawFunction* LookupClosureFunction(intptr_t token_pos) const;
 
   RawFunction* LookupDynamicFunction(const String& name) const;
+  RawFunction* LookupDynamicFunctionAllowPrivate(const String& name) const;
   RawFunction* LookupStaticFunction(const String& name) const;
+  RawFunction* LookupStaticFunctionAllowPrivate(const String& name) const;
   RawFunction* LookupConstructor(const String& name) const;
   RawFunction* LookupFactory(const String& name) const;
   RawFunction* LookupFunction(const String& name) const;
+  RawFunction* LookupFunctionAllowPrivate(const String& name) const;
   RawFunction* LookupGetterFunction(const String& name) const;
   RawFunction* LookupSetterFunction(const String& name) const;
   RawFunction* LookupFunctionAtToken(intptr_t token_pos) const;
@@ -1195,6 +1210,13 @@
   RawCode* closure_allocation_stub() const;
   void set_closure_allocation_stub(const Code& value) const;
 
+  void set_extracted_method_closure(const Function& function) const;
+  RawFunction* extracted_method_closure() const;
+
+  bool IsMethodExtractor() const {
+    return kind() == RawFunction::kMethodExtractor;
+  }
+
   // Returns true iff an implicit closure function has been created
   // for this function.
   bool HasImplicitClosureFunction() const {
@@ -1237,6 +1259,7 @@
       case RawFunction::kSetterFunction:
       case RawFunction::kImplicitGetter:
       case RawFunction::kImplicitSetter:
+      case RawFunction::kMethodExtractor:
         return true;
       case RawFunction::kClosureFunction:
       case RawFunction::kConstructor:
@@ -2041,6 +2064,7 @@
   static void InitASyncLibrary(Isolate* isolate);
   static void InitCoreLibrary(Isolate* isolate);
   static void InitCollectionLibrary(Isolate* isolate);
+  static void InitCollectionDevLibrary(Isolate* isolate);
   static void InitMathLibrary(Isolate* isolate);
   static void InitIsolateLibrary(Isolate* isolate);
   static void InitMirrorsLibrary(Isolate* isolate);
@@ -2050,6 +2074,7 @@
   static RawLibrary* ASyncLibrary();
   static RawLibrary* CoreLibrary();
   static RawLibrary* CollectionLibrary();
+  static RawLibrary* CollectionDevLibrary();
   static RawLibrary* MathLibrary();
   static RawLibrary* IsolateLibrary();
   static RawLibrary* MirrorsLibrary();
@@ -2391,29 +2416,21 @@
 
 
 class ExceptionHandlers : public Object {
- private:
-  // Describes the layout of exception handler data.
-  enum {
-    kTryIndexEntry = 0,  // Try block index associated with handler.
-    kHandlerPcEntry,  // PC value of handler.
-    kNumberOfEntries
-  };
-
  public:
   intptr_t Length() const;
 
-  intptr_t TryIndex(intptr_t index) const;
-  intptr_t HandlerPC(intptr_t index) const;
+  void GetHandlerInfo(intptr_t try_index,
+                      RawExceptionHandlers::HandlerInfo* info) const;
 
-  void SetHandlerEntry(intptr_t index,
-                       intptr_t try_index,
-                       intptr_t handler_pc) const {
-    SetTryIndex(index, try_index);
-    SetHandlerPC(index, handler_pc);
-  }
+  intptr_t HandlerPC(intptr_t try_index) const;
+  intptr_t OuterTryIndex(intptr_t try_index) const;
 
-  static const intptr_t kBytesPerElement = (kNumberOfEntries * kWordSize);
-  static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
+  void SetHandlerInfo(intptr_t try_index,
+                      intptr_t outer_try_index,
+                      intptr_t handler_pc) const;
+
+  RawArray* GetHandledTypes(intptr_t try_index) const;
+  void SetHandledTypes(intptr_t try_index, const Array& handled_types) const;
 
   static intptr_t InstanceSize() {
     ASSERT(sizeof(RawExceptionHandlers) == OFFSET_OF(RawExceptionHandlers,
@@ -2421,9 +2438,9 @@
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
-    ASSERT(0 <= len && len <= kMaxElements);
     return RoundedAllocationSize(
-        sizeof(RawExceptionHandlers) + (len * kBytesPerElement));
+        sizeof(RawExceptionHandlers) +
+            (len * sizeof(RawExceptionHandlers::HandlerInfo)));
   }
 
   static RawExceptionHandlers* New(intptr_t num_handlers);
@@ -2432,17 +2449,12 @@
   // exception handler table to visit objects if any in the table.
 
  private:
-  void SetTryIndex(intptr_t index, intptr_t value) const;
-  void SetHandlerPC(intptr_t index, intptr_t value) const;
+  // Pick somewhat arbitrary maximum number of exception handlers
+  // for a function. This value is used to catch potentially
+  // malicious code.
+  static const intptr_t kMaxHandlers = 1024 * 1024;
 
-  void SetLength(intptr_t value) const;
-
-  intptr_t* EntryAddr(intptr_t index, intptr_t entry_offset) const {
-    ASSERT((index >=0) && (index < Length()));
-    intptr_t data_index = (index * kNumberOfEntries) + entry_offset;
-    return &raw_ptr()->data_[data_index];
-  }
-
+  void set_handled_types_data(const Array& value) const;
   HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers, Object);
   friend class Class;
 };
@@ -2977,6 +2989,7 @@
   bool AllTargetsHaveSameOwner(intptr_t owner_cid) const;
   bool AllReceiversAreNumbers() const;
   bool HasOneTarget() const;
+  bool HasReceiverClassId(intptr_t class_id) const;
 
   static RawICData* New(const Function& caller_function,
                         const String& target_name,
@@ -3900,7 +3913,16 @@
   intptr_t Length() const { return Smi::Value(raw_ptr()->length_); }
   static intptr_t length_offset() { return OFFSET_OF(RawString, length_); }
 
-  virtual intptr_t Hash() const;
+  intptr_t Hash() const {
+    intptr_t result = Smi::Value(raw_ptr()->hash_);
+    if (result != 0) {
+      return result;
+    }
+    result = String::Hash(*this, 0, this->Length());
+    this->SetHash(result);
+    return result;
+  }
+
   static intptr_t hash_offset() { return OFFSET_OF(RawString, hash_); }
   static intptr_t Hash(const String& str, intptr_t begin_index, intptr_t len);
   static intptr_t Hash(const uint8_t* characters, intptr_t len);
diff --git a/runtime/vm/object_mips_test.cc b/runtime/vm/object_mips_test.cc
new file mode 100644
index 0000000..ef10b2d
--- /dev/null
+++ b/runtime/vm/object_mips_test.cc
@@ -0,0 +1,40 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "platform/assert.h"
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_MIPS)
+
+#include "vm/assembler.h"
+#include "vm/object.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+#define __ assembler->
+
+
+// Generate a simple dart code sequence.
+// This is used to test Code and Instruction object creation.
+void GenerateIncrement(Assembler* assembler) {
+  __ Unimplemented("GenerateIncrement");
+}
+
+
+// Generate a dart code sequence that embeds a string object in it.
+// This is used to test Embedded String objects in the instructions.
+void GenerateEmbedStringInCode(Assembler* assembler, const char* str) {
+  __ Unimplemented("GenerateEmbedStringInCode");
+}
+
+
+// Generate a dart code sequence that embeds a smi object in it.
+// This is used to test Embedded Smi objects in the instructions.
+void GenerateEmbedSmiInCode(Assembler* assembler, intptr_t value) {
+  __ Unimplemented("GenerateEmbedSmiInCode");
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index c44d966..0d847da 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -115,6 +115,8 @@
   }
   ASSERT(this->stack_overflow() == Instance::null());
   ASSERT(this->out_of_memory() == Instance::null());
+  // TODO(regis): Reenable this code for arm and mips when possible.
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
   Object& result = Object::Handle();
 
   result = Exceptions::Create(Exceptions::kStackOverflow,
@@ -129,6 +131,7 @@
     return false;
   }
   set_out_of_memory(Instance::Cast(result));
+#endif
   return true;
 }
 
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 97c8221..bf98064 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -377,6 +377,13 @@
     collection_library_ = value.raw();
   }
 
+  RawLibrary* collection_dev_library() const {
+    return collection_dev_library_;
+  }
+  void set_collection_dev_library(const Library& value) {
+    collection_dev_library_ = value.raw();
+  }
+
   RawLibrary* math_library() const {
     return math_library_;
   }
@@ -564,6 +571,7 @@
   RawLibrary* core_library_;
   RawLibrary* core_impl_library_;
   RawLibrary* collection_library_;
+  RawLibrary* collection_dev_library_;
   RawLibrary* math_library_;
   RawLibrary* isolate_library_;
   RawLibrary* mirrors_library_;
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index aec86a2..93d7ec8 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -1759,8 +1759,9 @@
 
   // Test the MakeArray functionality to make sure the resulting array
   // object is properly setup.
-  // 1. Should produce an array of length 2 and a remainder array of length 1.
+  // 1. Should produce an array of length 2 and a left over int8 array.
   Array& new_array = Array::Handle();
+  Int8Array& left_over_array = Int8Array::Handle();
   Object& obj = Object::Handle();
   uword addr = 0;
   intptr_t used_size = 0;
@@ -1781,11 +1782,11 @@
   EXPECT_EQ(2, new_array.Length());
   addr += used_size;
   obj = RawObject::FromAddr(addr);
-  EXPECT(obj.IsArray());
-  new_array ^= obj.raw();
-  EXPECT_EQ(0, new_array.Length());
+  EXPECT(obj.IsInt8Array());
+  left_over_array ^= obj.raw();
+  EXPECT_EQ((2 * kWordSize), left_over_array.Length());
 
-  // 2. Should produce an array of length 3 and a remainder object.
+  // 2. Should produce an array of length 3 and a left over int8 array.
   array = GrowableObjectArray::New(kArrayLen);
   EXPECT_EQ(kArrayLen, array.Capacity());
   EXPECT_EQ(0, array.Length());
@@ -1802,9 +1803,11 @@
   EXPECT_EQ(3, new_array.Length());
   addr += used_size;
   obj = RawObject::FromAddr(addr);
-  EXPECT(!obj.IsArray());
+  EXPECT(obj.IsInt8Array());
+  left_over_array ^= obj.raw();
+  EXPECT_EQ(0, left_over_array.Length());
 
-  // 3. Should produce an array of length 1 and a remainder array of length 2.
+  // 3. Should produce an array of length 1 and a left over int8 array.
   array = GrowableObjectArray::New(kArrayLen + 3);
   EXPECT_EQ((kArrayLen + 3), array.Capacity());
   EXPECT_EQ(0, array.Length());
@@ -1821,9 +1824,9 @@
   EXPECT_EQ(1, new_array.Length());
   addr += used_size;
   obj = RawObject::FromAddr(addr);
-  EXPECT(obj.IsArray());
-  new_array ^= obj.raw();
-  EXPECT_EQ(4, new_array.Length());
+  EXPECT(obj.IsInt8Array());
+  left_over_array ^= obj.raw();
+  EXPECT_EQ((6 * kWordSize), left_over_array.Length());
 }
 
 
@@ -2488,17 +2491,17 @@
       new LocalScope(parent_scope, local_scope_function_level, 0);
 
   const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType());
-  const String& a = String::ZoneHandle(String::New("a"));
+  const String& a = String::ZoneHandle(Symbols::New("a"));
   LocalVariable* var_a =
       new LocalVariable(Scanner::kDummyTokenIndex, a, dynamic_type);
   parent_scope->AddVariable(var_a);
 
-  const String& b = String::ZoneHandle(String::New("b"));
+  const String& b = String::ZoneHandle(Symbols::New("b"));
   LocalVariable* var_b =
       new LocalVariable(Scanner::kDummyTokenIndex, b, dynamic_type);
   local_scope->AddVariable(var_b);
 
-  const String& c = String::ZoneHandle(String::New("c"));
+  const String& c = String::ZoneHandle(Symbols::New("c"));
   LocalVariable* var_c =
       new LocalVariable(Scanner::kDummyTokenIndex, c, dynamic_type);
   parent_scope->AddVariable(var_c);
@@ -2728,16 +2731,14 @@
 
 
 TEST_CASE(ExceptionHandlers) {
-  const int kNumEntries = 6;
+  const int kNumEntries = 4;
   // Add an exception handler table to the code.
   ExceptionHandlers& exception_handlers = ExceptionHandlers::Handle();
   exception_handlers ^= ExceptionHandlers::New(kNumEntries);
-  exception_handlers.SetHandlerEntry(0, 10, 20);
-  exception_handlers.SetHandlerEntry(1, 20, 30);
-  exception_handlers.SetHandlerEntry(2, 30, 40);
-  exception_handlers.SetHandlerEntry(3, 10, 40);
-  exception_handlers.SetHandlerEntry(4, 10, 80);
-  exception_handlers.SetHandlerEntry(5, 80, 150);
+  exception_handlers.SetHandlerInfo(0, -1, 20);
+  exception_handlers.SetHandlerInfo(1, 0, 30);
+  exception_handlers.SetHandlerInfo(2, -1, 40);
+  exception_handlers.SetHandlerInfo(3, 1, 150);
 
   extern void GenerateIncrement(Assembler* assembler);
   Assembler _assembler_;
@@ -2750,10 +2751,14 @@
   const ExceptionHandlers& handlers =
       ExceptionHandlers::Handle(code.exception_handlers());
   EXPECT_EQ(kNumEntries, handlers.Length());
-  EXPECT_EQ(10, handlers.TryIndex(0));
+  RawExceptionHandlers::HandlerInfo info;
+  handlers.GetHandlerInfo(0, &info);
+  EXPECT_EQ(-1, handlers.OuterTryIndex(0));
+  EXPECT_EQ(-1, info.outer_try_index);
   EXPECT_EQ(20, handlers.HandlerPC(0));
-  EXPECT_EQ(80, handlers.TryIndex(5));
-  EXPECT_EQ(150, handlers.HandlerPC(5));
+  EXPECT_EQ(20, info.handler_pc);
+  EXPECT_EQ(1, handlers.OuterTryIndex(3));
+  EXPECT_EQ(150, handlers.HandlerPC(3));
 }
 
 
diff --git a/runtime/vm/os_linux.cc b/runtime/vm/os_linux.cc
index 3c7495b..2e6d12e 100644
--- a/runtime/vm/os_linux.cc
+++ b/runtime/vm/os_linux.cc
@@ -250,7 +250,8 @@
 word OS::ActivationFrameAlignment() {
 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
   const int kMinimumAlignment = 16;
-#elif defined(TARGET_ARCH_ARM)
+#elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
+  // TODO(regis): Verify alignment constraints on MIPS.
   const int kMinimumAlignment = 8;
 #else
 #error Unsupported architecture.
@@ -268,7 +269,8 @@
 word OS::PreferredCodeAlignment() {
 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
   const int kMinimumAlignment = 16;
-#elif defined(TARGET_ARCH_ARM)
+#elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
+  // TODO(regis): Verify alignment constraints on MIPS.
   const int kMinimumAlignment = 16;
 #else
 #error Unsupported architecture.
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index aacdda0..4077274 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -29,10 +29,6 @@
 DEFINE_FLAG(bool, silent_warnings, false, "Silence warnings.");
 DEFINE_FLAG(bool, warn_legacy_map_literal, false,
             "Warning on legacy map literal syntax (single type argument)");
-DEFINE_FLAG(bool, strict_function_literals, false,
-            "enforce new function literal rules");
-DEFINE_FLAG(bool, fail_legacy_abstract, false,
-            "error on explicit use of abstract on class members");
 
 static void CheckedModeHandler(bool value) {
   FLAG_enable_asserts = value;
@@ -368,14 +364,14 @@
 
 String* Parser::CurrentLiteral() const {
   String& result = String::ZoneHandle();
-  result ^= tokens_iterator_.CurrentLiteral();
+  result |= tokens_iterator_.CurrentLiteral();
   return &result;
 }
 
 
 RawDouble* Parser::CurrentDoubleLiteral() const {
   LiteralToken& token = LiteralToken::Handle();
-  token ^= tokens_iterator_.CurrentToken();
+  token |= tokens_iterator_.CurrentToken();
   ASSERT(token.kind() == Token::kDOUBLE);
   return reinterpret_cast<RawDouble*>(token.value());
 }
@@ -383,7 +379,7 @@
 
 RawInteger* Parser::CurrentIntegerLiteral() const {
   LiteralToken& token = LiteralToken::Handle();
-  token ^= tokens_iterator_.CurrentToken();
+  token |= tokens_iterator_.CurrentToken();
   ASSERT(token.kind() == Token::kINTEGER);
   return reinterpret_cast<RawInteger*>(token.value());
 }
@@ -630,7 +626,7 @@
   bool has_constructor() const {
     Function& func = Function::Handle();
     for (int i = 0; i < functions_.Length(); i++) {
-      func ^= functions_.At(i);
+      func |= functions_.At(i);
       if (func.kind() == RawFunction::kConstructor) {
         return true;
       }
@@ -664,7 +660,7 @@
     String& test_name = String::Handle();
     Field& field = Field::Handle();
     for (int i = 0; i < fields_.Length(); i++) {
-      field ^= fields_.At(i);
+      field |= fields_.At(i);
       test_name = field.name();
       if (name.Equals(test_name)) {
         return &field;
@@ -681,7 +677,7 @@
     String& test_name = String::Handle();
     Function& func = Function::Handle();
     for (int i = 0; i < functions_.Length(); i++) {
-      func ^= functions_.At(i);
+      func |= functions_.At(i);
       test_name = func.name();
       if (name.Equals(test_name)) {
         return &func;
@@ -756,6 +752,9 @@
     case RawFunction::kConstImplicitGetter:
       node_sequence = parser.ParseStaticConstGetter(func);
       break;
+    case RawFunction::kMethodExtractor:
+      node_sequence = parser.ParseMethodExtractor(func);
+      break;
     default:
       UNREACHABLE();
   }
@@ -984,6 +983,37 @@
 }
 
 
+SequenceNode* Parser::ParseMethodExtractor(const Function& func) {
+  TRACE_PARSER("ParseMethodExtractor");
+  ParamList params;
+
+  const intptr_t ident_pos = func.token_pos();
+  ASSERT(func.token_pos() == 0);
+  ASSERT(current_class().raw() == func.Owner());
+  params.AddReceiver(ReceiverType(ident_pos));
+  ASSERT(func.num_fixed_parameters() == 1);  // Receiver.
+  ASSERT(!func.HasOptionalParameters());
+
+  // Build local scope for function and populate with the formal parameters.
+  OpenFunctionBlock(func);
+  AddFormalParamsToScope(&params, current_block_->scope);
+
+  // Receiver is local 0.
+  LocalVariable* receiver = current_block_->scope->VariableAt(0);
+  LoadLocalNode* load_receiver = new LoadLocalNode(ident_pos, receiver);
+
+  ClosureNode* closure = new ClosureNode(
+      ident_pos,
+      Function::ZoneHandle(func.extracted_method_closure()),
+      load_receiver,
+      NULL);
+
+  ReturnNode* return_node = new ReturnNode(ident_pos, closure);
+  current_block_->statements->Add(return_node);
+  return CloseBlock();
+}
+
+
 void Parser::SkipBlock() {
   ASSERT(CurrentToken() == Token::kLBRACE);
   GrowableArray<Token::Kind> token_stack(8);
@@ -1333,6 +1363,13 @@
 }
 
 
+static const String& PrivateCoreLibName(const String& str) {
+  const Library& core_lib = Library::Handle(Library::CoreLibrary());
+  const String& private_name = String::ZoneHandle(core_lib.PrivateName(str));
+  return private_name;
+}
+
+
 StaticCallNode* Parser::BuildInvocationMirrorAllocation(
     intptr_t call_pos,
     const String& function_name,
@@ -1361,7 +1398,8 @@
       Class::Handle(LookupCoreClass(Symbols::InvocationMirror()));
   ASSERT(!mirror_class.IsNull());
   const Function& allocation_function = Function::ZoneHandle(
-      mirror_class.LookupStaticFunction(Symbols::AllocateInvocationMirror()));
+      mirror_class.LookupStaticFunction(
+          PrivateCoreLibName(Symbols::AllocateInvocationMirror())));
   ASSERT(!allocation_function.IsNull());
   return new StaticCallNode(call_pos, allocation_function, arguments);
 }
@@ -1728,7 +1766,7 @@
   Field& field = Field::Handle();
   SequenceNode* initializers = current_block_->statements;
   for (int field_num = 0; field_num < fields.Length(); field_num++) {
-    field ^= fields.At(field_num);
+    field |= fields.At(field_num);
     if (field.is_static() || !field.is_final()) {
       continue;
     }
@@ -1760,10 +1798,10 @@
   Field& f = Field::Handle();
   const intptr_t saved_pos = TokenPos();
   for (int i = 0; i < fields.Length(); i++) {
-    f ^= fields.At(i);
+    f |= fields.At(i);
     if (!f.is_static() && f.has_initializer()) {
       Field& field = Field::ZoneHandle();
-      field ^= fields.At(i);
+      field |= fields.At(i);
       if (field.is_final()) {
         // Final fields with initializer expression may not be initialized
         // again by constructors. Remember that this field is already
@@ -2859,14 +2897,6 @@
   TRACE_PARSER("ParseClassMemberDefinition");
   MemberDesc member;
   current_member_ = &member;
-  if ((CurrentToken() == Token::kABSTRACT) &&
-      (LookaheadToken(1) != Token::kLPAREN)) {
-    if (FLAG_fail_legacy_abstract) {
-      ErrorMsg("illegal use of abstract");
-    }
-    ConsumeToken();
-    member.has_abstract = true;
-  }
   if ((CurrentToken() == Token::kEXTERNAL) &&
       (LookaheadToken(1) != Token::kLPAREN)) {
     ConsumeToken();
@@ -3108,7 +3138,7 @@
       ErrorMsg(classname_pos, "'%s' is already defined",
                class_name.ToCString());
     }
-    cls ^= obj.raw();
+    cls |= obj.raw();
     if (is_patch) {
       String& patch = String::Handle(
           String::Concat(Symbols::PatchSpace(), class_name));
@@ -4730,25 +4760,10 @@
   result_type = Type::DynamicType();
 
   intptr_t ident_pos = TokenPos();
-  if (FLAG_strict_function_literals) {
-    if (is_literal) {
-      ASSERT(CurrentToken() == Token::kLPAREN);
-      function_name = &Symbols::AnonymousClosure();
-    } else {
-      if (CurrentToken() == Token::kVOID) {
-        ConsumeToken();
-        result_type = Type::VoidType();
-      } else if ((CurrentToken() == Token::kIDENT) &&
-                 (LookaheadToken(1) != Token::kLPAREN)) {
-        result_type = ParseType(ClassFinalizer::kCanonicalize);
-      }
-      ident_pos = TokenPos();
-      variable_name = ExpectIdentifier("function name expected");
-      function_name = variable_name;
-    }
+  if (is_literal) {
+    ASSERT(CurrentToken() == Token::kLPAREN);
+    function_name = &Symbols::AnonymousClosure();
   } else {
-    // TODO(hausner) remove this block once support for old-style function
-    // literals is gone.
     if (CurrentToken() == Token::kVOID) {
       ConsumeToken();
       result_type = Type::VoidType();
@@ -4757,16 +4772,8 @@
       result_type = ParseType(ClassFinalizer::kCanonicalize);
     }
     ident_pos = TokenPos();
-    if (IsIdentifier()) {
-      variable_name = CurrentLiteral();
-      function_name = variable_name;
-      ConsumeToken();
-    } else {
-      if (!is_literal) {
-        ErrorMsg("function name expected");
-      }
-      function_name = &Symbols::AnonymousClosure();
-    }
+    variable_name = ExpectIdentifier("function name expected");
+    function_name = variable_name;
   }
 
   if (CurrentToken() != Token::kLPAREN) {
@@ -5173,46 +5180,18 @@
 
 
 bool Parser::IsFunctionLiteral() {
-  // TODO(hausner): Remove code block that supports old-style function
-  // literals.
-  if (FLAG_strict_function_literals) {
-    if (CurrentToken() != Token::kLPAREN || !allow_function_literals_) {
-      return false;
-    }
-    const intptr_t saved_pos = TokenPos();
-    bool is_function_literal = false;
-    SkipToMatchingParenthesis();
-    if ((CurrentToken() == Token::kLBRACE) ||
-        (CurrentToken() == Token::kARROW)) {
-      is_function_literal = true;
-    }
-    SetPosition(saved_pos);
-    return is_function_literal;
-  } else {
-    if (!allow_function_literals_) {
-      return false;
-    }
-    const intptr_t saved_pos = TokenPos();
-    bool is_function_literal = false;
-    if (IsIdentifier() && (LookaheadToken(1) == Token::kLPAREN)) {
-      ConsumeToken();  // Consume function identifier.
-    } else if (TryParseReturnType()) {
-      if (!IsIdentifier()) {
-        SetPosition(saved_pos);
-        return false;
-      }
-      ConsumeToken();  // Comsume function identifier.
-    }
-    if (CurrentToken() == Token::kLPAREN) {
-      SkipToMatchingParenthesis();
-      if ((CurrentToken() == Token::kLBRACE) ||
-          (CurrentToken() == Token::kARROW)) {
-        is_function_literal = true;
-      }
-    }
-    SetPosition(saved_pos);
-    return is_function_literal;
+  if (CurrentToken() != Token::kLPAREN || !allow_function_literals_) {
+    return false;
   }
+  const intptr_t saved_pos = TokenPos();
+  bool is_function_literal = false;
+  SkipToMatchingParenthesis();
+  if ((CurrentToken() == Token::kLBRACE) ||
+      (CurrentToken() == Token::kARROW)) {
+    is_function_literal = true;
+  }
+  SetPosition(saved_pos);
+  return is_function_literal;
 }
 
 
@@ -5408,7 +5387,7 @@
             TokenPos(), Integer::ZoneHandle(Integer::New(TokenPos()))));
         current_block_->statements->Add(
             MakeStaticCall(Symbols::FallThroughError(),
-                           Symbols::ThrowNew(),
+                           PrivateCoreLibName(Symbols::ThrowNew()),
                            arguments));
       }
       break;
@@ -5752,7 +5731,7 @@
   arguments->Add(new LiteralNode(end,
       Integer::ZoneHandle(Integer::New(end))));
   return MakeStaticCall(Symbols::AssertionError(),
-                        Symbols::ThrowNew(),
+                        PrivateCoreLibName(Symbols::ThrowNew()),
                         arguments);
 }
 
@@ -5969,6 +5948,8 @@
   const intptr_t handler_pos = TokenPos();
   OpenBlock();  // Start the catch block sequence.
   current_block_->scope->AddLabel(end_catch_label);
+  const GrowableObjectArray& handler_types =
+      GrowableObjectArray::Handle(GrowableObjectArray::New());
   while ((CurrentToken() == Token::kCATCH) || IsLiteral("on")) {
     const intptr_t catch_pos = TokenPos();
     CatchParamDesc exception_param;
@@ -6061,11 +6042,26 @@
           catch_pos, Token::kIS, exception_var, exception_type);
       current_block_->statements->Add(
           new IfNode(catch_pos, type_cond_expr, catch_handler, NULL));
+
+      // Do not add uninstantiated types (e.g. type parameter T or
+      // generic type List<T>), since the debugger won't be able to
+      // instantiate it when walking the stack.
+      // This means that the debugger is not able to determine whether
+      // an exception is caught if the catch clause uses generic types.
+      // It will report the exception as uncaught when in fact it might
+      // be caught and handled when we unwind the stack.
+      if (exception_param.type->IsInstantiated()) {
+        handler_types.Add(*exception_param.type);
+      }
     } else {
       // No exception type exists in the catch specifier so execute the
       // catch handler code unconditionally.
       current_block_->statements->Add(catch_handler);
       generic_catch_seen = true;
+      // This catch clause will handle all exceptions. We can safely forget
+      // all previous catch clause types.
+      handler_types.SetLength(0);
+      handler_types.Add(*exception_param.type);
     }
     SequenceNode* catch_clause = CloseBlock();
 
@@ -6118,11 +6114,13 @@
                       new LoadLocalNode(handler_pos, catch_excp_var),
                       new LoadLocalNode(handler_pos, catch_trace_var)));
   }
-  CatchClauseNode* catch_block = new CatchClauseNode(handler_pos,
-                                                     catch_handler_list,
-                                                     context_var,
-                                                     catch_excp_var,
-                                                     catch_trace_var);
+  CatchClauseNode* catch_block =
+      new CatchClauseNode(handler_pos,
+                          catch_handler_list,
+                          Array::ZoneHandle(Array::MakeArray(handler_types)),
+                          context_var,
+                          catch_excp_var,
+                          catch_trace_var);
 
   // Now create the try/catch ast node and return it. If there is a label
   // on the try/catch, close the block that's embedding the try statement
@@ -6580,7 +6578,9 @@
   const Error& error = Error::Handle(type.malformed_error());
   arguments->Add(new LiteralNode(type_pos, String::ZoneHandle(
       Symbols::New(error.ToErrorCString()))));
-  return MakeStaticCall(Symbols::TypeError(), Symbols::ThrowNew(), arguments);
+  return MakeStaticCall(Symbols::TypeError(),
+                        PrivateCoreLibName(Symbols::ThrowNew()),
+                        arguments);
 }
 
 
@@ -6610,7 +6610,7 @@
   // List existingArgumentNames.
   arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle()));
   return MakeStaticCall(Symbols::NoSuchMethodError(),
-                        Symbols::ThrowNew(),
+                        PrivateCoreLibName(Symbols::ThrowNew()),
                         arguments);
 }
 
@@ -7113,7 +7113,7 @@
         // canonicalized strings.
         ASSERT(CurrentLiteral()->IsSymbol());
         for (int i = 0; i < names.Length(); i++) {
-          arg_name ^= names.At(i);
+          arg_name |= names.At(i);
           if (CurrentLiteral()->Equals(arg_name)) {
             ErrorMsg("duplicate named argument");
           }
@@ -7402,7 +7402,7 @@
           if (primary_node->primary().IsClass()) {
             // If the primary node referred to a class we are loading a
             // qualified static field.
-            cls ^= primary_node->primary().raw();
+            cls |= primary_node->primary().raw();
           }
         }
         if (cls.IsNull()) {
@@ -8135,7 +8135,7 @@
     intptr_t num_imports = library_.num_imports();
     Object& imported_obj = Object::Handle();
     for (int i = 0; i < num_imports; i++) {
-      import ^= library_.ImportAt(i);
+      import |= library_.ImportAt(i);
       imported_obj = LookupNameInImport(import, name);
       if (!imported_obj.IsNull()) {
         const Library& lib = Library::Handle(import.library());
@@ -8238,7 +8238,7 @@
   Object& resolved_obj = Object::Handle();
   const Array& imports = Array::Handle(prefix.imports());
   for (intptr_t i = 0; i < prefix.num_imports(); i++) {
-    import ^= imports.At(i);
+    import |= imports.At(i);
     resolved_obj = LookupNameInImport(import, name);
     if (!resolved_obj.IsNull()) {
       obj = resolved_obj.raw();
@@ -8579,7 +8579,8 @@
         Class::Handle(LookupCoreClass(Symbols::List()));
     ASSERT(!factory_class.IsNull());
     const Function& factory_method = Function::ZoneHandle(
-        factory_class.LookupFactory(Symbols::ListLiteralFactory()));
+        factory_class.LookupFactory(
+            PrivateCoreLibName(Symbols::ListLiteralFactory())));
     ASSERT(!factory_method.IsNull());
     if (!type_arguments.IsNull() &&
         !type_arguments.IsInstantiated() &&
@@ -8791,7 +8792,7 @@
     constr_args->Add(new LiteralNode(literal_pos, key_value_array));
     const Function& map_constr =
         Function::ZoneHandle(immutable_map_class.LookupConstructor(
-            Symbols::ImmutableMapConstructor()));
+            PrivateCoreLibName(Symbols::ImmutableMapConstructor())));
     ASSERT(!map_constr.IsNull());
     const Object& constructor_result = Object::Handle(
         EvaluateConstConstructorCall(immutable_map_class,
@@ -8811,7 +8812,8 @@
         Class::Handle(LookupCoreClass(Symbols::Map()));
     ASSERT(!factory_class.IsNull());
     const Function& factory_method = Function::ZoneHandle(
-        factory_class.LookupFactory(Symbols::MapLiteralFactory()));
+        factory_class.LookupFactory(
+            PrivateCoreLibName(Symbols::MapLiteralFactory())));
     ASSERT(!factory_method.IsNull());
     if (!map_type_arguments.IsNull() &&
         !map_type_arguments.IsInstantiated() &&
@@ -9024,7 +9026,7 @@
     arguments->Add(new LiteralNode(
         TokenPos(), String::ZoneHandle(type_class_name.raw())));
     return MakeStaticCall(Symbols::AbstractClassInstantiationError(),
-                          Symbols::ThrowNew(),
+                          PrivateCoreLibName(Symbols::ThrowNew()),
                           arguments);
   }
   String& error_message = String::Handle();
@@ -9119,7 +9121,8 @@
   const Class& cls = Class::Handle(LookupCoreClass(Symbols::StringBase()));
   ASSERT(!cls.IsNull());
   const Function& func =
-      Function::Handle(cls.LookupStaticFunction(Symbols::Interpolate()));
+      Function::Handle(cls.LookupStaticFunction(
+          PrivateCoreLibName(Symbols::Interpolate())));
   ASSERT(!func.IsNull());
 
   // Build the array of literal values to interpolate.
@@ -9135,7 +9138,7 @@
 
   // Call interpolation function.
   String& concatenated = String::ZoneHandle();
-  concatenated ^= DartEntry::InvokeStatic(func, interpolate_arg);
+  concatenated |= DartEntry::InvokeStatic(func, interpolate_arg);
   if (concatenated.IsUnhandledException()) {
     ErrorMsg("Exception thrown in Parser::Interpolate");
   }
@@ -9211,7 +9214,7 @@
         new ArgumentListNode(values->token_pos());
     interpolate_arg->Add(values);
     primary = MakeStaticCall(Symbols::StringBase(),
-                             Symbols::Interpolate(),
+                             PrivateCoreLibName(Symbols::Interpolate()),
                              interpolate_arg);
   }
   return primary;
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 1b117b4..5fa2eca 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -394,6 +394,7 @@
   SequenceNode* ParseInstanceGetter(const Function& func);
   SequenceNode* ParseInstanceSetter(const Function& func);
   SequenceNode* ParseStaticConstGetter(const Function& func);
+  SequenceNode* ParseMethodExtractor(const Function& func);
 
   void ChainNewBlock(LocalScope* outer_scope);
   void OpenBlock();
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 534c38c..de55c74 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -226,7 +226,7 @@
       case kExceptionHandlersCid: {
         const RawExceptionHandlers* raw_handlers =
             reinterpret_cast<const RawExceptionHandlers*>(this);
-        intptr_t num_handlers = Smi::Value(raw_handlers->ptr()->length_);
+        intptr_t num_handlers = raw_handlers->ptr()->length_;
         instance_size = ExceptionHandlers::InstanceSize(num_handlers);
         break;
       }
@@ -523,9 +523,10 @@
 intptr_t RawExceptionHandlers::VisitExceptionHandlersPointers(
     RawExceptionHandlers* raw_obj, ObjectPointerVisitor* visitor) {
   RawExceptionHandlers* obj = raw_obj->ptr();
-  intptr_t length = Smi::Value(obj->length_);
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&obj->length_));
-  return ExceptionHandlers::InstanceSize(length);
+  intptr_t len = obj->length_;
+  visitor->VisitPointer(
+      reinterpret_cast<RawObject**>(&obj->handled_types_data_));
+  return ExceptionHandlers::InstanceSize(len);
 }
 
 
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index f720e97..078e07e 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -540,9 +540,11 @@
     kImplicitGetter,     // represents an implicit getter for fields.
     kImplicitSetter,     // represents an implicit setter for fields.
     kConstImplicitGetter,  // represents an implicit const getter for fields.
+    kMethodExtractor,  // converts method into implicit closure on the receiver.
   };
 
  private:
+  friend class Class;
   RAW_HEAP_OBJECT_IMPLEMENTATION(Function);
 
   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); }
@@ -858,12 +860,25 @@
 
 
 class RawExceptionHandlers : public RawObject {
+ public:
+  // The index into the ExceptionHandlers table corresponds to
+  // the try_index of the handler.
+  struct HandlerInfo {
+    intptr_t outer_try_index;  // Try block index of enclosing try block.
+    intptr_t handler_pc;       // PC value of handler.
+  };
+ private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers);
 
-  RawSmi* length_;  // Number of exception handler entries.
+  // Number of exception handler entries.
+  intptr_t length_;
 
-  // Variable length data follows here.
-  intptr_t data_[0];
+  // Array with [length_] entries. Each entry is an array of all handled
+  // exception types.
+  RawArray* handled_types_data_;
+
+  // Exception handler info of length [length_].
+  HandlerInfo data_[0];
 };
 
 
@@ -1297,6 +1312,8 @@
 
   // Variable length data follows here.
   int8_t data_[0];
+
+  friend class Object;
 };
 
 
diff --git a/runtime/vm/resolver.cc b/runtime/vm/resolver.cc
index 23d46b4..8b60ea3 100644
--- a/runtime/vm/resolver.cc
+++ b/runtime/vm/resolver.cc
@@ -8,6 +8,7 @@
 #include "vm/isolate.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
+#include "vm/symbols.h"
 
 namespace dart {
 
@@ -71,6 +72,47 @@
 }
 
 
+// Method extractors are used to create implicit closures from methods.
+// When an expression obj.M is evaluated for the first time and receiver obj
+// does not have a getter called M but has a method called M then an extractor
+// is created and injected as a getter (under the name get:M) into the class
+// ownining method M.
+static RawFunction* CreateMethodExtractor(const String& getter_name,
+                                          const Function& method) {
+  const Function& closure_function =
+      Function::Handle(method.ImplicitClosureFunction());
+
+  const Class& owner = Class::Handle(closure_function.Owner());
+  Function& extractor = Function::Handle(
+    Function::New(String::Handle(Symbols::New(getter_name)),
+                  RawFunction::kMethodExtractor,
+                  false,  // Not static.
+                  false,  // Not const.
+                  false,  // Not abstract.
+                  false,  // Not external.
+                  owner,
+                  0));  // No token position.
+
+  // Initialize signature: receiver is a single fixed parameter.
+  const intptr_t kNumParameters = 1;
+  extractor.set_num_fixed_parameters(kNumParameters);
+  extractor.SetNumOptionalParameters(0, 0);
+  extractor.set_parameter_types(Array::Handle(Array::New(kNumParameters,
+                                                         Heap::kOld)));
+  extractor.set_parameter_names(Array::Handle(Array::New(kNumParameters,
+                                                         Heap::kOld)));
+  extractor.SetParameterTypeAt(0, Type::Handle(Type::DynamicType()));
+  extractor.SetParameterNameAt(0, Symbols::This());
+  extractor.set_result_type(Type::Handle(Type::DynamicType()));
+
+  extractor.set_extracted_method_closure(closure_function);
+
+  owner.AddFunction(extractor);
+
+  return extractor.raw();
+}
+
+
 RawFunction* Resolver::ResolveDynamicAnyArgs(
     const Class& receiver_class,
     const String& function_name) {
@@ -80,14 +122,30 @@
               function_name.ToCString(),
               String::Handle(cls.Name()).ToCString());
   }
+
+  const bool is_getter = Field::IsGetterName(function_name);
+  String& field_name = String::Handle();
+  if (is_getter) {
+    field_name |= Field::NameFromGetter(function_name);
+  }
+
   // Now look for an instance function whose name matches function_name
   // in the class.
-  Function& function =
-      Function::Handle(cls.LookupDynamicFunction(function_name));
-  while (function.IsNull()) {
+  Function& function = Function::Handle();
+  while (function.IsNull() && !cls.IsNull()) {
+    function |= cls.LookupDynamicFunction(function_name);
+
+    // Getter invocation might actually be a method extraction.
+    if (is_getter && function.IsNull()) {
+      function |= cls.LookupDynamicFunction(field_name);
+      if (!function.IsNull()) {
+        // We were looking for the getter but found a method with the same name.
+        // Create a method extractor and return it.
+        function |= CreateMethodExtractor(function_name, function);
+      }
+    }
+
     cls = cls.SuperClass();
-    if (cls.IsNull()) break;
-    function = cls.LookupDynamicFunction(function_name);
   }
   return function.raw();
 }
@@ -105,7 +163,7 @@
     // Check if we are referring to a top level function.
     const Object& object = Object::Handle(library.LookupObject(function_name));
     if (!object.IsNull() && object.IsFunction()) {
-      function ^= object.raw();
+      function |= object.raw();
       if (!function.AreValidArguments(num_arguments, argument_names, NULL)) {
         if (FLAG_trace_resolving) {
           String& error_message = String::Handle();
diff --git a/runtime/vm/runtime_entry_mips.cc b/runtime/vm/runtime_entry_mips.cc
new file mode 100644
index 0000000..4d5a0d2
--- /dev/null
+++ b/runtime/vm/runtime_entry_mips.cc
@@ -0,0 +1,18 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_MIPS)
+
+#include "vm/runtime_entry.h"
+
+namespace dart {
+
+void RuntimeEntry::Call(Assembler* assembler) const {
+  UNIMPLEMENTED();
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/scanner.cc b/runtime/vm/scanner.cc
index 5c589e0..6dae332 100644
--- a/runtime/vm/scanner.cc
+++ b/runtime/vm/scanner.cc
@@ -312,7 +312,7 @@
       if (char_pos == ident_length) {
         if (keywords_[i].keyword_symbol == NULL) {
           String& symbol = String::ZoneHandle();
-          symbol ^= keyword_symbol_table_.At(i);
+          symbol |= keyword_symbol_table_.At(i);
           ASSERT(!symbol.IsNull());
           keywords_[i].keyword_symbol = &symbol;
         }
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index 42614f0..d5bf92a 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -294,9 +294,11 @@
 
 
 LocalVariable* LocalScope::LocalLookupVariable(const String& name) const {
+  ASSERT(name.IsSymbol());
   for (intptr_t i = 0; i < variables_.length(); i++) {
     LocalVariable* var = variables_[i];
-    if (var->name().Equals(name) && !var->is_invisible_) {
+    ASSERT(var->name().IsSymbol());
+    if ((var->name().raw() == name.raw()) && !var->is_invisible_) {
       return var;
     }
   }
diff --git a/runtime/vm/scopes_test.cc b/runtime/vm/scopes_test.cc
index 9f4fdb3..6ef2172 100644
--- a/runtime/vm/scopes_test.cc
+++ b/runtime/vm/scopes_test.cc
@@ -12,18 +12,18 @@
 TEST_CASE(LocalScope) {
   // Allocate a couple of local variables first.
   const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType());
-  const String& a = String::ZoneHandle(String::New("a"));
+  const String& a = String::ZoneHandle(Symbols::New("a"));
   LocalVariable* var_a =
       new LocalVariable(Scanner::kDummyTokenIndex, a, dynamic_type);
   LocalVariable* inner_var_a =
       new LocalVariable(Scanner::kDummyTokenIndex, a, dynamic_type);
-  const String& b = String::ZoneHandle(String::New("b"));
+  const String& b = String::ZoneHandle(Symbols::New("b"));
   LocalVariable* var_b =
       new LocalVariable(Scanner::kDummyTokenIndex, b, dynamic_type);
-  const String& c = String::ZoneHandle(String::New("c"));
+  const String& c = String::ZoneHandle(Symbols::New("c"));
   LocalVariable* var_c =
       new LocalVariable(Scanner::kDummyTokenIndex, c, dynamic_type);
-  const String& L = String::ZoneHandle(String::New("L"));
+  const String& L = String::ZoneHandle(Symbols::New("L"));
   SourceLabel* label_L =
       new SourceLabel(Scanner::kDummyTokenIndex, L, SourceLabel::kFor);
 
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index e52aa8f..8fb425a 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -152,27 +152,17 @@
     return false;  // Stub frames do not have exception handlers.
   }
 
-  // First try to find pc descriptor for the current pc.
-  intptr_t try_index = -1;
+  // Find pc descriptor for the current pc.
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(code.pc_descriptors());
   for (intptr_t i = 0; i < descriptors.Length(); i++) {
     if ((static_cast<uword>(descriptors.PC(i)) == pc()) &&
         (descriptors.TryIndex(i) != -1)) {
-      try_index = descriptors.TryIndex(i);
-      break;
-    }
-  }
-  if (try_index != -1) {
-    // We found a pc descriptor, now try to see if we have an
-    // exception catch handler for this try index.
-    const ExceptionHandlers& handlers =
-        ExceptionHandlers::Handle(code.exception_handlers());
-    for (intptr_t j = 0; j < handlers.Length(); j++) {
-      if (handlers.TryIndex(j) == try_index) {
-        *handler_pc = handlers.HandlerPC(j);
-        return true;
-      }
+      const intptr_t try_index = descriptors.TryIndex(i);
+      const ExceptionHandlers& handlers =
+          ExceptionHandlers::Handle(code.exception_handlers());
+      *handler_pc = handlers.HandlerPC(try_index);
+      return true;
     }
   }
   return false;
@@ -325,7 +315,7 @@
     index_ += 1;
     intptr_t deopt_instr = deopt_info_.Instruction(cur_index);
     ASSERT(deopt_instr != DeoptInstr::kRetBeforeAddress);
-    if ((deopt_instr == DeoptInstr::kRetAfterAddress)) {
+    if (deopt_instr == DeoptInstr::kRetAfterAddress) {
       intptr_t deopt_from_index = deopt_info_.FromIndex(cur_index);
       *pc = DeoptInstr::GetRetAfterAddress(deopt_from_index,
                                            object_table_,
diff --git a/runtime/vm/stack_frame_mips.cc b/runtime/vm/stack_frame_mips.cc
new file mode 100644
index 0000000..500a8e6
--- /dev/null
+++ b/runtime/vm/stack_frame_mips.cc
@@ -0,0 +1,47 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_MIPS)
+
+#include "vm/stack_frame.h"
+
+namespace dart {
+
+intptr_t StackFrame::PcAddressOffsetFromSp() {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+uword StackFrame::GetCallerFp() const {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+uword StackFrame::GetCallerSp() const {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+intptr_t EntryFrame::ExitLinkOffset() {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+void StackFrameIterator::SetupLastExitFrameData() {
+  UNIMPLEMENTED();
+}
+
+
+void StackFrameIterator::SetupNextExitFrameData() {
+  UNIMPLEMENTED();
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index b942c17..dfd8aa9b 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -45,7 +45,7 @@
 
 
 #define STUB_CODE_GENERATE(name)                                               \
-  code ^= Generate("_stub_"#name, StubCode::Generate##name##Stub);             \
+  code |= Generate("_stub_"#name, StubCode::Generate##name##Stub);             \
   name##_entry_ = new StubEntry("_stub_"#name, code);
 
 
@@ -107,7 +107,7 @@
     Assembler assembler;
     const char* name = cls.ToCString();
     StubCode::GenerateAllocationStubForClass(&assembler, cls);
-    stub ^= Code::FinalizeCode(name, &assembler);
+    stub |= Code::FinalizeCode(name, &assembler);
     cls.set_allocation_stub(stub);
     if (FLAG_disassemble_stubs) {
       OS::Print("Code for allocation stub '%s': {\n", name);
@@ -126,7 +126,7 @@
     Assembler assembler;
     const char* name = func.ToCString();
     StubCode::GenerateAllocationStubForClosure(&assembler, func);
-    stub ^= Code::FinalizeCode(name, &assembler);
+    stub |= Code::FinalizeCode(name, &assembler);
     func.set_closure_allocation_stub(stub);
     if (FLAG_disassemble_stubs) {
       OS::Print("Code for closure allocation stub '%s': {\n", name);
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 8498944..50c189b 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -11,13 +11,13 @@
 
 namespace dart {
 
-void StubCode::GenerateDartCallToRuntimeStub(Assembler* assembler) {
-  __ Unimplemented("DartCallToRuntime stub");
+void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) {
+  __ Unimplemented("CallToRuntime stub");
 }
 
 
-void StubCode::GenerateStubCallToRuntimeStub(Assembler* assembler) {
-  __ Unimplemented("StubCallToRuntime stub");
+void StubCode::GeneratePrintStopMessageStub(Assembler* assembler) {
+  __ Unimplemented("PrintStopMessage stub");
 }
 
 
@@ -36,8 +36,13 @@
 }
 
 
-void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) {
-  __ Unimplemented("MegamorphicLookup stub");
+void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) {
+  __ Unimplemented("InstanceFunctionLookup stub");
+}
+
+
+void StubCode::GenerateDeoptimizeLazyStub(Assembler* assembler) {
+  __ Unimplemented("DeoptimizeLazy stub");
 }
 
 
@@ -46,6 +51,11 @@
 }
 
 
+void StubCode::GenerateMegamorphicMissStub(Assembler* assembler) {
+  __ Unimplemented("MegamorphicMiss stub");
+}
+
+
 void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
   __ Unimplemented("AllocateArray stub");
 }
@@ -66,6 +76,11 @@
 }
 
 
+void StubCode::GenerateUpdateStoreBufferStub(Assembler* assembler) {
+  __ Unimplemented("UpdateStoreBuffer stub");
+}
+
+
 void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
                                               const Class& cls) {
   __ Unimplemented("AllocateObject stub");
@@ -83,6 +98,23 @@
 }
 
 
+void StubCode::GenerateOptimizedUsageCounterIncrement(Assembler* assembler) {
+  __ Unimplemented("OptimizedUsageCounterIncrement stub");
+}
+
+
+void StubCode::GenerateUsageCounterIncrement(Assembler* assembler,
+                                             Register temp_reg) {
+  __ Unimplemented("UsageCounterIncrement stub");
+}
+
+
+void StubCode::GenerateNArgsCheckInlineCacheStub(Assembler* assembler,
+                                                 intptr_t num_args) {
+  __ Unimplemented("NArgsCheckInlineCache stub");
+}
+
+
 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
   __ Unimplemented("GenerateOneArgCheckInlineCacheStub stub");
 }
@@ -93,26 +125,67 @@
 }
 
 
+void StubCode::GenerateThreeArgsCheckInlineCacheStub(Assembler* assembler) {
+  __ Unimplemented("GenerateThreeArgsCheckInlineCacheStub stub");
+}
+
+
+void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub(
+    Assembler* assembler) {
+  GenerateOptimizedUsageCounterIncrement(assembler);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1);
+}
+
+
+void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub(
+    Assembler* assembler) {
+  GenerateOptimizedUsageCounterIncrement(assembler);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2);
+}
+
+
+void StubCode::GenerateThreeArgsOptimizedCheckInlineCacheStub(
+    Assembler* assembler) {
+  GenerateOptimizedUsageCounterIncrement(assembler);
+  GenerateNArgsCheckInlineCacheStub(assembler, 3);
+}
+
+
+void StubCode::GenerateClosureCallInlineCacheStub(Assembler* assembler) {
+  GenerateNArgsCheckInlineCacheStub(assembler, 1);
+}
+
+
+void StubCode::GenerateMegamorphicCallStub(Assembler* assembler) {
+  GenerateNArgsCheckInlineCacheStub(assembler, 1);
+}
+
+
 void StubCode::GenerateBreakpointStaticStub(Assembler* assembler) {
   __ Unimplemented("BreakpointStatic stub");
 }
 
+
 void StubCode::GenerateBreakpointReturnStub(Assembler* assembler) {
   __ Unimplemented("BreakpointReturn stub");
 }
 
+
 void StubCode::GenerateBreakpointDynamicStub(Assembler* assembler) {
   __ Unimplemented("BreakpointDynamic stub");
 }
 
+
 void StubCode::GenerateSubtype1TestCacheStub(Assembler* assembler) {
   __ Unimplemented("Subtype1TestCache Stub");
 }
 
+
 void StubCode::GenerateSubtype2TestCacheStub(Assembler* assembler) {
   __ Unimplemented("Subtype2TestCache Stub");
 }
 
+
 void StubCode::GenerateSubtype3TestCacheStub(Assembler* assembler) {
   __ Unimplemented("Subtype3TestCache Stub");
 }
@@ -138,6 +211,21 @@
   __ Unimplemented("JumpToErrorHandler Stub");
 }
 
+
+void StubCode::GenerateEqualityWithNullArgStub(Assembler* assembler) {
+  __ Unimplemented("EqualityWithNullArg stub");
+}
+
+
+void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
+  __ Unimplemented("OptimizeFunction stub");
+}
+
+
+void StubCode::GenerateIdenticalWithNumberCheckStub(Assembler* assembler) {
+  __ Unimplemented("IdenticalWithNumberCheck stub");
+}
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_ARM
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 45c714e..bc47212 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -81,7 +81,7 @@
   __ movl(ECX, Address(CTX, Isolate::top_context_offset()));
 
   // Reset Context pointer in Isolate structure.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ movl(Address(CTX, Isolate::top_context_offset()), raw_null);
 
@@ -171,7 +171,7 @@
   __ movl(EDI, Address(CTX, Isolate::top_context_offset()));
 
   // Reset Context pointer in Isolate structure.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ movl(Address(CTX, Isolate::top_context_offset()), raw_null);
 
@@ -186,7 +186,7 @@
 // Input parameters:
 //   EDX: arguments descriptor array.
 void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   AssemblerMacros::EnterStubFrame(assembler);
   __ pushl(EDX);  // Preserve arguments descriptor array.
@@ -207,7 +207,7 @@
 // (invalid because its function was optimized or deoptimized).
 // EDX: arguments descriptor array.
 void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
@@ -229,7 +229,7 @@
 //   EDX: smi-tagged argument count, may be zero.
 // Uses EAX, EBX, ECX, EDX.
 static void PushArgumentsArray(Assembler* assembler, intptr_t arg_offset) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
 
   // Allocate array to store arguments of caller.
@@ -264,7 +264,7 @@
 void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) {
   AssemblerMacros::EnterStubFrame(assembler);
 
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ pushl(raw_null);  // Space for the return value.
 
@@ -434,7 +434,7 @@
   __ pushl(ECX);
   __ pushl(EDX);
 
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Instructions::null()));
   __ pushl(raw_null);  // Space for the result of the runtime call.
   __ pushl(EAX);  // Pass receiver.
@@ -470,7 +470,7 @@
 // The newly allocated object is returned in EAX.
 void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
   Label slow_case;
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
 
   if (FLAG_inline_alloc) {
@@ -607,7 +607,7 @@
 //       when trying to resolve the call.
 // Uses EDI.
 void StubCode::GenerateCallClosureFunctionStub(Assembler* assembler) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
 
   // Load num_args.
@@ -835,7 +835,7 @@
 // EAX: new allocated RawContext object.
 // EBX and EDX are destroyed.
 void StubCode::GenerateAllocateContextStub(Assembler* assembler) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   if (FLAG_inline_alloc) {
     const Class& context_class = Class::ZoneHandle(Object::context_class());
@@ -908,7 +908,7 @@
     // EBX: Isolate, not an object.
     __ movl(FieldAddress(EAX, Context::isolate_offset()), EBX);
 
-    const Immediate raw_null =
+    const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
     // Setup the parent field.
     // EAX: new object.
@@ -1019,7 +1019,7 @@
                                               const Class& cls) {
   const intptr_t kObjectTypeArgumentsOffset = 2 * kWordSize;
   const intptr_t kInstantiatorTypeArgumentsOffset = 1 * kWordSize;
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   // The generated code is different if the class is parameterized.
   const bool is_cls_parameterized =
@@ -1112,7 +1112,7 @@
     __ movl(Address(EAX, Instance::tags_offset()), Immediate(tags));
 
     // Initialize the remaining words of the object.
-    const Immediate raw_null =
+    const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
 
     // EAX: new object start.
@@ -1193,7 +1193,7 @@
 // Uses EAX, EBX, ECX, EDX as temporary registers.
 void StubCode::GenerateAllocationStubForClosure(Assembler* assembler,
                                                 const Function& func) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   ASSERT(func.IsClosureFunction());
   const bool is_implicit_static_closure =
@@ -1350,7 +1350,7 @@
 void StubCode::GenerateCallNoSuchMethodFunctionStub(Assembler* assembler) {
   // The target function was not found, so invoke method
   // "dynamic noSuchMethod(InvocationMirror invocation)".
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ movl(EDI, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
   __ movl(EAX, Address(EBP, EDI, TIMES_2, kWordSize));  // Get receiver.
@@ -1534,7 +1534,7 @@
   __ j(NOT_EQUAL, &loop, Assembler::kNearJump);
 
   // IC miss.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   // Compute address of arguments (first read number of arguments from
   // arguments descriptor array and then compute address on the stack).
@@ -1696,7 +1696,7 @@
   // calling into the runtime.
   AssemblerMacros::EnterStubFrame(assembler);
   __ pushl(EDX);  // Preserve arguments descriptor.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ pushl(raw_null);  // Room for result.
   __ CallRuntime(kBreakpointStaticHandlerRuntimeEntry);
@@ -1775,7 +1775,7 @@
   const intptr_t kInstantiatorTypeArgumentsInBytes = 1 * kWordSize;
   const intptr_t kInstanceOffsetInBytes = 2 * kWordSize;
   const intptr_t kCacheOffsetInBytes = 3 * kWordSize;
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ movl(EAX, Address(ESP, kInstanceOffsetInBytes));
   if (n > 1) {
@@ -2023,7 +2023,7 @@
 // EDI: function to be reoptimized.
 // EDX: argument descriptor (preserved).
 void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   AssemblerMacros::EnterStubFrame(assembler);
   __ pushl(EDX);
diff --git a/runtime/vm/stub_code_ia32_test.cc b/runtime/vm/stub_code_ia32_test.cc
index 222fd0f..19ca0f1 100644
--- a/runtime/vm/stub_code_ia32_test.cc
+++ b/runtime/vm/stub_code_ia32_test.cc
@@ -71,7 +71,7 @@
       *CreateFunction("Test_CallRuntimeStubCode"), &_assembler_));
   const Function& function = RegisterFakeFunction(kName, code);
   Smi& result = Smi::Handle();
-  result ^= DartEntry::InvokeStatic(function, Object::empty_array());
+  result |= DartEntry::InvokeStatic(function, Object::empty_array());
   EXPECT_EQ((value1 - value2), result.Value());
 }
 
@@ -106,7 +106,7 @@
       *CreateFunction("Test_CallLeafRuntimeStubCode"), &_assembler_));
   const Function& function = RegisterFakeFunction(kName, code);
   Smi& result = Smi::Handle();
-  result ^= DartEntry::InvokeStatic(function, Object::empty_array());
+  result |= DartEntry::InvokeStatic(function, Object::empty_array());
   EXPECT_EQ((value1 + value2), result.Value());
 }
 
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
new file mode 100644
index 0000000..a782ec5
--- /dev/null
+++ b/runtime/vm/stub_code_mips.cc
@@ -0,0 +1,231 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_MIPS)
+
+#include "vm/stub_code.h"
+
+#define __ assembler->
+
+namespace dart {
+
+void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) {
+  __ Unimplemented("CallToRuntime stub");
+}
+
+
+void StubCode::GeneratePrintStopMessageStub(Assembler* assembler) {
+  __ Unimplemented("PrintStopMessage stub");
+}
+
+
+void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) {
+  __ Unimplemented("CallNativeCFunction stub");
+}
+
+
+void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
+  __ Unimplemented("CallStaticFunction stub");
+}
+
+
+void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
+  __ Unimplemented("FixCallersTarget stub");
+}
+
+
+void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) {
+  __ Unimplemented("InstanceFunctionLookup stub");
+}
+
+
+void StubCode::GenerateDeoptimizeLazyStub(Assembler* assembler) {
+  __ Unimplemented("DeoptimizeLazy stub");
+}
+
+
+void StubCode::GenerateDeoptimizeStub(Assembler* assembler) {
+  __ Unimplemented("Deoptimize stub");
+}
+
+
+void StubCode::GenerateMegamorphicMissStub(Assembler* assembler) {
+  __ Unimplemented("MegamorphicMiss stub");
+}
+
+
+void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
+  __ Unimplemented("AllocateArray stub");
+}
+
+
+void StubCode::GenerateCallClosureFunctionStub(Assembler* assembler) {
+  __ Unimplemented("CallClosureFunction stub");
+}
+
+
+void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
+  __ Unimplemented("InvokeDartCode stub");
+}
+
+
+void StubCode::GenerateAllocateContextStub(Assembler* assembler) {
+  __ Unimplemented("AllocateContext stub");
+}
+
+
+void StubCode::GenerateUpdateStoreBufferStub(Assembler* assembler) {
+  __ Unimplemented("UpdateStoreBuffer stub");
+}
+
+
+void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
+                                              const Class& cls) {
+  __ Unimplemented("AllocateObject stub");
+}
+
+
+void StubCode::GenerateAllocationStubForClosure(Assembler* assembler,
+                                                const Function& func) {
+  __ Unimplemented("AllocateClosure stub");
+}
+
+
+void StubCode::GenerateCallNoSuchMethodFunctionStub(Assembler* assembler) {
+  __ Unimplemented("CallNoSuchMethodFunction stub");
+}
+
+
+void StubCode::GenerateOptimizedUsageCounterIncrement(Assembler* assembler) {
+  __ Unimplemented("OptimizedUsageCounterIncrement stub");
+}
+
+
+void StubCode::GenerateUsageCounterIncrement(Assembler* assembler,
+                                             Register temp_reg) {
+  __ Unimplemented("UsageCounterIncrement stub");
+}
+
+
+void StubCode::GenerateNArgsCheckInlineCacheStub(Assembler* assembler,
+                                                 intptr_t num_args) {
+  __ Unimplemented("NArgsCheckInlineCache stub");
+}
+
+
+void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
+  __ Unimplemented("GenerateOneArgCheckInlineCacheStub stub");
+}
+
+
+void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
+  __ Unimplemented("GenerateTwoArgsCheckInlineCacheStub stub");
+}
+
+
+void StubCode::GenerateThreeArgsCheckInlineCacheStub(Assembler* assembler) {
+  __ Unimplemented("GenerateThreeArgsCheckInlineCacheStub stub");
+}
+
+
+void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub(
+    Assembler* assembler) {
+  GenerateOptimizedUsageCounterIncrement(assembler);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1);
+}
+
+
+void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub(
+    Assembler* assembler) {
+  GenerateOptimizedUsageCounterIncrement(assembler);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2);
+}
+
+
+void StubCode::GenerateThreeArgsOptimizedCheckInlineCacheStub(
+    Assembler* assembler) {
+  GenerateOptimizedUsageCounterIncrement(assembler);
+  GenerateNArgsCheckInlineCacheStub(assembler, 3);
+}
+
+
+void StubCode::GenerateClosureCallInlineCacheStub(Assembler* assembler) {
+  GenerateNArgsCheckInlineCacheStub(assembler, 1);
+}
+
+
+void StubCode::GenerateMegamorphicCallStub(Assembler* assembler) {
+  GenerateNArgsCheckInlineCacheStub(assembler, 1);
+}
+
+
+void StubCode::GenerateBreakpointStaticStub(Assembler* assembler) {
+  __ Unimplemented("BreakpointStatic stub");
+}
+
+
+void StubCode::GenerateBreakpointReturnStub(Assembler* assembler) {
+  __ Unimplemented("BreakpointReturn stub");
+}
+
+
+void StubCode::GenerateBreakpointDynamicStub(Assembler* assembler) {
+  __ Unimplemented("BreakpointDynamic stub");
+}
+
+
+void StubCode::GenerateSubtype1TestCacheStub(Assembler* assembler) {
+  __ Unimplemented("Subtype1TestCache Stub");
+}
+
+
+void StubCode::GenerateSubtype2TestCacheStub(Assembler* assembler) {
+  __ Unimplemented("Subtype2TestCache Stub");
+}
+
+
+void StubCode::GenerateSubtype3TestCacheStub(Assembler* assembler) {
+  __ Unimplemented("Subtype3TestCache Stub");
+}
+
+
+// Return the current stack pointer address, used to stack alignment
+// checks.
+void StubCode::GenerateGetStackPointerStub(Assembler* assembler) {
+  __ Unimplemented("GetStackPointer Stub");
+}
+
+
+// Jump to the exception handler.
+// No Result.
+void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
+  __ Unimplemented("JumpToExceptionHandler Stub");
+}
+
+
+// Jump to the error handler.
+// No Result.
+void StubCode::GenerateJumpToErrorHandlerStub(Assembler* assembler) {
+  __ Unimplemented("JumpToErrorHandler Stub");
+}
+
+
+void StubCode::GenerateEqualityWithNullArgStub(Assembler* assembler) {
+  __ Unimplemented("EqualityWithNullArg stub");
+}
+
+
+void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
+  __ Unimplemented("OptimizeFunction stub");
+}
+
+
+void StubCode::GenerateIdenticalWithNumberCheckStub(Assembler* assembler) {
+  __ Unimplemented("IdenticalWithNumberCheck stub");
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 659c7ec..70d9c36 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -82,7 +82,7 @@
   __ movq(RBX, Address(CTX, Isolate::top_context_offset()));
 
   // Reset Context pointer in Isolate structure.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ movq(Address(CTX, Isolate::top_context_offset()), raw_null);
 
@@ -170,7 +170,7 @@
   __ movq(R8, Address(CTX, Isolate::top_context_offset()));
 
   // Reset Context pointer in Isolate structure.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ movq(Address(CTX, Isolate::top_context_offset()), raw_null);
 
@@ -185,7 +185,7 @@
 // Input parameters:
 //   R10: arguments descriptor array.
 void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   AssemblerMacros::EnterStubFrame(assembler);
   __ pushq(R10);  // Preserve arguments descriptor array.
@@ -206,7 +206,7 @@
 // (invalid because its function was optimized or deoptimized).
 // R10: arguments descriptor array.
 void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   AssemblerMacros::EnterStubFrame(assembler);
   __ pushq(R10);  // Preserve arguments descriptor array.
@@ -225,7 +225,7 @@
 // Input parameters:
 //   R10: smi-tagged argument count, may be zero.
 static void PushArgumentsArray(Assembler* assembler, intptr_t arg_offset) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
 
   // Allocate array to store arguments of caller.
@@ -259,7 +259,7 @@
 void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) {
   AssemblerMacros::EnterStubFrame(assembler);
 
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ pushq(raw_null);  // Space for the return value.
 
@@ -430,7 +430,7 @@
   __ pushq(RBX);
   __ pushq(R10);
 
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Instructions::null()));
   __ pushq(raw_null);  // Space for the result of the runtime call.
   __ pushq(RAX);  // Receiver.
@@ -465,7 +465,7 @@
 // The newly allocated object is returned in RAX.
 void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
   Label slow_case;
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
 
   if (FLAG_inline_alloc) {
@@ -596,7 +596,7 @@
 //       called, the stub accesses the closure from this location directly
 //       when trying to resolve the call.
 void StubCode::GenerateCallClosureFunctionStub(Assembler* assembler) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
 
   // Load num_args.
@@ -823,7 +823,7 @@
 // Output:
 // RAX: new allocated RawContext object.
 void StubCode::GenerateAllocateContextStub(Assembler* assembler) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   if (FLAG_inline_alloc) {
     const Class& context_class = Class::ZoneHandle(Object::context_class());
@@ -899,7 +899,7 @@
     // R13: Isolate, not an object.
     __ movq(FieldAddress(RAX, Context::isolate_offset()), R13);
 
-    const Immediate raw_null =
+    const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
     // Setup the parent field.
     // RAX: new object.
@@ -1002,7 +1002,7 @@
                                               const Class& cls) {
   const intptr_t kObjectTypeArgumentsOffset = 2 * kWordSize;
   const intptr_t kInstantiatorTypeArgumentsOffset = 1 * kWordSize;
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   // The generated code is different if the class is parameterized.
   const bool is_cls_parameterized =
@@ -1098,7 +1098,7 @@
     __ movq(Address(RAX, Instance::tags_offset()), Immediate(tags));
 
     // Initialize the remaining words of the object.
-    const Immediate raw_null =
+    const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
 
     // RAX: new object start.
@@ -1177,7 +1177,7 @@
 //   RSP : points to return address.
 void StubCode::GenerateAllocationStubForClosure(Assembler* assembler,
                                                 const Function& func) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   ASSERT(func.IsClosureFunction());
   const bool is_implicit_static_closure =
@@ -1336,7 +1336,7 @@
 void StubCode::GenerateCallNoSuchMethodFunctionStub(Assembler* assembler) {
   // The target function was not found, so invoke method
   // "dynamic noSuchMethod(InvocationMirror invocation)".
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ movq(R13, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
   __ movq(RAX, Address(RBP, R13, TIMES_4, kWordSize));  // Get receiver.
@@ -1517,7 +1517,7 @@
   __ j(NOT_EQUAL, &loop, Assembler::kNearJump);
 
   // IC miss.
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   // Compute address of arguments (first read number of arguments from
   // arguments descriptor array and then compute address on the stack).
@@ -1669,7 +1669,7 @@
 //  R10: Arguments descriptor array.
 //  TOS(0): return address (Dart code).
 void StubCode::GenerateBreakpointStaticStub(Assembler* assembler) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   AssemblerMacros::EnterStubFrame(assembler);
   __ pushq(R10);  // Preserve arguments descriptor.
@@ -1740,7 +1740,7 @@
 // Result in RCX: null -> not found, otherwise result (true or false).
 static void GenerateSubtypeNTestCacheStub(Assembler* assembler, int n) {
   ASSERT((1 <= n) && (n <= 3));
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   const intptr_t kInstantiatorTypeArgumentsInBytes = 1 * kWordSize;
   const intptr_t kInstanceOffsetInBytes = 2 * kWordSize;
@@ -1987,7 +1987,7 @@
 // RDI: function to be reoptimized.
 // R10: argument descriptor (preserved).
 void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
-  const Immediate raw_null =
+  const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   AssemblerMacros::EnterStubFrame(assembler);
   __ pushq(R10);
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index b0e1480..0424891 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -110,7 +110,7 @@
                                       isolate->object_store()->symbol_table());
   intptr_t table_size_index = symbol_table.Length() - 1;
   dart::Smi& used = Smi::Handle();
-  used ^= symbol_table.At(table_size_index);
+  used |= symbol_table.At(table_size_index);
   return used.Value();
 }
 
@@ -182,14 +182,14 @@
   // First check if a symbol exists in the vm isolate for these characters.
   symbol_table = Dart::vm_isolate()->object_store()->symbol_table();
   intptr_t index = FindIndex(symbol_table, characters, len, hash);
-  symbol ^= symbol_table.At(index);
+  symbol |= symbol_table.At(index);
   if (symbol.IsNull()) {
     // Now try in the symbol table of the current isolate.
     symbol_table = isolate->object_store()->symbol_table();
     index = FindIndex(symbol_table, characters, len, hash);
     // Since we leave enough room in the table to guarantee, that we find an
     // empty spot, index is the insertion point if symbol is null.
-    symbol ^= symbol_table.At(index);
+    symbol |= symbol_table.At(index);
     if (symbol.IsNull()) {
       // Allocate new result string.
       symbol = (*new_string)(characters, len, Heap::kOld);
@@ -243,14 +243,14 @@
   // First check if a symbol exists in the vm isolate for these characters.
   symbol_table = Dart::vm_isolate()->object_store()->symbol_table();
   intptr_t index = FindIndex(symbol_table, str, begin_index, len, hash);
-  symbol ^= symbol_table.At(index);
+  symbol |= symbol_table.At(index);
   if (symbol.IsNull()) {
     // Now try in the symbol table of the current isolate.
     symbol_table = isolate->object_store()->symbol_table();
     index = FindIndex(symbol_table, str, begin_index, len, hash);
     // Since we leave enough room in the table to guarantee, that we find an
     // empty spot, index is the insertion point if symbol is null.
-    symbol ^= symbol_table.At(index);
+    symbol |= symbol_table.At(index);
     if (symbol.IsNull()) {
       if (str.IsOld() && begin_index == 0 && len == str.Length()) {
         // Reuse the incoming str as the symbol value.
@@ -285,14 +285,14 @@
     // First dump VM symbol table stats.
     symbol_table = Dart::vm_isolate()->object_store()->symbol_table();
     table_size = symbol_table.Length() - 1;
-    used ^= symbol_table.At(table_size);
+    used |= symbol_table.At(table_size);
     OS::Print("VM Isolate: Number of symbols : %"Pd"\n", used.Value());
     OS::Print("VM Isolate: Symbol table capacity : %"Pd"\n", table_size);
 
     // Now dump regular isolate symbol table stats.
     symbol_table = Isolate::Current()->object_store()->symbol_table();
     table_size = symbol_table.Length() - 1;
-    used ^= symbol_table.At(table_size);
+    used |= symbol_table.At(table_size);
     OS::Print("Isolate: Number of symbols : %"Pd"\n", used.Value());
     OS::Print("Isolate: Symbol table capacity : %"Pd"\n", table_size);
 
@@ -319,7 +319,7 @@
   String& element = String::Handle();
   dart::Object& new_element = Object::Handle();
   for (intptr_t i = 0; i < table_size; i++) {
-    element ^= symbol_table.At(i);
+    element |= symbol_table.At(i);
     if (!element.IsNull()) {
       intptr_t hash = element.Hash();
       intptr_t index = hash % new_table_size;
@@ -354,7 +354,7 @@
   symbol.SetCanonical();  // Mark object as being canonical.
   symbol_table.SetAt(index, symbol);  // Remember the new symbol.
   dart::Smi& used = Smi::Handle();
-  used ^= symbol_table.At(table_size);
+  used |= symbol_table.At(table_size);
   intptr_t used_elements = used.Value() + 1;  // One more element added.
   used = Smi::New(used_elements);
   symbol_table.SetAt(table_size, used);  // Update used count.
@@ -377,10 +377,10 @@
   intptr_t num_collisions = 0;
 
   String& symbol = String::Handle();
-  symbol ^= symbol_table.At(index);
+  symbol |= symbol_table.At(index);
   while (!symbol.IsNull() && !symbol.Equals(characters, len)) {
     index = (index + 1) % table_size;  // Move to next element.
-    symbol ^= symbol_table.At(index);
+    symbol |= symbol_table.At(index);
     num_collisions += 1;
   }
   if (FLAG_dump_symbol_stats) {
@@ -418,10 +418,10 @@
   intptr_t num_collisions = 0;
 
   String& symbol = String::Handle();
-  symbol ^= symbol_table.At(index);
+  symbol |= symbol_table.At(index);
   while (!symbol.IsNull() && !symbol.Equals(str, begin_index, len)) {
     index = (index + 1) % table_size;  // Move to next element.
-    symbol ^= symbol_table.At(index);
+    symbol |= symbol_table.At(index);
     num_collisions += 1;
   }
   if (FLAG_dump_symbol_stats) {
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index edd9e79..3fdc4b0 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -188,6 +188,10 @@
   V(SwitchExpr, ":switch_expr")                                                \
   V(TwoNewlines, "\n\n")                                                       \
   V(TwoSpaces, "  ")                                                           \
+  V(_instanceOf, "_instanceOf")                                                \
+  V(PrivateGetterPrefix, "get:_")                                              \
+  V(PrivateSetterPrefix, "set:_")                                              \
+
 
 // Contains a list of frequently used strings in a canonicalized form. This
 // list is kept in the vm_isolate in order to share the copy across isolates
diff --git a/runtime/vm/vm.gypi b/runtime/vm/vm.gypi
index df34375..6c887e7 100644
--- a/runtime/vm/vm.gypi
+++ b/runtime/vm/vm.gypi
@@ -10,6 +10,7 @@
     'corelib_cc_file': '<(SHARED_INTERMEDIATE_DIR)/corelib_gen.cc',
     'corelib_patch_cc_file': '<(SHARED_INTERMEDIATE_DIR)/corelib_patch_gen.cc',
     'collection_cc_file': '<(SHARED_INTERMEDIATE_DIR)/collection_gen.cc',
+    'collection_dev_cc_file': '<(SHARED_INTERMEDIATE_DIR)/collection_dev_gen.cc',
     'math_cc_file': '<(SHARED_INTERMEDIATE_DIR)/math_gen.cc',
     'math_patch_cc_file': '<(SHARED_INTERMEDIATE_DIR)/math_patch_gen.cc',
     'mirrors_cc_file': '<(SHARED_INTERMEDIATE_DIR)/mirrors_gen.cc',
@@ -89,6 +90,7 @@
         'generate_corelib_cc_file',
         'generate_corelib_patch_cc_file',
         'generate_collection_cc_file',
+        'generate_collection_dev_cc_file',
         'generate_math_cc_file',
         'generate_math_patch_cc_file',
         'generate_isolate_cc_file',
@@ -114,6 +116,7 @@
         '<(corelib_cc_file)',
         '<(corelib_patch_cc_file)',
         '<(collection_cc_file)',
+        '<(collection_dev_cc_file)',
         '<(math_cc_file)',
         '<(math_patch_cc_file)',
         '<(isolate_cc_file)',
@@ -353,6 +356,63 @@
       ]
     },
     {
+      'target_name': 'generate_collection_dev_cc_file',
+      'type': 'none',
+      'variables': {
+        'collection_dev_dart': '<(SHARED_INTERMEDIATE_DIR)/collection_dev_gen.dart',
+      },
+      'includes': [
+        # Load the shared collection_dev library sources.
+        '../../sdk/lib/collection_dev/collection_dev_sources.gypi',
+      ],
+      'sources/': [
+        # Exclude all .[cc|h] files.
+        # This is only here for reference. Excludes happen after
+        # variable expansion, so the script has to do its own
+        # exclude processing of the sources being passed.
+        ['exclude', '\\.cc|h$'],
+      ],
+      'actions': [
+        {
+          'action_name': 'generate_collection_dev_dart',
+          'inputs': [
+            '../tools/concat_library.py',
+            '<@(_sources)',
+          ],
+          'outputs': [
+            '<(collection_dev_dart)',
+          ],
+          'action': [
+            'python',
+            '<@(_inputs)',
+            '--output', '<(collection_dev_dart)',
+          ],
+          'message': 'Generating ''<(collection_dev_dart)'' file.',
+        },
+        {
+          'action_name': 'generate_collection_dev_cc',
+          'inputs': [
+            '../tools/create_string_literal.py',
+            '<(builtin_in_cc_file)',
+            '<(collection_dev_dart)',
+          ],
+          'outputs': [
+            '<(collection_dev_cc_file)',
+          ],
+          'action': [
+            'python',
+            'tools/create_string_literal.py',
+            '--output', '<(collection_dev_cc_file)',
+            '--input_cc', '<(builtin_in_cc_file)',
+            '--include', 'vm/bootstrap.h',
+            '--var_name', 'dart::Bootstrap::collection_dev_source_',
+            '<(collection_dev_dart)',
+          ],
+          'message': 'Generating ''<(collection_dev_cc_file)'' file.'
+        },
+      ]
+    },
+    {
       'target_name': 'generate_math_cc_file',
       'type': 'none',
       'variables': {
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 1425c95..a769c92 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -1,4 +1,4 @@
-# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+# Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
@@ -12,15 +12,22 @@
     'assembler.cc',
     'assembler.h',
     'assembler_test.cc',
+    'assembler_arm.cc',
     'assembler_arm.h',
     'assembler_ia32.cc',
     'assembler_ia32.h',
     'assembler_ia32_test.cc',
     'assembler_macros.h',
+    'assembler_macros_arm.cc',
+    'assembler_macros_arm.h',
     'assembler_macros_ia32.cc',
     'assembler_macros_ia32.h',
+    'assembler_macros_mips.cc',
+    'assembler_macros_mips.h',
     'assembler_macros_x64.cc',
     'assembler_macros_x64.h',
+    'assembler_mips.cc',
+    'assembler_mips.h',
     'assembler_x64.cc',
     'assembler_x64.h',
     'assembler_x64_test.cc',
@@ -71,6 +78,7 @@
     'code_patcher_arm.cc',
     'code_patcher_ia32.cc',
     'code_patcher_ia32_test.cc',
+    'code_patcher_mips.cc',
     'code_patcher_x64.cc',
     'code_patcher_x64_test.cc',
     'compiler.h',
@@ -78,13 +86,15 @@
     'compiler_stats.h',
     'compiler_stats.cc',
     'compiler_test.cc',
-    'constants_ia32.h',
-    'constants_x64.h',
     'constants_arm.h',
+    'constants_ia32.h',
+    'constants_mips.h',
+    'constants_x64.h',
     'cpu.h',
-    'cpu_ia32.cc',
-    'cpu_x64.cc',
     'cpu_arm.cc',
+    'cpu_ia32.cc',
+    'cpu_mips.cc',
+    'cpu_x64.cc',
     'cpu_test.cc',
     'custom_isolate_test.cc',
     'dart.cc',
@@ -99,17 +109,19 @@
     'dart_entry_test.cc',
     'debugger.cc',
     'debugger.h',
-    'debugger_ia32.cc',
-    'debugger_x64.cc',
     'debugger_arm.cc',
+    'debugger_ia32.cc',
+    'debugger_mips.cc',
+    'debugger_x64.cc',
     'debugger_api_impl_test.cc',
     'deopt_instructions.cc',
     'deopt_instructions.h',
     'disassembler.cc',
     'disassembler.h',
-    'disassembler_ia32.cc',
-    'disassembler_x64.cc',
     'disassembler_arm.cc',
+    'disassembler_ia32.cc',
+    'disassembler_mips.cc',
+    'disassembler_x64.cc',
     'disassembler_test.cc',
     'debuginfo.h',
     'debuginfo_android.cc',
@@ -132,11 +144,9 @@
     'flow_graph_compiler.cc',
     'flow_graph_compiler.h',
     'flow_graph_compiler_arm.cc',
-    'flow_graph_compiler_arm.h',
     'flow_graph_compiler_ia32.cc',
-    'flow_graph_compiler_ia32.h',
+    'flow_graph_compiler_mips.cc',
     'flow_graph_compiler_x64.cc',
-    'flow_graph_compiler_x64.h',
     'flow_graph_inliner.cc',
     'flow_graph_inliner.h',
     'flow_graph_optimizer.cc',
@@ -174,21 +184,28 @@
     'il_printer.cc',
     'il_printer.h',
     'instructions.h',
+    'instructions_arm.cc',
+    'instructions_arm.h',
     'instructions_ia32.cc',
     'instructions_ia32.h',
     'instructions_ia32_test.cc',
+    'instructions_mips.cc',
+    'instructions_mips.h',
     'instructions_x64.cc',
     'instructions_x64.h',
     'instructions_x64_test.cc',
     'intermediate_language.cc',
     'intermediate_language.h',
+    'intermediate_language_arm.cc',
     'intermediate_language_ia32.cc',
+    'intermediate_language_mips.cc',
     'intermediate_language_x64.cc',
     'intermediate_language_test.cc',
     'intrinsifier.h',
     'intrinsifier.cc',
     'intrinsifier_arm.cc',
     'intrinsifier_ia32.cc',
+    'intrinsifier_mips.cc',
     'intrinsifier_x64.cc',
     'isolate.cc',
     'isolate.h',
@@ -223,6 +240,7 @@
     'object_test.cc',
     'object_arm_test.cc',
     'object_ia32_test.cc',
+    'object_mips_test.cc',
     'object_x64_test.cc',
     'object_store.cc',
     'object_store.h',
@@ -251,6 +269,7 @@
     'runtime_entry.h',
     'runtime_entry_arm.cc',
     'runtime_entry_ia32.cc',
+    'runtime_entry_mips.cc',
     'runtime_entry_x64.cc',
     'runtime_entry_test.cc',
     'scanner.cc',
@@ -268,6 +287,7 @@
     'stack_frame.cc',
     'stack_frame_arm.cc',
     'stack_frame_ia32.cc',
+    'stack_frame_mips.cc',
     'stack_frame_x64.cc',
     'stack_frame.h',
     'stack_frame_test.cc',
@@ -278,6 +298,7 @@
     'stub_code_arm.cc',
     'stub_code_ia32.cc',
     'stub_code_ia32_test.cc',
+    'stub_code_mips.cc',
     'stub_code_x64.cc',
     'stub_code_x64_test.cc',
     'symbols.cc',
diff --git a/sdk/lib/_internal/compiler/implementation/closure.dart b/sdk/lib/_internal/compiler/implementation/closure.dart
index 45a8107..e400f5c 100644
--- a/sdk/lib/_internal/compiler/implementation/closure.dart
+++ b/sdk/lib/_internal/compiler/implementation/closure.dart
@@ -71,6 +71,8 @@
   bool hasFixedBackendName() => true;
   String fixedBackendName() => name.slowToString();
 
+  DartType computeType(Compiler compiler) => compiler.types.dynamicType;
+
   String toString() => "ClosureFieldElement($name)";
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index a03a00a..c805e1e 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -462,6 +462,13 @@
         if (result != null) return result;
       } else if (Elements.isClass(element) || Elements.isTypedef(element)) {
         return makeTypeConstant(element);
+      } else if (send.receiver != null) {
+        // Fall through to error handling.
+      } else if (!Elements.isUnresolved(element)
+                 && element.isVariable()
+                 && element.modifiers.isConst()) {
+        Constant result = handler.compileConstant(element);
+        if (result != null) return result; 
       }
       return signalNotCompileTimeConstant(send);
     } else if (send.isCall) {
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 8f8e077..75a1eaa 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -594,6 +594,7 @@
         'dart/tests/compiler/dart2js_native');
     if (nativeTest
         || libraryName == 'dart:async'
+        || libraryName == 'dart:chrome'
         || libraryName == 'dart:mirrors'
         || libraryName == 'dart:math'
         || libraryName == 'dart:html'
diff --git a/sdk/lib/_internal/compiler/implementation/constant_system.dart b/sdk/lib/_internal/compiler/implementation/constant_system.dart
index 91808d4..0fff580 100644
--- a/sdk/lib/_internal/compiler/implementation/constant_system.dart
+++ b/sdk/lib/_internal/compiler/implementation/constant_system.dart
@@ -48,6 +48,8 @@
   BinaryOperation get subtract;
   BinaryOperation get truncatingDivide;
 
+  const ConstantSystem();
+
   Constant createInt(int i);
   Constant createDouble(double d);
   // We need a diagnostic node to report errors in case the string is malformed.
@@ -69,4 +71,10 @@
   bool isBool(Constant constant);
   /** Returns true if the [constant] is null at runtime. */
   bool isNull(Constant constant);
+
+  Operation lookupUnary(SourceString operator) {
+    if (operator == const SourceString('-')) return negate;
+    if (operator == const SourceString('~')) return bitNot;
+    return null;
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
index 11ff830..6732b8c 100644
--- a/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
+++ b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
@@ -335,7 +335,7 @@
  * that doesn't correctly implement Dart's semantics this constant system will
  * not return the correct values.
  */
-class DartConstantSystem implements ConstantSystem {
+class DartConstantSystem extends ConstantSystem {
   const add = const AddOperation();
   const bitAnd = const BitAndOperation();
   const bitNot = const BitNotOperation();
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index 9896c91..2a49c2f 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -168,13 +168,26 @@
       if (type is TypedefType) return false;
       if (type is InterfaceType) {
         ClassElement element = type.element;
+        // TODO(kasperl): Deal with mixin applications.
+        if (element.isMixinApplication) continue;
         ClassNode node = element.parseNode(compiler);
         // Check class type args.
         processTypeArguments(element, node.typeParameters);
         // Check superclass type args.
         if (node.superclass != null) {
-          NodeList typeArguments = node.superclass.typeArguments;
-          processTypeArguments(element, node.superclass.typeArguments);
+          MixinApplication superMixin = node.superclass.asMixinApplication();
+          if (superMixin != null) {
+            for (Link<Node> link = superMixin.mixins.nodes;
+                 !link.isEmpty;
+                 link = link.tail) {
+              TypeAnnotation currentMixin = link.head;
+              processTypeArguments(element, currentMixin.typeArguments);
+            }
+          } else {
+            TypeAnnotation superclass = node.superclass;
+            NodeList typeArguments = superclass.typeArguments;
+            processTypeArguments(element, typeArguments);
+          }
         }
         // Check interfaces type args.
         for (Node interfaceNode in node.interfaces) {
@@ -297,7 +310,10 @@
       topLevelElements.add(element);
       processElement(element, elementAst);
     }
+
     addClass(classElement) {
+      // TODO(kasperl): Deal with mixin applications.
+      if (classElement.isMixinApplication) return;
       addTopLevel(classElement,
                   new ElementAst.forClassLike(parse(classElement)));
       classMembers.putIfAbsent(classElement, () => new Set());
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/utils.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/utils.dart
index 4c4547d..cd0f527 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/utils.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/utils.dart
@@ -117,6 +117,16 @@
   visitLiteralString(LiteralString node) => new LiteralString(
       node.token, node.dartString);
 
+  visitMixinApplication(MixinApplication node) => new MixinApplication(
+      visit(node.modifiers), visit(node.superclass), visit(node.mixins));
+
+  visitNamedMixinApplication(NamedMixinApplication node) =>
+      new NamedMixinApplication(node.name,
+                                node.typeParameters,
+                                node.mixinApplication,
+                                node.typedefKeyword,
+                                node.endToken);
+
   visitModifiers(Modifiers node) => new Modifiers(visit(node.nodes));
 
   visitNamedArgument(NamedArgument node) => new NamedArgument(
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 7890981..6b29922 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -28,7 +28,6 @@
                                          isUserDefinableOperator,
                                          isMinusOperator;
 
-
 const int STATE_NOT_STARTED = 0;
 const int STATE_STARTED = 1;
 const int STATE_DONE = 2;
@@ -169,7 +168,6 @@
   bool impliesType();
 
   Token position();
-  Token findMyName(Token token);
 
   CompilationUnitElement getCompilationUnit();
   LibraryElement getLibrary();
@@ -641,6 +639,7 @@
   int get resolutionState;
   SourceString get nativeTagInfo;
 
+  bool get isMixinApplication;
   bool get hasBackendMembers;
   bool get hasLocalScopeMembers;
 
@@ -672,6 +671,12 @@
   void addMember(Element element, DiagnosticListener listener);
   void addToScope(Element element, DiagnosticListener listener);
 
+  /**
+   * Add a synthetic nullary constructor if there are no other
+   * constructors.
+   */
+  void addDefaultConstructorIfNeeded(Compiler compiler);
+
   void addBackendMember(Element element);
   void reverseBackendMembers();
 
@@ -688,7 +693,6 @@
   Element lookupSuperInterfaceMember(SourceString memberName,
                                      LibraryElement fromLibrary);
 
-
   Element validateConstructorLookupResults(Selector selector,
                                            Element result,
                                            Element noMatch(Element));
@@ -709,6 +713,11 @@
   void forEachBackendMember(void f(Element member));
 }
 
+abstract class MixinApplicationElement extends ClassElement {
+  ClassElement get mixin;
+  void set mixin(ClassElement value);
+}
+
 abstract class LabelElement extends Element {
   Label get label;
   String get labelName;
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index fd0da9e..5fa9a3b0 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -377,35 +377,22 @@
 
   bool isAmbiguous() => true;
 }
-class ContainerElementX extends ElementX {
-  Link<Element> localMembers = const Link<Element>();
 
-  ContainerElementX(name, kind, enclosingElement)
-    : super(name, kind, enclosingElement);
+class ScopeX {
+  final Map<SourceString, Element> contents = new Map<SourceString, Element>();
 
-  void addMember(Element element, DiagnosticListener listener) {
-    localMembers = localMembers.prepend(element);
-  }
-}
+  bool get isEmpty => contents.isEmpty;
+  Iterable<Element> get values => contents.values;
 
-class ScopeContainerElementX extends ContainerElementX
-    implements ScopeContainerElement {
-  final Map<SourceString, Element> localScope;
-
-  ScopeContainerElementX(name, kind, enclosingElement)
-    : super(name, kind, enclosingElement),
-      localScope = new Map<SourceString, Element>();
-
-  void addMember(Element element, DiagnosticListener listener) {
-    super.addMember(element, listener);
-    addToScope(element, listener);
+  Element lookup(SourceString name) {
+    return contents[name];
   }
 
-  void addToScope(Element element, DiagnosticListener listener) {
+  void add(Element element, DiagnosticListener listener) {
     if (element.isAccessor()) {
-      addAccessorToScope(element, localScope[element.name], listener);
+      addAccessor(element, contents[element.name], listener);
     } else {
-      Element existing = localScope.putIfAbsent(element.name, () => element);
+      Element existing = contents.putIfAbsent(element.name, () => element);
       if (!identical(existing, element)) {
         // TODO(ahe): Do something similar to Resolver.reportErrorWithContext.
         listener.cancel('duplicate definition', token: element.position());
@@ -414,17 +401,8 @@
     }
   }
 
-  Element localLookup(SourceString elementName) {
-    Element result = localScope[elementName];
-    if (result == null && isPatch) {
-      ScopeContainerElementX element = origin;
-      result = element.localScope[elementName];
-    }
-    return result;
-  }
-
   /**
-   * Adds a definition for an [accessor] (getter or setter) to a container.
+   * Adds a definition for an [accessor] (getter or setter) to a scope.
    * The definition binds to an abstract field that can hold both a getter
    * and a setter.
    *
@@ -436,9 +414,9 @@
    * element, they are enclosed by the class or compilation unit, as is the
    * abstract field.
    */
-  void addAccessorToScope(Element accessor,
-                          Element existing,
-                          DiagnosticListener listener) {
+  void addAccessor(Element accessor,
+                   Element existing,
+                   DiagnosticListener listener) {
     void reportError(Element other) {
       // TODO(ahe): Do something similar to Resolver.reportErrorWithContext.
       listener.cancel('duplicate definition of ${accessor.name.slowToString()}',
@@ -473,14 +451,16 @@
       } else {
         field.setter = accessor;
       }
-      addToScope(field, listener);
+      add(field, listener);
     }
   }
 }
 
-class CompilationUnitElementX extends ContainerElementX implements CompilationUnitElement {
+class CompilationUnitElementX extends ElementX
+    implements CompilationUnitElement {
   final Script script;
   PartOf partTag;
+  Link<Element> localMembers = const Link<Element>();
 
   CompilationUnitElementX(Script script, LibraryElement library)
     : this.script = script,
@@ -492,7 +472,7 @@
 
   void addMember(Element element, DiagnosticListener listener) {
     // Keep a list of top level members.
-    super.addMember(element, listener);
+    localMembers = localMembers.prepend(element);
     // Provide the member to the library to build scope.
     if (enclosingElement.isPatch) {
       getImplementationLibrary().addMember(element, listener);
@@ -541,7 +521,7 @@
   bool get hasMembers => !localMembers.isEmpty;
 }
 
-class LibraryElementX extends ScopeContainerElementX implements LibraryElement {
+class LibraryElementX extends ElementX implements LibraryElement {
   final Uri uri;
   CompilationUnitElement entryCompilationUnit;
   Link<CompilationUnitElement> compilationUnits =
@@ -549,6 +529,8 @@
   Link<LibraryTag> tags = const Link<LibraryTag>();
   LibraryName libraryTag;
   bool canUseNative = false;
+  Link<Element> localMembers = const Link<Element>();
+  final ScopeX localScope = new ScopeX();
 
   /**
    * If this library is patched, [patch] points to the patch library.
@@ -628,6 +610,23 @@
     }
   }
 
+  void addMember(Element element, DiagnosticListener listener) {
+    localMembers = localMembers.prepend(element);
+    addToScope(element, listener);
+  }
+
+  void addToScope(Element element, DiagnosticListener listener) {
+    localScope.add(element, listener);
+  }
+
+  Element localLookup(SourceString elementName) {
+    Element result = localScope.lookup(elementName);
+    if (result == null && isPatch) {
+      result = origin.localLookup(elementName);
+    }
+    return result;
+  }
+
   /**
    * Returns [:true:] if the export scope has already been computed for this
    * library.
@@ -663,10 +662,10 @@
    * elements have been imported.
    */
   Element find(SourceString elementName) {
-    Element result = localScope[elementName];
+    Element result = localScope.lookup(elementName);
     if (result != null) return result;
     if (origin != null) {
-      result = origin.localScope[elementName];
+      result = origin.localScope.lookup(elementName);
       if (result != null) return result;
     }
     result = importScope[elementName];
@@ -683,7 +682,7 @@
   Element findLocal(SourceString elementName) {
     // TODO(johnniwinther): How to handle injected elements in the patch
     // library?
-    Element result = localScope[elementName];
+    Element result = localScope.lookup(elementName);
     if (result == null || result.getLibrary() != this) return null;
     return result;
   }
@@ -1306,9 +1305,9 @@
   }
 }
 
-abstract class ClassElementX extends ScopeContainerElementX
-    implements ClassElement {
+abstract class BaseClassElementX extends ElementX implements ClassElement {
   final int id;
+
   /**
    * The type of [:this:] for this class declaration.
    *
@@ -1352,24 +1351,33 @@
 
   Link<DartType> allSupertypes;
 
-  // Lazily applied patch of class members.
-  ClassElement patch = null;
-  ClassElement origin = null;
+  BaseClassElementX(SourceString name,
+                    Element enclosing,
+                    this.id,
+                    int initialState)
+      : supertypeLoadState = initialState,
+        resolutionState = initialState,
+        super(name, ElementKind.CLASS, enclosing);
 
-  ClassElementX(SourceString name, Element enclosing, this.id, int initialState)
-    : supertypeLoadState = initialState,
-      resolutionState = initialState,
-      super(name, ElementKind.CLASS, enclosing);
+  int get hashCode => id;
+  ClassElement get patch => super.patch;
+  ClassElement get origin => super.origin;
+  ClassElement get declaration => super.declaration;
+  ClassElement get implementation => super.implementation;
 
-  ClassNode parseNode(Compiler compiler);
+  bool get hasBackendMembers => !backendMembers.isEmpty;
 
   InterfaceType computeType(compiler) {
     if (thisType == null) {
       if (origin == null) {
-        ClassNode node = parseNode(compiler);
-        Link<DartType> parameters =
-            TypeDeclarationElementX.createTypeVariables(this,
-                                                        node.typeParameters);
+        Link<DartType> parameters = const Link<DartType>();
+        // TODO(kasperl): Figure out how to get the type parameters
+        // for a mixin application.
+        if (!isMixinApplication) {
+          ClassNode node = parseNode(compiler);
+          parameters = TypeDeclarationElementX.createTypeVariables(
+              this, node.typeParameters);
+        }
         thisType = new InterfaceType(this, parameters);
         if (parameters.isEmpty) {
           rawType = thisType;
@@ -1389,15 +1397,6 @@
     return thisType;
   }
 
-  bool get isPatched => patch != null;
-  bool get isPatch => origin != null;
-
-  ClassElement get declaration => super.declaration;
-  ClassElement get implementation => super.implementation;
-
-  bool get hasBackendMembers => !backendMembers.isEmpty;
-  bool get hasLocalScopeMembers => !localScope.isEmpty;
-
   /**
    * Return [:true:] if this element is the [:Object:] class for the [compiler].
    */
@@ -1413,6 +1412,15 @@
     return this;
   }
 
+  void addDefaultConstructorIfNeeded(Compiler compiler) {
+    if (hasConstructor) return;
+    FunctionElement constructor =
+        new SynthesizedConstructorElementX.forDefault(this, compiler);
+    setDefaultConstructor(constructor, compiler);
+  }
+
+  void setDefaultConstructor(FunctionElement constructor, Compiler compiler);
+
   void addBackendMember(Element member) {
     backendMembers = backendMembers.prepend(member);
   }
@@ -1438,7 +1446,6 @@
       }
     }
   }
-
   /**
    * Lookup super members for the class. This will ignore constructors.
    */
@@ -1584,14 +1591,6 @@
     return validateConstructorLookupResults(selector, result, noMatch);
   }
 
-  bool get hasConstructor {
-    // Search in scope to be sure we search patched constructors.
-    for (var element in localScope.values) {
-      if (element.isConstructor()) return true;
-    }
-    return false;
-  }
-
   Link<Element> get constructors {
     // TODO(ajohnsen): See if we can avoid this method at some point.
     Link<Element> result = const Link<Element>();
@@ -1679,10 +1678,6 @@
                   includeSuperMembers: includeSuperMembers);
   }
 
-  void forEachLocalMember(void f(Element member)) {
-    localMembers.reverse().forEach(f);
-  }
-
   void forEachBackendMember(void f(Element member)) {
     backendMembers.forEach(f);
   }
@@ -1716,7 +1711,58 @@
   void setNative(String name) {
     nativeTagInfo = new SourceString(name);
   }
-  int get hashCode => id;
+}
+
+abstract class ClassElementX extends BaseClassElementX {
+  // Lazily applied patch of class members.
+  ClassElement patch = null;
+  ClassElement origin = null;
+
+  Link<Element> localMembers = const Link<Element>();
+  final ScopeX localScope = new ScopeX();
+
+  ClassElementX(SourceString name, Element enclosing, int id, int initialState)
+      : super(name, enclosing, id, initialState);
+
+  ClassNode parseNode(Compiler compiler);
+
+  bool get isMixinApplication => false;
+  bool get isPatched => patch != null;
+  bool get isPatch => origin != null;
+  bool get hasLocalScopeMembers => !localScope.isEmpty;
+
+  void addMember(Element element, DiagnosticListener listener) {
+    localMembers = localMembers.prepend(element);
+    addToScope(element, listener);
+  }
+
+  void addToScope(Element element, DiagnosticListener listener) {
+    localScope.add(element, listener);
+  }
+
+  Element localLookup(SourceString elementName) {
+    Element result = localScope.lookup(elementName);
+    if (result == null && isPatch) {
+      result = origin.localLookup(elementName);
+    }
+    return result;
+  }
+
+  void forEachLocalMember(void f(Element member)) {
+    localMembers.reverse().forEach(f);
+  }
+
+  bool get hasConstructor {
+    // Search in scope to be sure we search patched constructors.
+    for (var element in localScope.values) {
+      if (element.isConstructor()) return true;
+    }
+    return false;
+  }
+
+  void setDefaultConstructor(FunctionElement constructor, Compiler compiler) {
+    addToScope(constructor, compiler);
+  }
 
   Scope buildScope() => new ClassScope(enclosingElement.buildScope(), this);
 
@@ -1731,6 +1777,53 @@
   }
 }
 
+class MixinApplicationElementX extends BaseClassElementX
+    implements MixinApplicationElement {
+  final Node cachedNode;
+
+  FunctionElement constructor;
+  ClassElement mixin;
+
+  // TODO(kasperl): The analyzer complains when I don't have these two
+  // fields. This is pretty weird. I cannot replace them with getters.
+  final ClassElement patch = null;
+  final ClassElement origin = null;
+
+  MixinApplicationElementX(SourceString name, Element enclosing, int id,
+                           this.cachedNode)
+      : super(name, enclosing, id, STATE_NOT_STARTED);
+
+  bool get isMixinApplication => true;
+  bool get hasConstructor => constructor != null;
+  bool get hasLocalScopeMembers => false;
+
+  Token position() => cachedNode.getBeginToken();
+
+  Node parseNode(DiagnosticListener listener) => cachedNode;
+
+  Element localLookup(SourceString name) {
+    if (this.name == name) return constructor;
+    if (mixin != null) return mixin.localLookup(name);
+  }
+
+  void forEachLocalMember(void f(Element member)) {
+    if (mixin != null) mixin.forEachLocalMember(f);
+  }
+
+  void addMember(Element element, DiagnosticListener listener) {
+    throw new UnsupportedError("cannot add member to $this");
+  }
+
+  void addToScope(Element element, DiagnosticListener listener) {
+    throw new UnsupportedError("cannot add to scope of $this");
+  }
+
+  void setDefaultConstructor(FunctionElement constructor, Compiler compiler) {
+    assert(!hasConstructor);
+    this.constructor = constructor;
+  }
+}
+
 class LabelElementX extends ElementX implements LabelElement {
 
   // We store the original label here so it can be returned by [parseNode].
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index d561670..8393b4c 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -485,6 +485,13 @@
   void registerDynamicInvocation(HInvokeDynamic node,
                                  Selector selector,
                                  HTypeMap types) {
+    if (selector.isClosureCall()) {
+      // We cannot use the current framework to do optimizations based
+      // on the 'call' selector because we are also generating closure
+      // calls during the emitter phase, which at this point, does not
+      // track parameter types, nor invalidates optimized methods.
+      return;
+    }
     HTypeList providedTypes =
         new HTypeList.fromDynamicInvocation(node, selector, types);
     if (!selectorTypeMap.containsKey(selector)) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
index b36c71c..30c8bc5 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
@@ -141,7 +141,7 @@
  * Constant system following the semantics for Dart code that has been
  * compiled to JavaScript.
  */
-class JavaScriptConstantSystem implements ConstantSystem {
+class JavaScriptConstantSystem extends ConstantSystem {
   const int BITS31 = 0x8FFFFFFF;
   const int BITS32 = 0xFFFFFFFF;
   // The maximum integer value a double can represent without losing
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index 52e73c5..c21d162 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -390,11 +390,14 @@
         $isolate[fieldName] = sentinelInProgress;
         try {
           result = $isolate[fieldName] = lazyValue();
-        } catch (e) {
-          if ($isolate[fieldName] === sentinelInProgress) {
-            $isolate[fieldName] = null;
+        } finally {
+""" // Use try-finally, not try-catch/throw as it destroys the stack trace.
+"""
+          if (result === sentinelUndefined) {
+            if ($isolate[fieldName] === sentinelInProgress) {
+              $isolate[fieldName] = null;
+            }
           }
-          throw e;
         }
       } else if (result === sentinelInProgress) {
         $cyclicThrow(staticName);
@@ -1749,7 +1752,8 @@
                           js.string(internalName),
                           new js.LiteralNumber('$type'),
                           new js.ArrayInitializer.from(
-                              parameters.mappedBy((param) => js.use(param.name)).toList()),
+                              parameters.mappedBy((param) => js.use(param.name))
+                                        .toList()),
                           new js.ArrayInitializer.from(argNames)])]);
       js.Expression function =
           new js.Fun(parameters,
@@ -1868,7 +1872,7 @@
     if (!compiler.codegenWorld.staticFunctionsNeedingGetter.contains(appMain)) {
       Selector selector = new Selector.callClosure(0);
       String invocationName = namer.invocationName(selector);
-      buffer.add("$mainAccess.$invocationName = $mainAccess");
+      buffer.add("$mainAccess.$invocationName = $mainAccess$N");
     }
     return "${namer.isolateAccess(isolateMain)}($mainAccess)";
   }
@@ -2064,7 +2068,7 @@
     instantiatedClasses =
         compiler.codegenWorld.instantiatedClasses.where(computeClassFilter())
             .toSet();
-    neededClasses = instantiatedClasses.toSet();
+    neededClasses = new Set<ClassElement>.from(instantiatedClasses);
     for (ClassElement element in instantiatedClasses) {
       for (ClassElement superclass = element.superclass;
           superclass != null;
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index 42c2571..37286e8 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -178,7 +178,7 @@
     // is generated by string concatenation in applyFunction from
     // js_helper.dart.
     var proposedName = '$base\$$arity';
-    if (base == closureInvocationSelectorName) return proposedName;
+    if (name == closureInvocationSelectorName) return proposedName;
     return getMappedInstanceName(proposedName);
   }
 
@@ -200,7 +200,9 @@
       // We don't mangle the closure invoking function name because it
       // is generated by string concatenation in applyFunction from
       // js_helper.dart.
-      if (selector.isClosureCall()) return "$name$suffix";
+      if (selector.isCall() && name == closureInvocationSelectorName) {
+        return "${name.slowToString()}$suffix";
+      }
       String proposedName = privateName(selector.library, name);
       return getMappedInstanceName('$proposedName$suffix');
     }
diff --git a/sdk/lib/_internal/compiler/implementation/lib/core_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/core_patch.dart
index 372c4d4..1790162 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/core_patch.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/core_patch.dart
@@ -162,15 +162,17 @@
 // Patch for List implementation.
 patch class List<E> {
   patch factory List([int length = 0]) {
+    // Explicit type test is necessary to protect Primitives.newGrowableList in
+    // unchecked mode.
     if ((length is !int) || (length < 0)) {
-      String lengthString = Error.safeToString(length);
-      throw new ArgumentError(
-          "Length must be a positive integer: $lengthString.");
+      throw new ArgumentError("Length must be a positive integer: $length.");
     }
     return Primitives.newGrowableList(length);
   }
 
   patch factory List.fixedLength(int length, {E fill: null}) {
+    // Explicit type test is necessary to protect Primitives.newFixedList in
+    // unchecked mode.
     if ((length is !int) || (length < 0)) {
       throw new ArgumentError("Length must be a positive integer: $length.");
     }
@@ -188,6 +190,8 @@
    * filled with [fill].
    */
   patch factory List.filled(int length, E fill) {
+    // Explicit type test is necessary to protect Primitives.newGrowableList in
+    // unchecked mode.
     if ((length is !int) || (length < 0)) {
       throw new ArgumentError("Length must be a positive integer: $length.");
     }
@@ -249,4 +253,6 @@
 }
 
 // Patch for 'identical' function.
-patch bool identical(Object a, Object b) => Primitives.identical(a, b);
+patch bool identical(Object a, Object b) {
+  return Primitives.identicalImplementation(a, b);
+}
diff --git a/sdk/lib/_internal/compiler/implementation/lib/foreign_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/foreign_helper.dart
index ccc9a4b..c2fd831 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/foreign_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/foreign_helper.dart
@@ -116,6 +116,20 @@
 dynamic DART_CLOSURE_TO_JS(Function function) {}
 
 /**
+ * Returns a raw reference to the JavaScript function which implements
+ * [function].
+ *
+ * Warning: this is dangerous, you should probably use
+ * [DART_CLOSURE_TO_JS] instead. The returned object is not a valid
+ * Dart closure, does not store the isolate context or arity.
+ *
+ * A valid example of where this can be used is as the second argument
+ * to V8's Error.captureStackTrace. See
+ * https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi.
+ */
+dynamic RAW_DART_FUNCTION_REF(Function function) {}
+
+/**
  * Sets the current isolate to [isolate].
  */
 void JS_SET_CURRENT_ISOLATE(var isolate) {}
diff --git a/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart
index ee89270..b8f2870 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart
@@ -162,10 +162,8 @@
     bool isWorkerDefined = globalWorker != null;
 
     isWorker = !isWindowDefined && globalPostMessageDefined;
-    supportsWorkers = false;
-    // TODO(7795): Enable web workers when Timers are supported.
-    // supportsWorkers = isWorker
-    //    || (isWorkerDefined && IsolateNatives.thisScript != null);
+    supportsWorkers = isWorker
+       || (isWorkerDefined && IsolateNatives.thisScript != null);
     fromCommandLine = !isWindowDefined && !isWorker;
   }
 
@@ -183,9 +181,14 @@
   }
 
 
-  /** Close the worker running this code if all isolates are done. */
+  /**
+   * Close the worker running this code if all isolates are done and
+   * there is no active timer.
+   */
   void maybeCloseWorker() {
-    if (isolates.isEmpty) {
+    if (isWorker
+        && isolates.isEmpty
+        && topEventLoop.activeTimerCount == 0) {
       mainManager.postMessage(_serializeMessage({'command': 'close'}));
     }
   }
@@ -209,8 +212,7 @@
   }
 
   /**
-   * Run [code] in the context of the isolate represented by [this]. Note this
-   * is called from JavaScript (see $wrap_call in corejs.dart).
+   * Run [code] in the context of the isolate represented by [this].
    */
   dynamic eval(Function code) {
     var old = _globalState.currentContext;
@@ -253,9 +255,10 @@
 
 /** Represent the event loop on a javascript thread (DOM or worker). */
 class _EventLoop {
-  Queue<_IsolateEvent> events;
+  final Queue<_IsolateEvent> events = new Queue<_IsolateEvent>();
+  int activeTimerCount = 0;
 
-  _EventLoop() : events = new Queue<_IsolateEvent>();
+  _EventLoop();
 
   void enqueue(isolate, fn, msg) {
     events.addLast(new _IsolateEvent(isolate, fn, msg));
@@ -266,26 +269,28 @@
     return events.removeFirst();
   }
 
+  void checkOpenReceivePortsFromCommandLine() {
+    if (_globalState.rootContext != null
+        && _globalState.isolates.containsKey(_globalState.rootContext.id)
+        && _globalState.fromCommandLine
+        && _globalState.rootContext.ports.isEmpty) {
+      // We want to reach here only on the main [_Manager] and only
+      // on the command-line.  In the browser the isolate might
+      // still be alive due to DOM callbacks, but the presumption is
+      // that on the command-line, no future events can be injected
+      // into the event queue once it's empty.  Node has setTimeout
+      // so this presumption is incorrect there.  We think(?) that
+      // in d8 this assumption is valid.
+      throw new Exception("Program exited with open ReceivePorts.");
+    }
+  }
+
   /** Process a single event, if any. */
   bool runIteration() {
     final event = dequeue();
     if (event == null) {
-      if (_globalState.isWorker) {
-        _globalState.maybeCloseWorker();
-      } else if (_globalState.rootContext != null &&
-                 _globalState.isolates.containsKey(
-                     _globalState.rootContext.id) &&
-                 _globalState.fromCommandLine &&
-                 _globalState.rootContext.ports.isEmpty) {
-        // We want to reach here only on the main [_Manager] and only
-        // on the command-line.  In the browser the isolate might
-        // still be alive due to DOM callbacks, but the presumption is
-        // that on the command-line, no future events can be injected
-        // into the event queue once it's empty.  Node has setTimeout
-        // so this presumption is incorrect there.  We think(?) that
-        // in d8 this assumption is valid.
-        throw new Exception("Program exited with open ReceivePorts.");
-      }
+      checkOpenReceivePortsFromCommandLine();
+      _globalState.maybeCloseWorker();
       return false;
     }
     event.process();
@@ -311,8 +316,7 @@
   }
 
   /**
-   * Call [_runHelper] but ensure that worker exceptions are propragated. Note
-   * this is called from JavaScript (see $wrap_call in corejs.dart).
+   * Call [_runHelper] but ensure that worker exceptions are propragated.
    */
   void run() {
     if (!_globalState.isWorker) {
@@ -381,10 +385,10 @@
 const String _SPAWNED_SIGNAL = "spawned";
 
 var globalThis = IsolateNatives.computeGlobalThis();
-var globalWindow = JS('', "#['window']", globalThis);
-var globalWorker = JS('', "#['Worker']", globalThis);
+var globalWindow = JS('', "#.window", globalThis);
+var globalWorker = JS('', "#.Worker", globalThis);
 bool globalPostMessageDefined =
-    JS('', "#['postMessage'] !== (void 0)", globalThis);
+    JS('', "#.postMessage !== (void 0)", globalThis);
 
 class IsolateNatives {
 
@@ -402,9 +406,11 @@
     // executed. The last one is the currently running script.
     for (var script in scripts) {
       var src = JS('String|Null', '# && #.src', script, script);
+      // Filter out the test controller script, and the Dart
+      // bootstrap script.
       if (src != null
           && !src.endsWith('test_controller.js')
-          && !new RegExp('client.dart\.js').hasMatch(src)) {
+          && !src.endsWith('dart.js')) {
         return src;
       }
     }
@@ -434,9 +440,17 @@
         _globalState.currentManagerId = msg['id'];
         Function entryPoint = _getJSFunctionFromName(msg['functionName']);
         var replyTo = _deserializeMessage(msg['replyTo']);
-        _globalState.topEventLoop.enqueue(new _IsolateContext(), function() {
+        var context = new _IsolateContext();
+        _globalState.topEventLoop.enqueue(context, function() {
           _startIsolate(entryPoint, replyTo);
         }, 'worker-start');
+        // Make sure we always have a current context in this worker.
+        // TODO(7907): This is currently needed because we're using
+        // Timers to implement Futures, and this isolate library
+        // implementation uses Futures. We should either stop using
+        // Futures in this library, or re-adapt if Futures get a
+        // different implementation.
+        _globalState.currentContext = context;
         _globalState.topEventLoop.run();
         break;
       case 'spawn-worker':
@@ -733,10 +747,15 @@
           'replyTo': replyTo});
 
       if (_globalState.isWorker) {
-        // communication from one worker to another go through the main worker:
+        // Communication from one worker to another go through the
+        // main worker.
         _globalState.mainManager.postMessage(workerMessage);
       } else {
-        _globalState.managers[_workerId].postMessage(workerMessage);
+        // Deliver the message only if the worker is still alive.
+        _ManagerStub manager = _globalState.managers[_workerId];
+        if (manager != null) {
+          manager.postMessage(workerMessage);
+        }
       }
     });
   }
@@ -1250,48 +1269,67 @@
 
 class TimerImpl implements Timer {
   final bool _once;
+  bool _inEventLoop = false;
   int _handle;
 
   TimerImpl(int milliseconds, void callback(Timer timer))
       : _once = true {
-    if (hasTimer() && !_globalState.isWorker) {
-      _handle = JS('int', '#.setTimeout(#, #)',
-                   globalThis,
-                   convertDartClosureToJS(() => callback(this), 0),
-                   milliseconds);
-    } else if (milliseconds != 0) {
-      throw new UnsupportedError("Non DOM isolate with timer greater than 0.");
-    } else {
+    if (milliseconds == 0 && (!hasTimer() || _globalState.isWorker)) {
       // This makes a dependency between the async library and the
       // event loop of the isolate library. The compiler makes sure
       // that the event loop is compiled if [Timer] is used.
+      // TODO(7907): In case of web workers, we need to use the event
+      // loop instead of setTimeout, to make sure the futures get executed in
+      // order.
       _globalState.topEventLoop.enqueue(_globalState.currentContext, () {
         callback(this); 
       }, 'timer');
+      _inEventLoop = true;
+    } else if (hasTimer()) {
+      _globalState.topEventLoop.activeTimerCount++;
+      void internalCallback() {
+        callback(this);
+        _handle = null;
+        _globalState.topEventLoop.activeTimerCount--;
+      }
+      _handle = JS('int', '#.setTimeout(#, #)',
+                   globalThis,
+                   convertDartClosureToJS(internalCallback, 0),
+                   milliseconds);
+    } else {
+      assert(milliseconds > 0);
+      throw new UnsupportedError("Timer greater than 0.");
     }
   }
 
   TimerImpl.repeating(int milliseconds, void callback(Timer timer))
       : _once = false {
-    if (hasTimer() && !_globalState.isWorker) {
+    if (hasTimer()) {
+      _globalState.topEventLoop.activeTimerCount++;
       _handle = JS('int', '#.setInterval(#, #)',
                    globalThis,
-                   convertDartClosureToJS(() => callback(this), 0),
+                   convertDartClosureToJS(() { callback(this); }, 0),
                    milliseconds);
     } else {
-      throw new UnsupportedError("Non DOM isolate with repeating timer.");
+      throw new UnsupportedError("Repeating timer.");
     }
   }
 
   void cancel() {
-    if (hasTimer() && !_globalState.isWorker) {
+    if (hasTimer()) {
+      if (_inEventLoop) {
+        throw new UnsupportedError("Timer in event loop cannot be canceled.");
+      }
+      if (_handle == null) return;
+      _globalState.topEventLoop.activeTimerCount--;
       if (_once) {
         JS('void', '#.clearTimeout(#)', globalThis, _handle);
       } else {
         JS('void', '#.clearInterval(#)', globalThis, _handle);
       }
+      _handle = null;
     } else {
-      throw new UnsupportedError("Canceling a timer on a non DOM isolate.");
+      throw new UnsupportedError("Canceling a timer.");
     }
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_array.dart b/sdk/lib/_internal/compiler/implementation/lib/js_array.dart
index 01ebc02..1c92f24 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_array.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_array.dart
@@ -33,8 +33,35 @@
     return JS('var', r'#.pop()', this);
   }
 
+  void remove(Object element) {
+    checkGrowable(this, 'remove');
+    for (int i = 0; i < this.length; i++) {
+      if (this[i] == element) {
+        JS('var', r'#.splice(#, 1)', this, i);
+        return;
+      }
+    }
+  }
+
+  void removeAll(Iterable elements) {
+    Collections.removeAll(this, elements);
+  }
+
+  void retainAll(Iterable elements) {
+    Collections.retainAll(this, elements);
+  }
+
+  void removeMatching(bool test(E element)) {
+    // This could, and should, be optimized.
+    Collections.removeMatching(this, test);
+  }
+
+  void reatainMatching(bool test(E element)) {
+    Collections.reatainMatching(this, test);
+  }
+
   Iterable<E> where(bool f(E element)) {
-    return new WhereIterable<E>(this, f);
+    return IterableMixinWorkaround.where(this, f);
   }
 
   void addAll(Collection<E> collection) {
@@ -53,11 +80,11 @@
   }
 
   void forEach(void f(E element)) {
-    return Collections.forEach(this, f);
+    return IterableMixinWorkaround.forEach(this, f);
   }
 
   List mappedBy(f(E element)) {
-    return new MappedList(this, f);
+    return IterableMixinWorkaround.mappedByList(this, f);
   }
 
   String join([String separator]) {
@@ -70,35 +97,35 @@
   }
 
   List<E> take(int n) {
-    return new ListView<E>(this, 0, n);
+    return IterableMixinWorkaround.takeList(this, n);
   }
 
   Iterable<E> takeWhile(bool test(E value)) {
-    return new TakeWhileIterable<E>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
   List<E> skip(int n) {
-    return new ListView<E>(this, n, null);
+    return IterableMixinWorkaround.skipList(this, n);
   }
 
   Iterable<E> skipWhile(bool test(E value)) {
-    return new SkipWhileIterable<E>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   reduce(initialValue, combine(previousValue, E element)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
   E firstMatching(bool test(E value), {E orElse()}) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   E lastMatching(bool test(E value), {E orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   E singleMatching(bool test(E value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   E elementAt(int index) {
@@ -142,9 +169,9 @@
     throw new StateError("More than one element");
   }
 
-  E min([int compare(E a, E b)]) => Collections.min(this, compare);
+  E min([int compare(E a, E b)]) => IterableMixinWorkaround.min(this, compare);
 
-  E max([int compare(E a, E b)]) => Collections.max(this, compare);
+  E max([int compare(E a, E b)]) => IterableMixinWorkaround.max(this, compare);
 
   void removeRange(int start, int length) {
     checkGrowable(this, 'removeRange');
@@ -172,7 +199,7 @@
   }
 
   void setRange(int start, int length, List<E> from, [int startFrom = 0]) {
-    checkMutable(this, 'indexed set');
+    checkMutable(this, 'set range');
     if (length == 0) return;
     checkNull(start); // TODO(ahe): This is not specified but co19 tests it.
     checkNull(length); // TODO(ahe): This is not specified but co19 tests it.
@@ -190,14 +217,13 @@
     Arrays.copy(from, startFrom, this, start, length);
   }
 
-  bool any(bool f(E element)) => Collections.any(this, f);
+  bool any(bool f(E element)) => IterableMixinWorkaround.any(this, f);
 
-  bool every(bool f(E element)) => Collections.every(this, f);
+  bool every(bool f(E element)) => IterableMixinWorkaround.every(this, f);
 
   void sort([int compare(E a, E b)]) {
     checkMutable(this, 'sort');
-    if (compare == null) compare = Comparable.compare;
-    coreSort(this, compare);
+    IterableMixinWorkaround.sortList(this, compare);
   }
 
   int indexOf(E element, [int start = 0]) {
@@ -248,6 +274,13 @@
     if (index >= length || index < 0) throw new RangeError.value(index);
     return JS('var', '#[#]', this, index);
   }
+
+  void operator []=(int index, E value) {
+    checkMutable(this, 'indexed set');
+    if (index is !int) throw new ArgumentError(index);
+    if (index >= length || index < 0) throw new RangeError.value(index);
+    JS('void', r'#[#] = #', this, index, value);
+  }
 }
 
 /** Iterator for JavaScript Arrays. */
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
index 3ca8fc0..838842e 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
@@ -5,6 +5,7 @@
 library _js_helper;
 
 import 'dart:collection';
+import 'dart:collection-dev';
 
 part 'constant_map.dart';
 part 'native_helper.dart';
@@ -12,22 +13,6 @@
 part 'string_helper.dart';
 
 // Performance critical helper methods.
-add(var a, var b) => (a is num && b is num)
-    ? JS('num', r'# + #', a, b)
-    : add$slow(a, b);
-
-sub(var a, var b) => (a is num && b is num)
-    ? JS('num', r'# - #', a, b)
-    : sub$slow(a, b);
-
-div(var a, var b) => (a is num && b is num)
-    ? JS('num', r'# / #', a, b)
-    : div$slow(a, b);
-
-mul(var a, var b) => (a is num && b is num)
-    ? JS('num', r'# * #', a, b)
-    : mul$slow(a, b);
-
 gt(var a, var b) => (a is num && b is num)
     ? JS('bool', r'# > #', a, b)
     : gt$slow(a, b);
@@ -60,39 +45,6 @@
     ? JS('bool', r'# <= #', a, b)
     : identical(le$slow(a, b), true);
 
-index(var a, var index) {
-  // The type test may cause a NoSuchMethodError to be thrown but
-  // that matches the specification of what the indexing operator is
-  // supposed to do.
-  bool isJsArrayOrString = JS('bool',
-      r'typeof # == "string" || #.constructor === Array',
-      a, a);
-  if (isJsArrayOrString) {
-    var key = JS('int', '# >>> 0', index);
-    if (identical(key, index) && key < JS('int', r'#.length', a)) {
-      return JS('var', r'#[#]', a, key);
-    }
-  }
-  return index$slow(a, index);
-}
-
-indexSet(var a, var index, var value) {
-  // The type test may cause a NoSuchMethodError to be thrown but
-  // that matches the specification of what the indexing operator is
-  // supposed to do.
-  bool isMutableJsArray = JS('bool',
-      r'#.constructor === Array && !#.immutable$list',
-      a, a);
-  if (isMutableJsArray) {
-    var key = JS('int', '# >>> 0', index);
-    if (identical(key, index) && key < JS('int', r'#.length', a)) {
-      JS('void', r'#[#] = #', a, key, value);
-      return;
-    }
-  }
-  indexSet$slow(a, index, value);
-}
-
 /**
  * Returns true if both arguments are numbers.
  *
@@ -114,56 +66,6 @@
   return value != null && JS('bool', r'#.constructor === Array', value);
 }
 
-add$slow(var a, var b) {
-  if (checkNumbers(a, b)) {
-    return JS('num', r'# + #', a, b);
-  }
-  return UNINTERCEPTED(a + b);
-}
-
-div$slow(var a, var b) {
-  if (checkNumbers(a, b)) {
-    return JS('num', r'# / #', a, b);
-  }
-  return UNINTERCEPTED(a / b);
-}
-
-mul$slow(var a, var b) {
-  if (checkNumbers(a, b)) {
-    return JS('num', r'# * #', a, b);
-  }
-  return UNINTERCEPTED(a * b);
-}
-
-sub$slow(var a, var b) {
-  if (checkNumbers(a, b)) {
-    return JS('num', r'# - #', a, b);
-  }
-  return UNINTERCEPTED(a - b);
-}
-
-mod(var a, var b) {
-  if (checkNumbers(a, b)) {
-    // Euclidean Modulo.
-    num result = JS('num', r'# % #', a, b);
-    if (result == 0) return 0;  // Make sure we don't return -0.0.
-    if (result > 0) return result;
-    if (JS('num', '#', b) < 0) {
-      return result - JS('num', '#', b);
-    } else {
-      return result + JS('num', '#', b);
-    }
-  }
-  return UNINTERCEPTED(a % b);
-}
-
-tdiv(var a, var b) {
-  if (checkNumbers(a, b)) {
-    return (JS('num', r'# / #', a, b)).truncate();
-  }
-  return UNINTERCEPTED(a ~/ b);
-}
-
 eq(var a, var b) {
   if (JS('bool', r'# == null', a)) return JS('bool', r'# == null', b);
   if (JS('bool', r'# == null', b)) return false;
@@ -220,106 +122,6 @@
   return UNINTERCEPTED(a <= b);
 }
 
-shl(var a, var b) {
-  // TODO(floitsch): inputs must be integers.
-  if (checkNumbers(a, b)) {
-    if (JS('num', '#', b) < 0) throw new ArgumentError(b);
-    // JavaScript only looks at the last 5 bits of the shift-amount. Shifting
-    // by 33 is hence equivalent to a shift by 1.
-    if (JS('bool', r'# > 31', b)) return 0;
-    return JS('num', r'(# << #) >>> 0', a, b);
-  }
-  return UNINTERCEPTED(a << b);
-}
-
-shr(var a, var b) {
-  // TODO(floitsch): inputs must be integers.
-  if (checkNumbers(a, b)) {
-    if (JS('num', '#', b) < 0) throw new ArgumentError(b);
-    if (JS('num', '#', a) > 0) {
-      // JavaScript only looks at the last 5 bits of the shift-amount. In JS
-      // shifting by 33 is hence equivalent to a shift by 1. Shortcut the
-      // computation when that happens.
-      if (JS('bool', r'# > 31', b)) return 0;
-      // Given that 'a' is positive we must not use '>>'. Otherwise a number
-      // that has the 31st bit set would be treated as negative and shift in
-      // ones.
-      return JS('num', r'# >>> #', a, b);
-    }
-    // For negative numbers we just clamp the shift-by amount. 'a' could be
-    // negative but not have its 31st bit set. The ">>" would then shift in
-    // 0s instead of 1s. Therefore we cannot simply return 0xFFFFFFFF.
-    if (JS('num', '#', b) > 31) b = 31;
-    return JS('num', r'(# >> #) >>> 0', a, b);
-  }
-  return UNINTERCEPTED(a >> b);
-}
-
-and(var a, var b) {
-  // TODO(floitsch): inputs must be integers.
-  if (checkNumbers(a, b)) {
-    return JS('num', r'(# & #) >>> 0', a, b);
-  }
-  return UNINTERCEPTED(a & b);
-}
-
-or(var a, var b) {
-  // TODO(floitsch): inputs must be integers.
-  if (checkNumbers(a, b)) {
-    return JS('num', r'(# | #) >>> 0', a, b);
-  }
-  return UNINTERCEPTED(a | b);
-}
-
-xor(var a, var b) {
-  // TODO(floitsch): inputs must be integers.
-  if (checkNumbers(a, b)) {
-    return JS('num', r'(# ^ #) >>> 0', a, b);
-  }
-  return UNINTERCEPTED(a ^ b);
-}
-
-not(var a) {
-  if (JS('bool', r'typeof # === "number"', a)) {
-    return JS('num', r'(~#) >>> 0', a);
-  }
-  return UNINTERCEPTED(~a);
-}
-
-neg(var a) {
-  if (JS('bool', r'typeof # === "number"', a)) return JS('num', r'-#', a);
-  return UNINTERCEPTED(-a);
-}
-
-index$slow(var a, var index) {
-  if (a is String || isJsArray(a)) {
-    if (index is !int) {
-      if (index is !num) throw new ArgumentError(index);
-      if (!identical(index.truncate(), index)) throw new ArgumentError(index);
-    }
-    if (index < 0 || index >= a.length) {
-      throw new RangeError.value(index);
-    }
-    return JS('', r'#[#]', a, index);
-  }
-  return UNINTERCEPTED(a[index]);
-}
-
-void indexSet$slow(var a, var index, var value) {
-  if (isJsArray(a)) {
-    if (index is !int) {
-      throw new ArgumentError(index);
-    }
-    if (index < 0 || index >= a.length) {
-      throw new RangeError.value(index);
-    }
-    checkMutable(a, 'indexed set');
-    JS('void', r'#[#] = #', a, index, value);
-    return;
-  }
-  UNINTERCEPTED(a[index] = value);
-}
-
 checkMutable(list, reason) {
   if (JS('bool', r'!!(#.immutable$list)', list)) {
     throw new UnsupportedError(reason);
@@ -561,16 +363,10 @@
   }
 
   static List newGrowableList(length) {
-    // TODO(sra): For good concrete type analysis we need the JS-type to
-    // specifically name the JavaScript Array implementation.  'List' matches
-    // all the dart:html types that implement List<T>.
     return JS('=List', r'new Array(#)', length);
   }
 
   static List newFixedList(length) {
-    // TODO(sra): For good concrete type analysis we need the JS-type to
-    // specifically name the JavaScript Array implementation.  'List' matches
-    // all the dart:html types that implement List<T>.
     var result = JS('=List', r'new Array(#)', length);
     JS('void', r'#.fixed$length = #', result, true);
     return result;
@@ -815,7 +611,7 @@
     return JS('var', r'$[#]', className);
   }
 
-  static bool identical(a, b) {
+  static bool identicalImplementation(a, b) {
     return JS('bool', '# == null', a)
       ? JS('bool', '# == null', b)
       : JS('bool', '# === #', a, b);
@@ -944,30 +740,86 @@
 }
 
 /**
- * Throws the given Dart object as an exception by wrapping it in a
- * proper JavaScript error object and then throwing that. That gives
- * us a reasonable stack trace on most JavaScript implementations. The
- * code in [unwrapException] deals with getting the original Dart
+ * Wrap the given Dart object and record a stack trace.
+ *
+ * The code in [unwrapException] deals with getting the original Dart
  * object out of the wrapper again.
  */
 $throw(ex) {
   if (ex == null) ex = const NullThrownError();
-  var jsError = JS('var', r'new Error()');
-  JS('void', r'#.name = #', jsError, ex);
-  JS('void', r'#.description = #', jsError, ex);
-  JS('void', r'#.dartException = #', jsError, ex);
-  JS('void', r'#.toString = #', jsError,
-     DART_CLOSURE_TO_JS(toStringWrapper));
-  JS('void', r'throw #', jsError);
+  var wrapper = new DartError(ex);
+
+  if (JS('bool', '!!Error.captureStackTrace')) {
+    // Use V8 API for recording a "fast" stack trace (this installs a
+    // "stack" property getter on [wrapper]).
+    JS('void', r'Error.captureStackTrace(#, #)',
+       wrapper, RAW_DART_FUNCTION_REF($throw));
+  } else {
+    // Otherwise, produce a stack trace and record it in the wrapper.
+    // This is a slower way to create a stack trace which works on
+    // some browsers, but may simply evaluate to null.
+    String stackTrace = JS('', 'new Error().stack');
+    JS('void', '#.stack = #', wrapper, stackTrace);
+  }
+  return wrapper;
 }
 
 /**
- * This method is installed as JavaScript toString method on exception
- * objects in [$throw]. So JavaScript 'this' binds to an instance of
- * JavaScript Error to which we have added a property 'dartException'
- * which holds a Dart object.
+ * Wrapper class for throwing exceptions.
  */
-toStringWrapper() => JS('', r'this.dartException').toString();
+class DartError {
+  /// The Dart object (or primitive JavaScript value) which was thrown is
+  /// attached to this object as a field named 'dartException'.  We do this
+  /// only in raw JS so that we can use the 'in' operator and so that the
+  /// minifier does not rename the field.  Therefore it is not declared as a
+  /// real field.
+
+  DartError(var dartException) {
+    JS('void', '#.dartException = #', this, dartException);
+    // Install a toString method that the JavaScript system will call
+    // to format uncaught exceptions.
+    JS('void', '#.toString = #', this, DART_CLOSURE_TO_JS(toStringWrapper));
+  }
+
+  /**
+   * V8/Chrome installs a property getter, "stack", when calling
+   * Error.captureStackTrace (see [$throw]). In [$throw], we make sure
+   * that this property is always set.
+   */
+  String get stack => JS('', '#.stack', this);
+
+  /**
+   * This method can be invoked by calling toString from
+   * JavaScript. See the constructor of this class.
+   *
+   * We only expect this method to be called (indirectly) by the
+   * browser when an uncaught exception occurs. Instance of this class
+   * should never escape into Dart code (except for [$throw] above).
+   */
+  String toString() {
+    // If Error.captureStackTrace is available, accessing stack from
+    // this method would cause recursion because the stack property
+    // (on this object) is actually a getter which calls toString on
+    // this object (via the wrapper installed in this class'
+    // constructor). Fortunately, both Chrome and d8 prints the stack
+    // trace and Chrome even applies source maps to the stack
+    // trace. Remeber, this method is only ever invoked by the browser
+    // when an uncaught exception occurs.
+    var dartException = JS('var', r'#.dartException', this);
+    if (JS('bool', '!!Error.captureStackTrace') || (stack == null)) {
+      return dartException.toString();
+    } else {
+      return '$dartException\n$stack';
+    }
+  }
+
+  /**
+   * This method is installed as JavaScript toString method on
+   * [DartError].  So JavaScript 'this' binds to an instance of
+   * DartError.
+   */
+  static toStringWrapper() => JS('', r'this').toString();
+}
 
 makeLiteralListConst(list) {
   JS('bool', r'#.immutable$list = #', list, true);
@@ -1035,6 +887,7 @@
       if (message.endsWith('is null') ||
           message.endsWith('is undefined') ||
           message.endsWith('is null or undefined') ||
+          message.endsWith('of undefined') ||
           message.endsWith('of null')) {
         return new NoSuchMethodError(null, '<unknown>', [], {});
       } else if (contains(message, ' has no method ') ||
@@ -1147,8 +1000,10 @@
   // executes.
   var currentIsolate = JS_CURRENT_ISOLATE();
 
+  // We use $0 and $1 to not clash with variable names used by the
+  // compiler and/or minifier.
   function = JS("var",
-                r"""function(a, b) { return #(#, #, #, a, b); }""",
+                r"""function($0, $1) { return #(#, #, #, $0, $1); }""",
                 DART_CLOSURE_TO_JS(invokeClosure),
                 closure,
                 JS_CURRENT_ISOLATE(),
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_number.dart b/sdk/lib/_internal/compiler/implementation/lib/js_number.dart
index c9f9dbf..e2ae4e8 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_number.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_number.dart
@@ -141,7 +141,96 @@
     }
   }
 
-  int get hashCode => this & 0x1FFFFFFF;
+  int get hashCode => JS('int', '# & 0x1FFFFFFF', this);
+
+  num operator -() => JS('num', r'-#', this);
+
+  num operator +(num other) {
+    if (other is !num) throw new ArgumentError(other);
+    return JS('num', '# + #', this, other);
+  }
+
+  num operator -(num other) {
+    if (other is !num) throw new ArgumentError(other);
+    return JS('num', '# - #', this, other);
+  }
+
+  num operator /(num other) {
+    if (other is !num) throw new ArgumentError(other);
+    return JS('num', '# / #', this, other);
+  }
+
+  num operator *(num other) {
+    if (other is !num) throw new ArgumentError(other);
+    return JS('num', '# * #', this, other);
+  }
+
+  num operator %(num other) {
+    if (other is !num) throw new ArgumentError(other);
+    // Euclidean Modulo.
+    num result = JS('num', r'# % #', this, other);
+    if (result == 0) return 0;  // Make sure we don't return -0.0.
+    if (result > 0) return result;
+    if (JS('num', '#', other) < 0) {
+      return result - JS('num', '#', other);
+    } else {
+      return result + JS('num', '#', other);
+    }
+  }
+
+  num operator ~/(num other) {
+    if (other is !num) throw new ArgumentError(other);
+    return (JS('num', r'# / #', this, other)).truncate();
+  }
+
+  // TODO(ngeoffray): Move the bit operations below to [JSInt] and
+  // make them take an int. Because this will make operations slower,
+  // we define these methods on number for now but we need to decide
+  // the grain at which we do the type checks.
+
+  num operator <<(num other) {
+    if (other is !num) throw new ArgumentError(other);
+    if (JS('num', '#', other) < 0) throw new ArgumentError(other);
+    // JavaScript only looks at the last 5 bits of the shift-amount. Shifting
+    // by 33 is hence equivalent to a shift by 1.
+    if (JS('bool', r'# > 31', other)) return 0;
+    return JS('num', r'(# << #) >>> 0', this, other);
+  }
+
+  num operator >>(num other) {
+    if (other is !num) throw new ArgumentError(other);
+    if (JS('num', '#', other) < 0) throw new ArgumentError(other);
+    if (JS('num', '#', this) > 0) {
+      // JavaScript only looks at the last 5 bits of the shift-amount. In JS
+      // shifting by 33 is hence equivalent to a shift by 1. Shortcut the
+      // computation when that happens.
+      if (JS('bool', r'# > 31', other)) return 0;
+      // Given that 'a' is positive we must not use '>>'. Otherwise a number
+      // that has the 31st bit set would be treated as negative and shift in
+      // ones.
+      return JS('num', r'# >>> #', this, other);
+    }
+    // For negative numbers we just clamp the shift-by amount. 'a' could be
+    // negative but not have its 31st bit set. The ">>" would then shift in
+    // 0s instead of 1s. Therefore we cannot simply return 0xFFFFFFFF.
+    if (JS('num', '#', other) > 31) other = 31;
+    return JS('num', r'(# >> #) >>> 0', this, other);
+  }
+
+  num operator &(num other) {
+    if (other is !num) throw new ArgumentError(other);
+    return JS('num', r'(# & #) >>> 0', this, other);    
+  }
+
+  num operator |(num other) {
+    if (other is !num) throw new ArgumentError(other);
+    return JS('num', r'(# | #) >>> 0', this, other);    
+  }
+
+  num operator ^(num other) {
+    if (other is !num) throw new ArgumentError(other);
+    return JS('num', r'(# ^ #) >>> 0', this, other);    
+  }
 }
 
 class JSInt extends JSNumber {
@@ -152,6 +241,8 @@
   bool get isOdd => (this & 1) == 1;
 
   Type get runtimeType => int;
+
+  int operator ~() => JS('int', r'(~#) >>> 0', this);
 }
 
 class JSDouble extends JSNumber {
diff --git a/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart
index a41efdc..860e706 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart
@@ -33,6 +33,7 @@
 String typeNameInOpera(obj) {
   String name = JS('String', '#', constructorNameFallback(obj));
   if (name == 'Window') return 'DOMWindow';
+  if (name == 'ApplicationCache') return 'DOMApplicationCache';
   return name;
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/library_loader.dart b/sdk/lib/_internal/compiler/implementation/library_loader.dart
index d7b538e..ccf513c 100644
--- a/sdk/lib/_internal/compiler/implementation/library_loader.dart
+++ b/sdk/lib/_internal/compiler/implementation/library_loader.dart
@@ -528,6 +528,16 @@
     pendingExportSet.addAll(library.getNonPrivateElementsInScope());
   }
 
+  void registerHandledExports(LibraryElement exportedLibraryElement,
+                              CombinatorFilter filter) {
+    assert(invariant(library, exportedLibraryElement.exportsHandled));
+    for (Element exportedElement in exportedLibraryElement.exports) {
+      if (!filter.exclude(exportedElement)) {
+        pendingExportSet.add(exportedElement);
+      }
+    }
+  }
+
   /**
    * Registers the compute export scope with the node library.
    */
@@ -685,12 +695,14 @@
                           LibraryElement loadedLibrary) {
     if (tag is Export) {
       // [loadedLibrary] is exported by [library].
+      LibraryDependencyNode exportingNode = nodeMap[library];
       if (loadedLibrary.exportsHandled) {
         // Export scope already computed on [loadedLibrary].
+        var combinatorFilter = new CombinatorFilter.fromTag(tag);
+        exportingNode.registerHandledExports(loadedLibrary, combinatorFilter);
         return;
       }
       LibraryDependencyNode exportedNode = nodeMap[loadedLibrary];
-      LibraryDependencyNode exportingNode = nodeMap[library];
       assert(invariant(loadedLibrary, exportedNode != null,
           message: "$loadedLibrary has not been registered"));
       assert(invariant(library, exportingNode != null,
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 1e34e04..aeef672 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -386,7 +386,7 @@
    * Warning: do not call this method directly. It should only be
    * called by [resolveClass] and [ClassSupertypeResolver].
    */
-  void loadSupertypes(ClassElement cls, Node from) {
+  void loadSupertypes(ClassElement cls, Spannable from) {
     compiler.withCurrentElement(cls, () => measure(() {
       if (cls.supertypeLoadState == STATE_DONE) return;
       if (cls.supertypeLoadState == STATE_STARTED) {
@@ -404,8 +404,8 @@
       cls.supertypeLoadState = STATE_STARTED;
       compiler.withCurrentElement(cls, () {
         // TODO(ahe): Cache the node in cls.
-        cls.parseNode(compiler).accept(new ClassSupertypeResolver(compiler,
-                                                                  cls));
+        cls.parseNode(compiler).accept(
+            new ClassSupertypeResolver(compiler, cls));
         if (cls.supertypeLoadState != STATE_DONE) {
           cls.supertypeLoadState = STATE_DONE;
         }
@@ -454,7 +454,7 @@
       compiler.withCurrentElement(element, () => measure(() {
         assert(element.resolutionState == STATE_NOT_STARTED);
         element.resolutionState = STATE_STARTED;
-        ClassNode tree = element.parseNode(compiler);
+        Node tree = element.parseNode(compiler);
         loadSupertypes(element, tree);
 
         ClassResolverVisitor visitor =
@@ -2737,24 +2737,24 @@
     // resolve this class again.
     resolveTypeVariableBounds(node.typeParameters);
 
-    // Find super type.
-    DartType supertype = null;
+    // Setup the supertype for the element.
+    assert(element.supertype == null);
     if (node.superclass != null) {
-      supertype = typeResolver.resolveTypeAnnotation(node.superclass, scope,
-          element, onFailure: error);
-    }
-    if (supertype != null) {
-      if (identical(supertype.kind, TypeKind.MALFORMED_TYPE)) {
-        // Error has already been reported.
-      } else if (!identical(supertype.kind, TypeKind.INTERFACE)) {
-        // TODO(johnniwinther): Handle dynamic.
-        error(node.superclass.typeName, MessageKind.CLASS_NAME_EXPECTED, []);
-      } else if (isBlackListed(supertype)) {
-        error(node.superclass, MessageKind.CANNOT_EXTEND, [supertype]);
-      } else {
+      MixinApplication superMixin = node.superclass.asMixinApplication();
+      if (superMixin != null) {
+        DartType supertype = resolveSupertype(element, superMixin.superclass);
+        Link<Node> link = superMixin.mixins.nodes;
+        while (!link.isEmpty) {
+          supertype = applyMixin(supertype, visit(link.head));
+          link = link.tail;
+        }
         element.supertype = supertype;
+      } else {
+        element.supertype = resolveSupertype(element, node.superclass);
       }
     }
+
+    // If the super type isn't specified, we make it Object.
     final objectElement = compiler.objectClass;
     if (!identical(element, objectElement) && element.supertype == null) {
       if (objectElement == null) {
@@ -2765,6 +2765,7 @@
       }
       element.supertype = objectElement.computeType(compiler);
     }
+
     assert(element.interfaces == null);
     Link<DartType> interfaces = const Link<DartType>();
     for (Link<Node> link = node.interfaces.nodes;
@@ -2809,10 +2810,61 @@
     if (node.defaultClause != null) {
       element.defaultClass = visit(node.defaultClause);
     }
-    addDefaultConstructorIfNeeded(element);
+    element.addDefaultConstructorIfNeeded(compiler);
     return element.computeType(compiler);
   }
 
+  DartType visitMixinApplication(MixinApplication node) {
+    compiler.ensure(element != null);
+    compiler.ensure(element.resolutionState == STATE_STARTED);
+
+    // Generate anonymous mixin application elements for the
+    // intermediate mixin applications (excluding the last).
+    DartType supertype = resolveSupertype(element, node.superclass);
+    Link<Node> link = node.mixins.nodes;
+    while (!link.tail.isEmpty) {
+      supertype = applyMixin(supertype, visit(link.head));
+      link = link.tail;
+    }
+    doApplyMixinTo(element, supertype, visit(link.head));
+    return element.computeType(compiler);
+  }
+
+  DartType applyMixin(DartType supertype, DartType mixinType) {
+    String superName = supertype.name.slowToString();
+    String mixinName = mixinType.name.slowToString();
+    ClassElement mixinApplication = new MixinApplicationElementX(
+        new SourceString("${superName}_${mixinName}"),
+        element.getCompilationUnit(),
+        compiler.getNextFreeClassId(),
+        element.parseNode(compiler));
+    doApplyMixinTo(mixinApplication, supertype, mixinType);
+    mixinApplication.resolutionState = STATE_DONE;
+    mixinApplication.supertypeLoadState = STATE_DONE;
+    return mixinApplication.computeType(compiler);
+  }
+
+  void doApplyMixinTo(MixinApplicationElement mixinApplication,
+                      DartType supertype,
+                      DartType mixinType) {
+    assert(mixinApplication.supertype == null);
+    mixinApplication.supertype = supertype;
+
+    // The class that is the result of a mixin application implements
+    // the interface of the class that was mixed in.
+    Link<DartType> interfaces = const Link<DartType>();
+    interfaces = interfaces.prepend(mixinType);
+    assert(mixinApplication.interfaces == null);
+    mixinApplication.interfaces = interfaces;
+
+    assert(mixinApplication.mixin == null);
+    mixinApplication.mixin = mixinType.element;
+    mixinApplication.mixin.ensureResolved(compiler);
+    mixinApplication.addDefaultConstructorIfNeeded(compiler);
+    calculateAllSupertypes(mixinApplication);
+  }
+
+
   // TODO(johnniwinther): Remove when default class is no longer supported.
   DartType visitTypeAnnotation(TypeAnnotation node) {
     return visit(node.typeName);
@@ -2863,9 +2915,28 @@
     return e.computeType(compiler);
   }
 
+  DartType resolveSupertype(ClassElement cls, TypeAnnotation superclass) {
+    DartType supertype = typeResolver.resolveTypeAnnotation(
+        superclass, scope, cls, onFailure: error);
+    if (supertype != null) {
+      if (identical(supertype.kind, TypeKind.MALFORMED_TYPE)) {
+        // Error has already been reported.
+        return null;
+      } else if (!identical(supertype.kind, TypeKind.INTERFACE)) {
+        // TODO(johnniwinther): Handle dynamic.
+        error(superclass.typeName, MessageKind.CLASS_NAME_EXPECTED, []);
+        return null;
+      } else if (isBlackListed(supertype)) {
+        error(superclass, MessageKind.CANNOT_EXTEND, [supertype]);
+        return null;
+      }
+    }
+    return supertype;
+  }
+
   void calculateAllSupertypes(ClassElement cls) {
-    // TODO(karlklose): check if type arguments match, if a classelement occurs
-    //                  more than once in the supertypes.
+    // TODO(karlklose): Check if type arguments match, if a class
+    // element occurs more than once in the supertypes.
     if (cls.allSupertypes != null) return;
     final DartType supertype = cls.supertype;
     if (supertype != null) {
@@ -2903,17 +2974,6 @@
     }
   }
 
-  /**
-   * Add a synthetic nullary constructor if there are no other
-   * constructors.
-   */
-  void addDefaultConstructorIfNeeded(ClassElement element) {
-    if (element.hasConstructor) return;
-    FunctionElement constructor =
-        new SynthesizedConstructorElementX.forDefault(element, compiler);
-    element.addToScope(constructor, compiler);
-  }
-
   isBlackListed(DartType type) {
     LibraryElement lib = element.getLibrary();
     return
@@ -2945,6 +3005,12 @@
     element.ensureResolved(compiler);
   }
 
+  void visitNodeList(NodeList node) {
+    for (Link<Node> link = node.nodes; !link.isEmpty; link = link.tail) {
+      link.head.accept(this);
+    }
+  }
+
   void visitClassNode(ClassNode node) {
     if (node.superclass == null) {
       if (!identical(classElement, compiler.objectClass)) {
@@ -2953,11 +3019,12 @@
     } else {
       node.superclass.accept(this);
     }
-    for (Link<Node> link = node.interfaces.nodes;
-         !link.isEmpty;
-         link = link.tail) {
-      link.head.accept(this);
-    }
+    visitNodeList(node.interfaces);
+  }
+
+  void visitMixinApplication(MixinApplication node) {
+    node.superclass.accept(this);
+    visitNodeList(node.mixins);
   }
 
   void visitTypeAnnotation(TypeAnnotation node) {
@@ -3225,6 +3292,12 @@
                                Diagnostic.ERROR);
       }
     }
+    if (element.isGetter() && (requiredParameterCount != 0
+                               || visitor.optionalParameterCount != 0)) {
+      compiler.reportMessage(compiler.spanFromSpannable(formalParameters),
+                             MessageKind.EXTRA_FORMALS.error([]),
+                             Diagnostic.ERROR);
+    }
     return new FunctionSignatureX(parameters,
                                   visitor.optionalParameters,
                                   requiredParameterCount,
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart b/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
index f3c1f88..e50729d 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
@@ -15,9 +15,9 @@
          FieldParameterElementX,
          VariableListElementX,
          FunctionSignatureX,
-         SynthesizedConstructorElementX,
          LabelElementX,
-         TargetElementX;
+         TargetElementX,
+         MixinApplicationElementX;
 import '../util/util.dart';
 import '../scanner/scannerlib.dart' show PartialMetadataAnnotation;
 
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/keyword.dart b/sdk/lib/_internal/compiler/implementation/scanner/keyword.dart
index 3a6db11..5d3c9a8 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/keyword.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/keyword.dart
@@ -38,6 +38,7 @@
       const Keyword("var"),
       const Keyword("void"),
       const Keyword("while"),
+      const Keyword("with"),
 
       // TODO(ahe): Don't think this is a reserved word.
       // See: http://dartbug.com/5579
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index ad1a0e1..34408bf 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -163,6 +163,18 @@
   void endFunctionTypeAlias(Token typedefKeyword, Token endToken) {
   }
 
+  void beginMixinApplication(Token token) {
+  }
+
+  void endMixinApplication() {
+  }
+
+  void beginNamedMixinApplication(Token token) {
+  }
+
+  void endNamedMixinApplication(Token typedefKeyword, Token endToken) {
+  }
+
   void beginHide(Token hideKeyword) {
   }
 
@@ -175,6 +187,12 @@
   void endIdentifierList(int count) {
   }
 
+  void beginTypeList(Token token) {
+  }
+
+  void endTypeList(int count) {
+  }
+
   void beginIfStatement(Token token) {
   }
 
@@ -702,6 +720,10 @@
     pushNode(makeNodeList(count, null, null, ","));
   }
 
+  void endTypeList(int count) {
+    pushNode(makeNodeList(count, null, null, ","));
+  }
+
   void endPart(Token partKeyword, Token semicolon) {
     StringNode uri = popLiteralString();
     addLibraryTag(new Part(partKeyword, uri));
@@ -750,7 +772,7 @@
     SourceString nativeTagInfo = native.checkForNativeClass(this);
     NodeList interfaces =
         makeNodeList(interfacesCount, implementsKeyword, null, ",");
-    TypeAnnotation supertype = popNode();
+    Node supertype = popNode();
     NodeList typeParameters = popNode();
     Identifier name = popNode();
     int id = idGenerator();
@@ -804,6 +826,24 @@
     rejectBuiltInIdentifier(name);
   }
 
+  void endNamedMixinApplication(Token typedefKeyword, Token endToken) {
+    MixinApplication mixinApplication = popNode();
+    NodeList typeVariables = popNode();
+    Identifier name = popNode();
+    int id = idGenerator();
+    Element enclosing = compilationUnitElement;
+    pushElement(new MixinApplicationElementX(
+        name.source, enclosing, id, mixinApplication));
+    rejectBuiltInIdentifier(name);
+  }
+
+  void endMixinApplication() {
+    NodeList mixins = popNode();
+    TypeAnnotation superclass = popNode();
+    Modifiers modifiers = popNode();
+    pushNode(new MixinApplication(modifiers, superclass, mixins));
+  }
+
   void handleVoidKeyword(Token token) {
     pushNode(new TypeAnnotation(new Identifier(token), null));
   }
@@ -1148,7 +1188,7 @@
     NodeList body = popNode();
     NodeList interfaces =
         makeNodeList(interfacesCount, implementsKeyword, null, ",");
-    TypeAnnotation supertype = popNode();
+    Node supertype = popNode();
     NodeList typeParameters = popNode();
     Identifier name = popNode();
     Modifiers modifiers = popNode();
@@ -1170,6 +1210,14 @@
                          typedefKeyword, endToken));
   }
 
+  void endNamedMixinApplication(Token typedefKeyword, Token endToken) {
+    Node mixinApplication = popNode();
+    NodeList typeParameters = popNode();
+    Identifier name = popNode();
+    pushNode(new NamedMixinApplication(name, typeParameters, mixinApplication,
+                                       typedefKeyword, endToken));
+  }
+
   void endInterface(int supertypeCount, Token interfaceKeyword,
                     Token extendsKeyword, Token endToken) {
     NodeList body = popNode();
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
index 64f712f..2909cc9 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
@@ -52,7 +52,7 @@
     } else if ((identical(value, 'abstract')) || (identical(value, 'class'))) {
       return parseClass(token);
     } else if (identical(value, 'typedef')) {
-      return parseNamedFunctionAlias(token);
+      return parseTypedef(token);
     } else if (identical(value, '#')) {
       return parseScriptTags(token);
     } else if (identical(value, 'library')) {
@@ -161,6 +161,19 @@
     return token;
   }
 
+  /// type (, type)*
+  Token parseTypeList(Token token) {
+    listener.beginTypeList(token);
+    token = parseType(token);
+    int count = 1;
+    while (optional(',', token)) {
+      token = parseType(token.next);
+      count++;
+    }
+    listener.endTypeList(count);
+    return token;
+  }
+
   Token parsePartOrPartOf(Token token) {
     assert(optional('part', token));
     if (optional('of', token.next)) {
@@ -246,17 +259,36 @@
     return parseClassBody(token);
   }
 
-  Token parseNamedFunctionAlias(Token token) {
+  Token parseTypedef(Token token) {
     Token typedefKeyword = token;
-    listener.beginFunctionTypeAlias(token);
-    token = parseReturnTypeOpt(token.next);
-    token = parseIdentifier(token);
-    token = parseTypeVariablesOpt(token);
-    token = parseFormalParameters(token);
-    listener.endFunctionTypeAlias(typedefKeyword, token);
+    if (optional('=', peekAfterType(token.next))) {
+      listener.beginNamedMixinApplication(token);
+      token = parseIdentifier(token.next);
+      token = parseTypeVariablesOpt(token);
+      token = expect('=', token);
+      token = parseMixinApplication(token);
+      listener.endNamedMixinApplication(typedefKeyword, token);
+    } else {
+      listener.beginFunctionTypeAlias(token);
+      token = parseReturnTypeOpt(token.next);
+      token = parseIdentifier(token);
+      token = parseTypeVariablesOpt(token);
+      token = parseFormalParameters(token);
+      listener.endFunctionTypeAlias(typedefKeyword, token);
+    }
     return expect(';', token);
   }
 
+  Token parseMixinApplication(Token token) {
+    listener.beginMixinApplication(token);
+    token = parseModifiers(token);
+    token = parseType(token);
+    token = expect('with', token);
+    token = parseTypeList(token);
+    listener.endMixinApplication();
+    return token;
+  }
+
   Token parseReturnTypeOpt(Token token) {
     if (identical(token.stringValue, 'void')) {
       listener.handleVoidKeyword(token);
@@ -452,7 +484,12 @@
     Token extendsKeyword;
     if (optional('extends', token)) {
       extendsKeyword = token;
-      token = parseType(token.next);
+      if (optional('with', token.next.next)) {
+        // TODO(kasperl): Disallow modifiers here.
+        token = parseMixinApplication(token.next);
+      } else {
+        token = parseType(token.next);
+      }
     } else {
       extendsKeyword = null;
       listener.handleNoType(token);
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart b/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
index 8241b7f..841656b 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
@@ -14,7 +14,8 @@
          VariableElementX,
          VariableListElementX,
          ClassElementX,
-         MetadataAnnotationX;
+         MetadataAnnotationX,
+         MixinApplicationElementX;
 import '../dart2jslib.dart';
 import '../native_handler.dart' as native;
 import '../string_validator.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index e48d335..4d5745f 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -416,9 +416,10 @@
     });
     if (closureData.isClosure()) {
       // Inside closure redirect references to itself to [:this:].
-      builder.thisInstruction = new HThis(closureData.thisElement);
-      builder.graph.entry.addAtEntry(builder.thisInstruction);
-      updateLocal(closureData.closureElement, builder.thisInstruction);
+      HThis thisInstruction = new HThis(closureData.thisElement);
+      builder.graph.thisInstruction = thisInstruction;
+      builder.graph.entry.addAtEntry(thisInstruction);
+      updateLocal(closureData.closureElement, thisInstruction);
     } else if (element.isInstanceMember()
                || element.isGenerativeConstructor()) {
       // Once closures have been mapped to classes their instance members might
@@ -426,10 +427,11 @@
       // context.
       ClassElement cls = element.getEnclosingClass();
       DartType type = cls.computeType(builder.compiler);
-      builder.thisInstruction = new HThis(closureData.thisElement,
-                                          new HBoundedType.nonNull(type));
-      builder.graph.entry.addAtEntry(builder.thisInstruction);
-      directLocals[closureData.thisElement] = builder.thisInstruction;
+      HThis thisInstruction = new HThis(closureData.thisElement,
+                                        new HBoundedType.nonNull(type));
+      builder.graph.thisInstruction = thisInstruction;
+      builder.graph.entry.addAtEntry(thisInstruction);
+      directLocals[closureData.thisElement] = thisInstruction;
     }
 
     // If this method is an intercepted method, add the extra
@@ -926,7 +928,6 @@
   LocalsHandler localsHandler;
   HInstruction rethrowableException;
   Map<Element, HInstruction> parameters;
-  HInstruction thisInstruction;
   final RuntimeTypeInformation rti;
   HParameterValue lastAddedParameter;
 
@@ -1165,9 +1166,6 @@
     element = element.implementation;
     // TODO(floitsch): we should be able to inline inside lazy initializers.
     if (!currentElement.isFunction()) return false;
-    // TODO(floitsch): we should be able to inline getters, setters and
-    // constructor bodies.
-    if (!element.isFunction()) return false;
     // TODO(floitsch): find a cleaner way to know if the element is a function
     // containing nodes.
     // [PartialFunctionElement]s are [FunctionElement]s that have [Node]s.
@@ -1180,9 +1178,6 @@
     for (int i = 0; i < inliningStack.length; i++) {
       if (inliningStack[i].function == element) return false;
     }
-    // TODO(ngeoffray): Inlining currently does not work in the presence of
-    // private calls.
-    if (currentLibrary != element.getLibrary()) return false;
     PartialFunctionElement function = element;
     int sourceSize =
         function.endToken.charOffset - function.beginToken.charOffset;
@@ -2299,83 +2294,89 @@
     assert(!identical(op.token.kind, PLUS_TOKEN));
     HInstruction operand = pop();
 
-    HInstruction target =
-        new HStatic(interceptors.getPrefixOperatorInterceptor(op));
-    add(target);
-    HInvokeUnary result;
-    String value = op.source.stringValue;
-    switch (value) {
-      case "-": result = new HNegate(target, operand); break;
-      case "~": result = new HBitNot(target, operand); break;
-      default:
-        compiler.internalError('Unexpected unary operator: $value.', node: op);
-        break;
-    }
     // See if we can constant-fold right away. This avoids rewrites later on.
     if (operand is HConstant) {
+      UnaryOperation operation = constantSystem.lookupUnary(op.source);
       HConstant constant = operand;
-      Constant folded =
-          result.operation(constantSystem).fold(constant.constant);
+      Constant folded = operation.fold(constant.constant);
       if (folded != null) {
         stack.add(graph.addConstant(folded));
         return;
       }
     }
+
+    HInvokeDynamicMethod result =
+        buildInvokeDynamic(node, elements.getSelector(node), operand, []);
     pushWithPosition(result, node);
   }
 
-  void visitBinary(HInstruction left, Operator op, HInstruction right) {
+  void visitBinary(
+      HInstruction left, Operator op, HInstruction right, Send send) {
+    Selector selector = null;
+    // TODO(ngeoffray): The resolver creates these selectors already
+    // but does not put them on the [send] instruction.
+    switch (op.source.stringValue) {
+      case "+":
+      case "+=":
+      case "++":
+        selector = new Selector.binaryOperator(const SourceString('+'));
+        break;
+      case "-":
+      case "-=":
+      case "--":
+        selector = new Selector.binaryOperator(const SourceString('-'));
+        break;
+      case "*":
+      case "*=":
+        selector = new Selector.binaryOperator(const SourceString('*'));
+        break;
+      case "/":
+      case "/=":
+        selector = new Selector.binaryOperator(const SourceString('/'));
+        break;
+      case "~/":
+      case "~/=":
+        selector = new Selector.binaryOperator(const SourceString('~/'));
+        break;
+      case "%":
+      case "%=":
+        selector = new Selector.binaryOperator(const SourceString('%'));
+        break;
+      case "<<":
+      case "<<=":
+        selector = new Selector.binaryOperator(const SourceString('<<'));
+        break;
+      case ">>":
+      case ">>=":
+        selector = new Selector.binaryOperator(const SourceString('>>'));
+        break;
+      case "|":
+      case "|=":
+        selector = new Selector.binaryOperator(const SourceString('|'));
+        break;
+      case "&":
+      case "&=":
+        selector = new Selector.binaryOperator(const SourceString('&'));
+        break;
+      case "^":
+      case "^=":
+        selector = new Selector.binaryOperator(const SourceString('^'));
+        break;
+      default:
+        break;
+    }
+
+    if (selector != null) {
+      pushWithPosition(
+            buildInvokeDynamic(send, selector, left, [right]),
+            op);
+      return;
+    }
     Element element = interceptors.getOperatorInterceptor(op);
     assert(element != null);
     HInstruction target = new HStatic(element);
     add(target);
     switch (op.source.stringValue) {
-      case "+":
-      case "++":
-      case "+=":
-        pushWithPosition(new HAdd(target, left, right), op);
-        break;
-      case "-":
-      case "--":
-      case "-=":
-        pushWithPosition(new HSubtract(target, left, right), op);
-        break;
-      case "*":
-      case "*=":
-        pushWithPosition(new HMultiply(target, left, right), op);
-        break;
-      case "/":
-      case "/=":
-        pushWithPosition(new HDivide(target, left, right), op);
-        break;
-      case "~/":
-      case "~/=":
-        pushWithPosition(new HTruncatingDivide(target, left, right), op);
-        break;
-      case "%":
-      case "%=":
-        pushWithPosition(new HModulo(target, left, right), op);
-        break;
-      case "<<":
-      case "<<=":
-        pushWithPosition(new HShiftLeft(target, left, right), op);
-        break;
-      case ">>":
-      case ">>=":
-        pushWithPosition(new HShiftRight(target, left, right), op);
-        break;
-      case "|":
-      case "|=":
-        pushWithPosition(new HBitOr(target, left, right), op);
-        break;
-      case "&":
-      case "&=":
-        pushWithPosition(new HBitAnd(target, left, right), op);
-        break;
-      case "^":
-      case "^=":
-        pushWithPosition(new HBitXor(target, left, right), op);
-        break;
       case "==":
         pushWithPosition(new HEquals(target, left, right), op);
         break;
@@ -2427,14 +2428,8 @@
     return result;
   }
 
-  Set<ClassElement> getInterceptedClassesOn(Send send, Selector selector) {
+  Set<ClassElement> getInterceptedClassesOn(Selector selector) {
     if (!methodInterceptionEnabled) return null;
-    if (!backend.isInterceptorClass(currentElement.getEnclosingClass())
-        && send.receiver == null) {
-      // The call applies to [:this:] which can not be an interceptor
-      // object.
-      return null;
-    }
     return interceptors.getInterceptedClassesOn(selector);
   }
 
@@ -2449,8 +2444,7 @@
         : elements.getSelector(send.selector);
     assert(selector.isGetter());
     SourceString getterName = selector.name;
-    Set<ClassElement> interceptedClasses =
-        getInterceptedClassesOn(send, selector);
+    Set<ClassElement> interceptedClasses = getInterceptedClassesOn(selector);
 
     bool hasGetter = compiler.world.hasAnyUserDefinedGetter(selector);
     if (interceptedClasses != null) {
@@ -2484,6 +2478,12 @@
       } else if (element.isField() && isLazilyInitialized(element)) {
         push(new HLazyStatic(element));
       } else {
+        if (element.isGetter()) {
+          Selector selector = elements.getSelector(send);
+          if (tryInlineMethod(element, selector, const Link<Node>())) {
+            return;
+          }
+        }
         // TODO(5346): Try to avoid the need for calling [declaration] before
         // creating an [HStatic].
         push(new HStatic(element.declaration));
@@ -2518,8 +2518,7 @@
     assert(selector.isSetter());
     SourceString setterName = selector.name;
     bool hasSetter = compiler.world.hasAnyUserDefinedSetter(selector);
-    Set<ClassElement> interceptedClasses =
-        getInterceptedClassesOn(send, selector);
+    Set<ClassElement> interceptedClasses = getInterceptedClassesOn(selector);
     if (interceptedClasses != null) {
       // If we're using an interceptor class, emit a call to the
       // getInterceptor method and then the actual dynamic call on the
@@ -2578,11 +2577,6 @@
   HInstruction invokeInterceptor(Set<ClassElement> intercepted,
                                  HInstruction receiver,
                                  Send send) {
-    if (send != null
-        && backend.isInterceptorClass(currentElement.getEnclosingClass())
-        && send.receiver == null) {
-      return thisInstruction;
-    }
     HInterceptor interceptor = new HInterceptor(intercepted, receiver);
     add(interceptor);
     return interceptor;
@@ -2794,7 +2788,7 @@
       visit(node.argumentsNode);
       var right = pop();
       var left = pop();
-      visitBinary(left, op, right);
+      visitBinary(left, op, right, node);
     }
   }
 
@@ -2894,31 +2888,44 @@
     }
 
     Element element = elements[node];
+    bool isClosureCall = false;
     if (element != null && compiler.world.hasNoOverridingMember(element)) {
       if (tryInlineMethod(element, selector, node.arguments)) {
-        return;
+        if (element.isGetter()) {
+          // If the element is a getter, we are doing a closure call
+          // on what this getter returns.
+          assert(selector.isCall());
+          isClosureCall = true;
+        } else {
+          return;
+        }
       }
     }
 
-    HInstruction receiver;
-    if (node.receiver == null) {
-      receiver = localsHandler.readThis();
-    } else {
-      visit(node.receiver);
-      receiver = pop();
-    }
-
     List<HInstruction> inputs = <HInstruction>[];
-    Set<ClassElement> interceptedClasses =
-        getInterceptedClassesOn(node, selector);
-    if (interceptedClasses != null) {
-      inputs.add(invokeInterceptor(interceptedClasses, receiver, node));
+    if (isClosureCall) inputs.add(pop());
+
+    HInstruction receiver;
+    if (!isClosureCall) {
+      if (node.receiver == null) {
+        receiver = localsHandler.readThis();
+      } else {
+        visit(node.receiver);
+        receiver = pop();
+      }
     }
-    inputs.add(receiver);
 
     addDynamicSendArgumentsToList(node, inputs);
 
-    pushWithPosition(new HInvokeDynamicMethod(selector, inputs), node);
+    HInstruction invoke;
+    if (isClosureCall) {
+      Selector closureSelector = new Selector.callClosureFrom(selector);
+      invoke = new HInvokeClosure(closureSelector, inputs);
+    } else {
+      invoke = buildInvokeDynamic(node, selector, receiver, inputs);
+    }
+
+    pushWithPosition(invoke, node);
 
     if (isNotEquals) {
       HNot not = new HNot(popBoolified());
@@ -2941,7 +2948,8 @@
     var inputs = <HInstruction>[];
     inputs.add(closureTarget);
     addDynamicSendArgumentsToList(node, inputs);
-    pushWithPosition(new HInvokeClosure(selector, inputs), node);
+    Selector closureSelector = new Selector.callClosureFrom(selector);
+    pushWithPosition(new HInvokeClosure(closureSelector, inputs), node);
   }
 
   void registerForeignTypes(String specString) {
@@ -3079,16 +3087,16 @@
     }
   }
 
-  void handleForeignDartClosureToJs(Send node) {
+  FunctionSignature handleForeignRawFunctionRef(Send node, String name) {
     if (node.arguments.isEmpty || !node.arguments.tail.isEmpty) {
-      compiler.cancel('Exactly one argument required',
+      compiler.cancel('"$name" requires exactly one argument',
                       node: node.argumentsNode);
     }
     Node closure = node.arguments.head;
     Element element = elements[closure];
     if (!Elements.isStaticOrTopLevelFunction(element)) {
       compiler.cancel(
-          'JS_TO_CLOSURE requires a static or top-level method',
+          '"$name" requires a static or top-level method',
           node: closure);
     }
     FunctionElement function = element;
@@ -3099,10 +3107,15 @@
     FunctionSignature params = implementation.computeSignature(compiler);
     if (params.optionalParameterCount != 0) {
       compiler.cancel(
-          'JS_TO_CLOSURE does not handle closure with optional parameters',
+          '"$name" does not handle closure with optional parameters',
           node: closure);
     }
     visit(closure);
+    return params;
+  }
+
+  void handleForeignDartClosureToJs(Send node, String name) {
+    FunctionSignature params = handleForeignRawFunctionRef(node, name);
     List<HInstruction> inputs = <HInstruction>[pop()];
     String invocationName = backend.namer.invocationName(
         new Selector.callClosure(params.requiredParameterCount));
@@ -3148,7 +3161,9 @@
     } else if (name == const SourceString('JS_CALL_IN_ISOLATE')) {
       handleForeignJsCallInIsolate(node);
     } else if (name == const SourceString('DART_CLOSURE_TO_JS')) {
-      handleForeignDartClosureToJs(node);
+      handleForeignDartClosureToJs(node, 'DART_CLOSURE_TO_JS');
+    } else if (name == const SourceString('RAW_DART_FUNCTION_REF')) {
+      handleForeignRawFunctionRef(node, 'RAW_DART_FUNCTION_REF');
     } else if (name == const SourceString('JS_SET_CURRENT_ISOLATE')) {
       handleForeignSetCurrentIsolate(node);
     } else if (name == const SourceString('JS_CREATE_ISOLATE')) {
@@ -3252,7 +3267,8 @@
       add(target);
       inputs = <HInstruction>[target];
       addDynamicSendArgumentsToList(node, inputs);
-      push(new HInvokeClosure(selector, inputs));
+      Selector closureSelector = new Selector.callClosureFrom(selector);
+      push(new HInvokeClosure(closureSelector, inputs));
     }
   }
 
@@ -3442,7 +3458,10 @@
     }
     compiler.ensure(!element.isGenerativeConstructor());
     if (element.isFunction()) {
-      if (tryInlineMethod(element, selector, node.arguments)) {
+      bool isIdenticalFunction = element == compiler.identicalFunction;
+
+      if (!isIdenticalFunction
+          && tryInlineMethod(element, selector, node.arguments)) {
         return;
       }
 
@@ -3459,7 +3478,7 @@
         return;
       }
 
-      if (identical(element, compiler.identicalFunction)) {
+      if (isIdenticalFunction) {
         pushWithPosition(new HIdentity(target, inputs[1], inputs[2]), node);
         return;
       }
@@ -3476,7 +3495,8 @@
       generateGetter(node, element);
       List<HInstruction> inputs = <HInstruction>[pop()];
       addDynamicSendArgumentsToList(node, inputs);
-      pushWithPosition(new HInvokeClosure(selector, inputs), node);
+      Selector closureSelector = new Selector.callClosureFrom(selector);
+      pushWithPosition(new HInvokeClosure(closureSelector, inputs), node);
     }
   }
 
@@ -3508,7 +3528,8 @@
       Selector selector = elements.getSelector(node);
       List<HInstruction> inputs = <HInstruction>[target];
       addDynamicSendArgumentsToList(node, inputs);
-      push(new HInvokeClosure(selector, inputs));
+      Selector closureSelector = new Selector.callClosureFrom(selector);
+      push(new HInvokeClosure(closureSelector, inputs));
     }
   }
 
@@ -3640,17 +3661,20 @@
     }
   }
 
-  HInvokeDynamicMethod buildInvokeDynamicWithOneArgument(
-      Node node, Selector selector, HInstruction receiver, HInstruction arg0) {
-    Set<ClassElement> interceptedClasses =
-        getInterceptedClassesOn(node, selector);
+  HInvokeDynamicMethod buildInvokeDynamic(Node node,
+                                          Selector selector,
+                                          HInstruction receiver,
+                                          List<HInstruction> arguments) {
+    Set<ClassElement> interceptedClasses = getInterceptedClassesOn(selector);
     List<HInstruction> inputs = <HInstruction>[];
-    if (interceptedClasses != null) {
+    bool isIntercepted = interceptedClasses != null;
+    if (isIntercepted) {
+      assert(!interceptedClasses.isEmpty);
       inputs.add(invokeInterceptor(interceptedClasses, receiver, node));
     }
     inputs.add(receiver);
-    inputs.add(arg0);
-    return new HInvokeDynamicMethod(selector, inputs);
+    inputs.addAll(arguments);
+    return new HInvokeDynamicMethod(selector, inputs, isIntercepted);
   }
 
   visitSendSet(SendSet node) {
@@ -3678,47 +3702,41 @@
       if (!methodInterceptionEnabled) {
         assert(identical(op.source.stringValue, '='));
         visitDynamicSend(node);
+      } else if (const SourceString("=") == op.source) {
+        visitDynamicSend(node);
+        HInvokeDynamicMethod method = pop();
+        // Push the value.
+        stack.add(method.inputs.last);
       } else {
-        HStatic target = new HStatic(
-            interceptors.getIndexAssignmentInterceptor());
-        add(target);
         visit(node.receiver);
         HInstruction receiver = pop();
         visit(node.argumentsNode);
-        if (const SourceString("=") == op.source) {
-          HInstruction value = pop();
-          HInstruction index = pop();
-          add(new HIndexAssign(target, receiver, index, value));
+        HInstruction value;
+        HInstruction index;
+        // Compound assignments are considered as being prefix.
+        bool isCompoundAssignment = op.source.stringValue.endsWith('=');
+        bool isPrefix = !node.isPostfix;
+        Element getter = elements[node.selector];
+        if (isCompoundAssignment) {
+          value = pop();
+          index = pop();
+        } else {
+          index = pop();
+          value = graph.addConstantInt(1, constantSystem);
+        }
+
+        HInvokeDynamicMethod left = buildInvokeDynamic(
+            node, new Selector.index(), receiver, [index]);
+        add(left);
+        visitBinary(left, op, value, node);
+        value = pop();
+        HInvokeDynamicMethod assign = buildInvokeDynamic(
+            node, new Selector.indexSet(), receiver, [index, value]);
+        add(assign);
+        if (isPrefix) {
           stack.add(value);
         } else {
-          HInstruction value;
-          HInstruction index;
-          bool isCompoundAssignment = op.source.stringValue.endsWith('=');
-          // Compound assignments are considered as being prefix.
-          bool isPrefix = !node.isPostfix;
-          Element getter = elements[node.selector];
-          if (isCompoundAssignment) {
-            value = pop();
-            index = pop();
-          } else {
-            index = pop();
-            value = graph.addConstantInt(1, constantSystem);
-          }
-
-          HInvokeDynamicMethod left = buildInvokeDynamicWithOneArgument(
-              node, new Selector.index(), receiver, index);
-          add(left);
-          Element opElement = elements[op];
-          visitBinary(left, op, value);
-          value = pop();
-          HInstruction assign = new HIndexAssign(
-              target, receiver, index, value);
-          add(assign);
-          if (isPrefix) {
-            stack.add(value);
-          } else {
-            stack.add(left);
-          }
+          stack.add(left);
         }
       }
     } else if (const SourceString("=") == op.source) {
@@ -3755,7 +3773,7 @@
       } else {
         right = graph.addConstantInt(1, constantSystem);
       }
-      visitBinary(left, op, right);
+      visitBinary(left, op, right, node);
       HInstruction operation = pop();
       assert(operation != null);
       if (Elements.isInstanceSend(node, elements)) {
@@ -4531,7 +4549,7 @@
     if (!isAborted()) endTryBlock = close(new HGoto());
     SubGraph bodyGraph = new SubGraph(startTryBlock, lastOpenedBlock);
     SubGraph catchGraph = null;
-    HParameterValue exception = null;
+    HLocalValue exception = null;
 
     if (!node.catchBlocks.isEmpty) {
       localsHandler = new LocalsHandler.from(savedLocals);
@@ -4541,7 +4559,7 @@
       // Note that the name of this element is irrelevant.
       Element element = new ElementX(
           const SourceString('exception'), ElementKind.PARAMETER, work.element);
-      exception = new HParameterValue(element);
+      exception = new HLocalValue(element);
       add(exception);
       HInstruction oldRethrowableException = rethrowableException;
       rethrowableException = exception;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index 71f5650..bc20ed2 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -169,7 +169,6 @@
   final Set<HInstruction> controlFlowOperators;
   final Map<Element, ElementAction> breakAction;
   final Map<Element, ElementAction> continueAction;
-  final Map<Element, String> parameterNames;
   final List<js.Parameter> parameters;
 
   js.Block currentContainer;
@@ -214,7 +213,6 @@
     : this.work = work,
       this.types =
           (work.compilationContext as JavaScriptItemCompilationContext).types,
-      parameterNames = new LinkedHashMap<Element, String>(),
       declaredLocals = new Set<String>(),
       collectedVariableDeclarations = new OrderedSet<String>(),
       currentContainer = new js.Block.empty(),
@@ -226,7 +224,6 @@
       breakAction = new Map<Element, ElementAction>(),
       continueAction = new Map<Element, ElementAction>();
 
-  LibraryElement get currentLibrary => work.element.getLibrary();
   Compiler get compiler => backend.compiler;
   NativeEmitter get nativeEmitter => backend.emitter.nativeEmitter;
   CodegenEnqueuer get world => backend.compiler.enqueuer.codegen;
@@ -359,8 +356,7 @@
         compiler,
         intervalBuilder.liveInstructions,
         intervalBuilder.liveIntervals,
-        generateAtUseSite,
-        parameterNames);
+        generateAtUseSite);
     allocator.visitGraph(graph);
     variableNames = allocator.names;
     shouldGroupVarDeclarations = allocator.names.numberOfVariables > 1;
@@ -668,6 +664,9 @@
         needsAssignment = false;
       }
     }
+    if (instruction is HLocalValue) {
+      needsAssignment = false;
+    }
 
     if (needsAssignment &&
         !instruction.isControlFlow() && variableNames.hasName(instruction)) {
@@ -800,9 +799,8 @@
     js.Catch catchPart = null;
     js.Block finallyPart = null;
     if (info.catchBlock != null) {
-      HParameterValue exception = info.catchVariable;
+      HLocalValue exception = info.catchVariable;
       String name = variableNames.getName(exception);
-      parameterNames[exception.sourceElement] = name;
       js.VariableDeclaration decl = new js.VariableDeclaration(name);
       js.Block catchBlock = generateStatementsInNewBlock(info.catchBlock);
       catchPart = new js.Catch(decl, catchBlock);
@@ -1259,6 +1257,13 @@
   }
 
   visitInvokeBinary(HInvokeBinary node, String op) {
+    use(node.left);
+    js.Expression jsLeft = pop();
+    use(node.right);
+    push(new js.Binary(op, jsLeft, pop()), node);
+  }
+
+  visitRelational(HRelational node, String op) {
     if (node.isBuiltin(types)) {
       use(node.left);
       js.Expression jsLeft = pop();
@@ -1273,25 +1278,21 @@
   // shift operator to achieve this.
   visitBitInvokeBinary(HBinaryBitOp node, String op) {
     visitInvokeBinary(node, op);
-    if (node.isBuiltin(types) && requiresUintConversion(node)) {
+    if (requiresUintConversion(node)) {
       push(new js.Binary(">>>", pop(), new js.LiteralNumber("0")), node);
     }
   }
 
   visitInvokeUnary(HInvokeUnary node, String op) {
-    if (node.isBuiltin(types)) {
-      use(node.operand);
-      push(new js.Prefix(op, pop()), node);
-    } else {
-      visitInvokeStatic(node);
-    }
+    use(node.operand);
+    push(new js.Prefix(op, pop()), node);
   }
 
   // We want the outcome of bit-operations to be positive. We use the unsigned
   // shift operator to achieve this.
   visitBitInvokeUnary(HInvokeUnary node, String op) {
     visitInvokeUnary(node, op);
-    if (node.isBuiltin(types) && requiresUintConversion(node)) {
+    if (requiresUintConversion(node)) {
       push(new js.Binary(">>>", pop(), new js.LiteralNumber("0")), node);
     }
   }
@@ -1336,24 +1337,18 @@
   visitDivide(HDivide node)         => visitInvokeBinary(node, '/');
   visitMultiply(HMultiply node)     => visitInvokeBinary(node, '*');
   visitSubtract(HSubtract node)     => visitInvokeBinary(node, '-');
-  // Truncating divide does not have a JS equivalent.
-  visitTruncatingDivide(HTruncatingDivide node) => visitInvokeStatic(node);
-  // Modulo cannot be mapped to the native operator (different semantics).
-  visitModulo(HModulo node)                     => visitInvokeStatic(node);
-
   visitBitAnd(HBitAnd node)         => visitBitInvokeBinary(node, '&');
   visitBitNot(HBitNot node)         => visitBitInvokeUnary(node, '~');
   visitBitOr(HBitOr node)           => visitBitInvokeBinary(node, '|');
   visitBitXor(HBitXor node)         => visitBitInvokeBinary(node, '^');
-  visitShiftRight(HShiftRight node) => visitBitInvokeBinary(node, '>>');
   visitShiftLeft(HShiftLeft node)   => visitBitInvokeBinary(node, '<<');
 
   visitNegate(HNegate node)         => visitInvokeUnary(node, '-');
 
-  visitLess(HLess node)                 => visitInvokeBinary(node, '<');
-  visitLessEqual(HLessEqual node)       => visitInvokeBinary(node, '<=');
-  visitGreater(HGreater node)           => visitInvokeBinary(node, '>');
-  visitGreaterEqual(HGreaterEqual node) => visitInvokeBinary(node, '>=');
+  visitLess(HLess node)                 => visitRelational(node, '<');
+  visitLessEqual(HLessEqual node)       => visitRelational(node, '<=');
+  visitGreater(HGreater node)           => visitRelational(node, '>');
+  visitGreaterEqual(HGreaterEqual node) => visitRelational(node, '>=');
 
   visitBoolify(HBoolify node) {
     assert(node.inputs.length == 1);
@@ -1653,11 +1648,6 @@
                         visitArguments(node.inputs)),
          node);
     world.registerDynamicInvocation(call.name, call);
-    // A closure can also be invoked through [HInvokeDynamicMethod] by
-    // explicitly calling the [:call:] method. Therefore, we must also
-    // register types here to let the backend invalidate wrong
-    // optimizations.
-    backend.registerDynamicInvocation(node, call, types);
   }
 
   visitInvokeStatic(HInvokeStatic node) {
@@ -1896,18 +1886,24 @@
       };
       HRelational relational = input;
       BinaryOperation operation = relational.operation(backend.constantSystem);
-      visitInvokeBinary(input, inverseOperator[operation.name.stringValue]);
+      visitRelational(input, inverseOperator[operation.name.stringValue]);
     } else {
       use(input);
       push(new js.Prefix("!", pop()));
     }
   }
 
-  visitParameterValue(HParameterValue node) => visitLocalValue(node);
+  visitParameterValue(HParameterValue node) {
+    assert(!isGenerateAtUseSite(node));
+    String name = variableNames.getName(node);
+    parameters.add(new js.Parameter(name));
+    declaredLocals.add(name);
+  }
 
   visitLocalValue(HLocalValue node) {
-    assert(isGenerateAtUseSite(node));
-    push(new js.VariableUse(variableNames.getName(node)), node);
+    assert(!isGenerateAtUseSite(node));
+    String name = variableNames.getName(node);
+    collectedVariableDeclarations.add(name);
   }
 
   visitPhi(HPhi node) {
@@ -2143,17 +2139,13 @@
   }
 
   void visitIndexAssign(HIndexAssign node) {
-    if (node.isBuiltin(types)) {
-      use(node.inputs[1]);
-      js.Expression receiver = pop();
-      use(node.inputs[2]);
-      js.Expression index = pop();
-      use(node.inputs[3]);
-      push(new js.Assignment(new js.PropertyAccess(receiver, index), pop()),
-           node);
-    } else {
-      visitInvokeStatic(node);
-    }
+    use(node.receiver);
+    js.Expression receiver = pop();
+    use(node.index);
+    js.Expression index = pop();
+    use(node.value);
+    push(new js.Assignment(new js.PropertyAccess(receiver, index), pop()),
+         node);
   }
 
   void checkInt(HInstruction input, String cmp) {
@@ -2510,12 +2502,6 @@
   int maxBailoutParameters;
 
   HBasicBlock beginGraph(HGraph graph) {
-    // Declare the parameter names only for the optimized version. The
-    // unoptimized version has different parameters.
-    parameterNames.forEach((Element element, String name) {
-      parameters.add(new js.Parameter(name));
-      declaredLocals.add(name);
-    });
     return graph.entry;
   }
 
@@ -2792,6 +2778,11 @@
     }
   }
 
+  visitParameterValue(HParameterValue node) {
+    // Nothing to do, parameters are dealt with specially in a bailout
+    // method.
+  }
+
   bool visitAndOrInfo(HAndOrBlockInformation info) => false;
 
   bool visitIfInfo(HIfBlockInformation info) {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
index d7c8547..01543cb 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
@@ -34,7 +34,8 @@
     if (!generateAtUseSite.contains(input)
         && !input.isCodeMotionInvariant()
         && input.usedBy.length == 1
-        && input is !HPhi) {
+        && input is !HPhi
+        && input is !HLocalValue) {
       expectedInputs.add(input);
     }
   }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart b/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
new file mode 100644
index 0000000..06e8d64
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
@@ -0,0 +1,478 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of ssa;
+
+/**
+ * [InvokeDynamicSpecializer] and its subclasses are helpers to
+ * optimize intercepted dynamic calls. It knows what input types
+ * would be beneficial for performance, and how to change a invoke
+ * dynamic to a builtin instruction (e.g. HIndex, HBitNot).
+ */
+class InvokeDynamicSpecializer {
+  const InvokeDynamicSpecializer();
+
+  HType computeDesiredTypeForInput(HInvokeDynamicMethod instruction,
+                                   HInstruction input,
+                                   HTypeMap types,
+                                   Compiler compiler) {
+    return HType.UNKNOWN;
+  }
+
+  HType computeTypeFromInputTypes(HInvokeDynamicMethod instruction,
+                                  HTypeMap types,
+                                  Compiler compiler) {
+    return HType.UNKNOWN;
+  }
+
+  HInstruction tryConvertToBuiltin(HInvokeDynamicMethod instruction,
+                                   HTypeMap types) {
+    return null;
+  }
+
+  Operation operation(ConstantSystem constantSystem) => null;
+
+  static InvokeDynamicSpecializer lookupSpecializer(Selector selector) {
+    if (selector.kind == SelectorKind.INDEX) {
+      return selector.name == const SourceString('[]')
+          ? const IndexSpecializer()
+          : const IndexAssignSpecializer();
+    } else if (selector.kind == SelectorKind.OPERATOR) {
+      if (selector.name == const SourceString('unary-')) {
+        return const UnaryNegateSpecializer();
+      } else if (selector.name == const SourceString('~')) {
+        return const BitNotSpecializer();
+      } else if (selector.name == const SourceString('+')) {
+        return const AddSpecializer();
+      } else if (selector.name == const SourceString('-')) {
+        return const SubtractSpecializer();
+      } else if (selector.name == const SourceString('*')) {
+        return const MultiplySpecializer();
+      } else if (selector.name == const SourceString('/')) {
+        return const DivideSpecializer();
+      } else if (selector.name == const SourceString('~/')) {
+        return const TruncatingDivideSpecializer();
+      } else if (selector.name == const SourceString('%')) {
+        return const ModuloSpecializer();
+      } else if (selector.name == const SourceString('>>')) {
+        return const ShiftRightSpecializer();
+      } else if (selector.name == const SourceString('<<')) {
+        return const ShiftLeftSpecializer();
+      } else if (selector.name == const SourceString('&')) {
+        return const BitAndSpecializer();
+      } else if (selector.name == const SourceString('|')) {
+        return const BitOrSpecializer();
+      } else if (selector.name == const SourceString('^')) {
+        return const BitXorSpecializer();
+      }
+    }
+    return const InvokeDynamicSpecializer();
+  }
+}
+
+class IndexAssignSpecializer extends InvokeDynamicSpecializer {
+  const IndexAssignSpecializer();
+
+  HType computeDesiredTypeForInput(HInvokeDynamicMethod instruction,
+                                   HInstruction input,
+                                   HTypeMap types,
+                                   Compiler compiler) {
+    HInstruction index = instruction.inputs[2];
+    if (input == instruction.inputs[1] &&
+        (index.isTypeUnknown(types) || index.isNumber(types))) {
+      return HType.MUTABLE_ARRAY;
+    }
+    // The index should be an int when the receiver is a string or array.
+    // However it turns out that inserting an integer check in the optimized
+    // version is cheaper than having another bailout case. This is true,
+    // because the integer check will simply throw if it fails.
+    return HType.UNKNOWN;
+  }
+
+  HInstruction tryConvertToBuiltin(HInvokeDynamicMethod instruction,
+                                   HTypeMap types) {
+    if (instruction.inputs[1].isMutableArray(types)) {
+      return new HIndexAssign(instruction.inputs[1],
+                              instruction.inputs[2],
+                              instruction.inputs[3]);
+    }
+    return null;
+  }
+}
+
+class IndexSpecializer extends InvokeDynamicSpecializer {
+  const IndexSpecializer();
+
+  HType computeDesiredTypeForInput(HInvokeDynamicMethod instruction,
+                                   HInstruction input,
+                                   HTypeMap types,
+                                   Compiler compiler) {
+    HInstruction index = instruction.inputs[2];
+    if (input == instruction.inputs[1] &&
+        (index.isTypeUnknown(types) || index.isNumber(types))) {
+      return HType.INDEXABLE_PRIMITIVE;
+    }
+    // The index should be an int when the receiver is a string or array.
+    // However it turns out that inserting an integer check in the optimized
+    // version is cheaper than having another bailout case. This is true,
+    // because the integer check will simply throw if it fails.
+    return HType.UNKNOWN;
+  }
+
+  HInstruction tryConvertToBuiltin(HInvokeDynamicMethod instruction,
+                                   HTypeMap types) {
+    if (instruction.inputs[1].isIndexablePrimitive(types)) {
+      return new HIndex(instruction.inputs[1], instruction.inputs[2]);
+    }
+    return null;
+  }
+}
+
+class BitNotSpecializer extends InvokeDynamicSpecializer {
+  const BitNotSpecializer();
+
+  UnaryOperation operation(ConstantSystem constantSystem) {
+    return constantSystem.bitNot;
+  }
+
+  HType computeDesiredTypeForInput(HInvokeDynamicMethod instruction,
+                                   HInstruction input,
+                                   HTypeMap types,
+                                   Compiler compiler) {
+    if (input == instruction.inputs[1]) {
+      HType propagatedType = types[instruction];
+      if (propagatedType.isUnknown() || propagatedType.isNumber()) {
+        return HType.INTEGER;
+      }
+    }
+    return HType.UNKNOWN;
+  }
+
+  HType computeTypeFromInputTypes(HInvokeDynamicMethod instruction,
+                                  HTypeMap types,
+                                  Compiler compiler) {
+    // All bitwise operations on primitive types either produce an
+    // integer or throw an error.
+    if (instruction.inputs[1].isPrimitive(types)) return HType.INTEGER;
+    return HType.UNKNOWN;
+  }
+
+  HInstruction tryConvertToBuiltin(HInvokeDynamicMethod instruction,
+                                   HTypeMap types) {
+    HInstruction input = instruction.inputs[1];
+    if (input.isNumber(types)) return new HBitNot(input);
+    return null;
+  }
+}
+
+class UnaryNegateSpecializer extends InvokeDynamicSpecializer {
+  const UnaryNegateSpecializer();
+
+  UnaryOperation operation(ConstantSystem constantSystem) {
+    return constantSystem.negate;
+  }
+
+  HType computeDesiredTypeForInput(HInvokeDynamicMethod instruction,
+                                   HInstruction input,
+                                   HTypeMap types,
+                                   Compiler compiler) {
+    if (input == instruction.inputs[1]) {
+      HType propagatedType = types[instruction];
+      // If the outgoing type should be a number (integer, double or both) we
+      // want the outgoing type to be the input too.
+      // If we don't know the outgoing type we try to make it a number.
+      if (propagatedType.isNumber()) return propagatedType;
+      if (propagatedType.isUnknown()) return HType.NUMBER;
+    }
+    return HType.UNKNOWN;
+  }
+
+  HType computeTypeFromInputTypes(HInvokeDynamicMethod instruction,
+                                  HTypeMap types,
+                                  Compiler compiler) {
+    HType operandType = types[instruction.inputs[1]];
+    if (operandType.isNumber()) return operandType;
+    return HType.UNKNOWN;
+  }
+
+  HInstruction tryConvertToBuiltin(HInvokeDynamicMethod instruction,
+                                   HTypeMap types) {
+    HInstruction input = instruction.inputs[1];
+    if (input.isNumber(types)) return new HNegate(input);
+    return null;
+  }
+}
+
+abstract class BinaryArithmeticSpecializer extends InvokeDynamicSpecializer {
+  const BinaryArithmeticSpecializer();
+
+  HType computeTypeFromInputTypes(HInvokeDynamicMethod instruction,
+                                  HTypeMap types,
+                                  Compiler compiler) {
+    HInstruction left = instruction.inputs[1];
+    HInstruction right = instruction.inputs[2];
+    if (left.isInteger(types) && right.isInteger(types)) return HType.INTEGER;
+    if (left.isNumber(types)) {
+      if (left.isDouble(types) || right.isDouble(types)) return HType.DOUBLE;
+      return HType.NUMBER;
+    }
+    return HType.UNKNOWN;
+  }
+
+  HType computeDesiredTypeForInput(HInvokeDynamicMethod instruction,
+                                   HInstruction input,
+                                   HTypeMap types,
+                                   Compiler compiler) {
+    if (input == instruction.inputs[0]) return HType.UNKNOWN;
+
+    HType propagatedType = types[instruction];
+    // If the desired output type should be an integer we want to get two
+    // integers as arguments.
+    if (propagatedType.isInteger()) return HType.INTEGER;
+    // If the outgoing type should be a number we can get that if both inputs
+    // are numbers. If we don't know the outgoing type we try to make it a
+    // number.
+    if (propagatedType.isUnknown() || propagatedType.isNumber()) {
+      return HType.NUMBER;
+    }
+    // Even if the desired outgoing type is not a number we still want the
+    // second argument to be a number if the first one is a number. This will
+    // not help for the outgoing type, but at least the binary arithmetic
+    // operation will not have type problems.
+    // TODO(floitsch): normally we shouldn't request a number, but simply
+    // throw an ArgumentError if it isn't. This would be similar
+    // to the array case.
+    HInstruction left = instruction.inputs[1];
+    HInstruction right = instruction.inputs[2];
+    if (input == right && left.isNumber(types)) return HType.NUMBER;
+    return HType.UNKNOWN;
+  }
+
+  bool isBuiltin(HInvokeDynamicMethod instruction, HTypeMap types) {
+    return instruction.inputs[1].isNumber(types)
+        && instruction.inputs[2].isNumber(types);
+  }
+
+  HInstruction tryConvertToBuiltin(HInvokeDynamicMethod instruction,
+                                   HTypeMap types) {
+    if (isBuiltin(instruction, types)) {
+      return newBuiltinVariant(instruction.inputs[1], instruction.inputs[2]);
+    }
+    return null;
+  }
+
+  HInstruction newBuiltinVariant(HInstruction left, HInstruction right);
+}
+
+class AddSpecializer extends BinaryArithmeticSpecializer {
+  const AddSpecializer();
+
+  BinaryOperation operation(ConstantSystem constantSystem) {
+    return constantSystem.add;
+  }
+
+  HInstruction newBuiltinVariant(HInstruction left, HInstruction right) {
+    return new HAdd(left, right);
+  }
+}
+
+class DivideSpecializer extends BinaryArithmeticSpecializer {
+  const DivideSpecializer();
+
+  BinaryOperation operation(ConstantSystem constantSystem) {
+    return constantSystem.divide;
+  }
+
+  HType computeTypeFromInputTypes(HInstruction instruction,
+                                  HTypeMap types,
+                                  Compiler compiler) {
+    HInstruction left = instruction.inputs[1];
+    if (left.isNumber(types)) return HType.DOUBLE;
+    return HType.UNKNOWN;
+  }
+
+  HType computeDesiredTypeForInput(HInstruction instruction,
+                                   HInstruction input,
+                                   HTypeMap types,
+                                   Compiler compiler) {
+    if (input == instruction.inputs[0]) return HType.UNKNOWN;
+    // A division can never return an integer. So don't ask for integer inputs.
+    if (instruction.isInteger(types)) return HType.UNKNOWN;
+    return super.computeDesiredTypeForInput(
+        instruction, input, types, compiler);
+  }
+
+  HInstruction newBuiltinVariant(HInstruction left, HInstruction right) {
+    return new HDivide(left, right);
+  }
+}
+
+class ModuloSpecializer extends BinaryArithmeticSpecializer {
+  const ModuloSpecializer();
+
+  BinaryOperation operation(ConstantSystem constantSystem) {
+    return constantSystem.modulo;
+  }
+
+  HInstruction tryConvertToBuiltin(HInvokeDynamicMethod instruction,
+                                   HTypeMap types) {
+    // Modulo cannot be mapped to the native operator (different semantics).    
+    return null;
+  }
+
+  HInstruction newBuiltinVariant(HInstruction left, HInstruction right) {
+    throw 'Modulo has no builtin variant';
+  }
+}
+
+class MultiplySpecializer extends BinaryArithmeticSpecializer {
+  const MultiplySpecializer();
+
+  BinaryOperation operation(ConstantSystem constantSystem) {
+    return constantSystem.multiply;
+  }
+
+  HInstruction newBuiltinVariant(HInstruction left, HInstruction right) {
+    return new HMultiply(left, right);
+  }
+}
+
+class SubtractSpecializer extends BinaryArithmeticSpecializer {
+  const SubtractSpecializer();
+
+  BinaryOperation operation(ConstantSystem constantSystem) {
+    return constantSystem.subtract;
+  }
+
+  HInstruction newBuiltinVariant(HInstruction left, HInstruction right) {
+    return new HSubtract(left, right);
+  }
+}
+
+class TruncatingDivideSpecializer extends BinaryArithmeticSpecializer {
+  const TruncatingDivideSpecializer();
+
+  BinaryOperation operation(ConstantSystem constantSystem) {
+    return constantSystem.truncatingDivide;
+  }
+
+  HInstruction tryConvertToBuiltin(HInvokeDynamicMethod instruction,
+                                   HTypeMap types) {
+    // Truncating divide does not have a JS equivalent.    
+    return null;
+  }
+
+  HInstruction newBuiltinVariant(HInstruction left, HInstruction right) {
+    throw 'Truncating divide has no builtin variant';
+  }
+}
+
+abstract class BinaryBitOpSpecializer extends BinaryArithmeticSpecializer {
+  const BinaryBitOpSpecializer();
+
+  HType computeTypeFromInputTypes(HInvokeDynamicMethod instruction,
+                                  HTypeMap types,
+                                  Compiler compiler) {
+    // All bitwise operations on primitive types either produce an
+    // integer or throw an error.
+    HInstruction left = instruction.inputs[1];
+    if (left.isPrimitive(types)) return HType.INTEGER;
+    return HType.UNKNOWN;
+  }
+
+  HType computeDesiredTypeForInput(HInvokeDynamicMethod instruction,
+                                   HInstruction input,
+                                   HTypeMap types,
+                                   Compiler compiler) {
+    if (input == instruction.inputs[0]) return HType.UNKNOWN;
+    HType propagatedType = types[instruction];
+    // If the outgoing type should be a number we can get that only if both
+    // inputs are integers. If we don't know the outgoing type we try to make
+    // it an integer.
+    if (propagatedType.isUnknown() || propagatedType.isNumber()) {
+      return HType.INTEGER;
+    }
+    return HType.UNKNOWN;
+  }
+}
+
+class ShiftLeftSpecializer extends BinaryBitOpSpecializer {
+  const ShiftLeftSpecializer();
+
+  BinaryOperation operation(ConstantSystem constantSystem) {
+    return constantSystem.shiftLeft;
+  }
+
+  HInstruction tryConvertToBuiltin(HInvokeDynamicMethod instruction,
+                                   HTypeMap types) {
+    HInstruction left = instruction.inputs[1];
+    HInstruction right = instruction.inputs[2];
+    if (!left.isNumber(types) || !right.isConstantInteger()) return null;
+    HConstant rightConstant = right;
+    IntConstant intConstant = rightConstant.constant;
+    int count = intConstant.value;
+    if (count >= 0 && count <= 31) {
+      return newBuiltinVariant(left, right);
+    }
+    return null;
+  }
+
+  HInstruction newBuiltinVariant(HInstruction left, HInstruction right) {
+    return new HShiftLeft(left, right);
+  }
+}
+
+class ShiftRightSpecializer extends BinaryBitOpSpecializer {
+  const ShiftRightSpecializer();
+
+  HInstruction tryConvertToBuiltin(HInvokeDynamicMethod instruction,
+                                   HTypeMap types) {
+    // Shift right cannot be mapped to the native operator easily.    
+    return null;
+  }
+
+  HInstruction newBuiltinVariant(HInstruction left, HInstruction right) {
+    throw 'Shift right has no builtin variant';
+  }
+
+  BinaryOperation operation(ConstantSystem constantSystem) {
+    return constantSystem.shiftRight;
+  }
+}
+
+class BitOrSpecializer extends BinaryBitOpSpecializer {
+  const BitOrSpecializer();
+
+  BinaryOperation operation(ConstantSystem constantSystem) {
+    return constantSystem.bitOr;
+  }
+
+  HInstruction newBuiltinVariant(HInstruction left, HInstruction right) {
+    return new HBitOr(left, right);
+  }
+}
+
+class BitAndSpecializer extends BinaryBitOpSpecializer {
+  const BitAndSpecializer();
+
+  BinaryOperation operation(ConstantSystem constantSystem) {
+    return constantSystem.bitAnd;
+  }
+
+  HInstruction newBuiltinVariant(HInstruction left, HInstruction right) {
+    return new HBitAnd(left, right);
+  }
+}
+
+class BitXorSpecializer extends BinaryBitOpSpecializer {
+  const BitXorSpecializer();
+
+  BinaryOperation operation(ConstantSystem constantSystem) {
+    return constantSystem.bitXor;
+  }
+
+  HInstruction newBuiltinVariant(HInstruction left, HInstruction right) {
+    return new HBitXor(left, right);
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index e380d89..7d7e8f3 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -48,7 +48,6 @@
   R visitLocalSet(HLocalSet node);
   R visitLocalValue(HLocalValue node);
   R visitLoopBranch(HLoopBranch node);
-  R visitModulo(HModulo node);
   R visitMultiply(HMultiply node);
   R visitNegate(HNegate node);
   R visitNot(HNot node);
@@ -57,7 +56,6 @@
   R visitRangeConversion(HRangeConversion node);
   R visitReturn(HReturn node);
   R visitShiftLeft(HShiftLeft node);
-  R visitShiftRight(HShiftRight node);
   R visitStatic(HStatic node);
   R visitStaticStore(HStaticStore node);
   R visitStringConcat(HStringConcat node);
@@ -65,7 +63,6 @@
   R visitSwitch(HSwitch node);
   R visitThis(HThis node);
   R visitThrow(HThrow node);
-  R visitTruncatingDivide(HTruncatingDivide node);
   R visitTry(HTry node);
   R visitTypeGuard(HTypeGuard node);
   R visitTypeConversion(HTypeConversion node);
@@ -122,6 +119,7 @@
 class HGraph {
   HBasicBlock entry;
   HBasicBlock exit;
+  HThis thisInstruction;
   bool isRecursiveMethod = false;
   bool calledInLoop = false;
   final List<HBasicBlock> blocks;
@@ -258,14 +256,14 @@
   visitBinaryArithmetic(HBinaryArithmetic node) => visitInvokeBinary(node);
   visitBinaryBitOp(HBinaryBitOp node) => visitBinaryArithmetic(node);
   visitInvoke(HInvoke node) => visitInstruction(node);
-  visitInvokeBinary(HInvokeBinary node) => visitInvokeStatic(node);
+  visitInvokeBinary(HInvokeBinary node) => visitInstruction(node);
   visitInvokeDynamic(HInvokeDynamic node) => visitInvoke(node);
   visitInvokeDynamicField(HInvokeDynamicField node) => visitInvokeDynamic(node);
-  visitInvokeUnary(HInvokeUnary node) => visitInvokeStatic(node);
+  visitInvokeUnary(HInvokeUnary node) => visitInstruction(node);
   visitConditionalBranch(HConditionalBranch node) => visitControlFlow(node);
   visitControlFlow(HControlFlow node) => visitInstruction(node);
   visitFieldAccess(HFieldAccess node) => visitInstruction(node);
-  visitRelational(HRelational node) => visitInvokeBinary(node);
+  visitRelational(HRelational node) => visitInvokeStatic(node);
 
   visitAdd(HAdd node) => visitBinaryArithmetic(node);
   visitBailoutTarget(HBailoutTarget node) => visitInstruction(node);
@@ -293,7 +291,7 @@
   visitIdentity(HIdentity node) => visitRelational(node);
   visitIf(HIf node) => visitConditionalBranch(node);
   visitIndex(HIndex node) => visitInstruction(node);
-  visitIndexAssign(HIndexAssign node) => visitInvokeStatic(node);
+  visitIndexAssign(HIndexAssign node) => visitInstruction(node);
   visitIntegerCheck(HIntegerCheck node) => visitCheck(node);
   visitInterceptor(HInterceptor node) => visitInstruction(node);
   visitInvokeClosure(HInvokeClosure node)
@@ -315,7 +313,6 @@
   visitLocalSet(HLocalSet node) => visitFieldSet(node);
   visitLocalValue(HLocalValue node) => visitInstruction(node);
   visitLoopBranch(HLoopBranch node) => visitConditionalBranch(node);
-  visitModulo(HModulo node) => visitBinaryArithmetic(node);
   visitNegate(HNegate node) => visitInvokeUnary(node);
   visitNot(HNot node) => visitInstruction(node);
   visitPhi(HPhi node) => visitInstruction(node);
@@ -323,7 +320,6 @@
   visitParameterValue(HParameterValue node) => visitLocalValue(node);
   visitRangeConversion(HRangeConversion node) => visitCheck(node);
   visitReturn(HReturn node) => visitControlFlow(node);
-  visitShiftRight(HShiftRight node) => visitBinaryBitOp(node);
   visitShiftLeft(HShiftLeft node) => visitBinaryBitOp(node);
   visitSubtract(HSubtract node) => visitBinaryArithmetic(node);
   visitSwitch(HSwitch node) => visitControlFlow(node);
@@ -333,7 +329,6 @@
   visitThis(HThis node) => visitParameterValue(node);
   visitThrow(HThrow node) => visitControlFlow(node);
   visitTry(HTry node) => visitControlFlow(node);
-  visitTruncatingDivide(HTruncatingDivide node) => visitBinaryArithmetic(node);
   visitTypeGuard(HTypeGuard node) => visitCheck(node);
   visitIs(HIs node) => visitInstruction(node);
   visitTypeConversion(HTypeConversion node) => visitCheck(node);
@@ -777,12 +772,9 @@
   static const int INTERCEPTOR_TYPECODE = 4;
   static const int ADD_TYPECODE = 5;
   static const int DIVIDE_TYPECODE = 6;
-  static const int MODULO_TYPECODE = 7;
   static const int MULTIPLY_TYPECODE = 8;
   static const int SUBTRACT_TYPECODE = 9;
-  static const int TRUNCATING_DIVIDE_TYPECODE = 10;
   static const int SHIFT_LEFT_TYPECODE = 11;
-  static const int SHIFT_RIGHT_TYPECODE = 12;
   static const int BIT_OR_TYPECODE = 13;
   static const int BIT_AND_TYPECODE = 14;
   static const int BIT_XOR_TYPECODE = 15;
@@ -1175,14 +1167,14 @@
 
 class HBailoutTarget extends HInstruction {
   final int state;
-  bool isEnabled = false;
+  bool isEnabled = true;
   HBailoutTarget(this.state) : super(<HInstruction>[]);
   void prepareGvn(HTypeMap types) {
     assert(!hasSideEffects(types));
     setUseGvn();
   }
 
-  bool isControlFlow() => true;
+  bool isControlFlow() => isEnabled;
   bool isJsStatement(HTypeMap types) => isEnabled;
 
   accept(HVisitor visitor) => visitor.visitBailoutTarget(this);
@@ -1210,7 +1202,6 @@
   HType get guaranteedType => isEnabled ? guardedType : HType.UNKNOWN;
 
   bool isControlFlow() => true;
-
   bool isJsStatement(HTypeMap types) => isEnabled;
 
   accept(HVisitor visitor) => visitor.visitTypeGuard(this);
@@ -1316,40 +1307,39 @@
 
 class HInvokeClosure extends HInvokeDynamic {
   HInvokeClosure(Selector selector, List<HInstruction> inputs)
-    : super(selector, null, inputs);
+    : super(selector, null, inputs) {
+    assert(selector.isClosureCall());
+  }
   accept(HVisitor visitor) => visitor.visitInvokeClosure(this);
 }
 
 class HInvokeDynamicMethod extends HInvokeDynamic {
-  HInvokeDynamicMethod(Selector selector, List<HInstruction> inputs)
-    : super(selector, null, inputs);
+  final InvokeDynamicSpecializer specializer;
+  HInvokeDynamicMethod(Selector selector,
+                       List<HInstruction> inputs,
+                       [bool isIntercepted = false])
+    : super(selector, null, inputs),
+      specializer = isIntercepted
+          ? InvokeDynamicSpecializer.lookupSpecializer(selector)
+          : const InvokeDynamicSpecializer();
   String toString() => 'invoke dynamic method: $selector';
   accept(HVisitor visitor) => visitor.visitInvokeDynamicMethod(this);
 
   bool isIndexOperatorOnIndexablePrimitive(HTypeMap types) {
     return isInterceptorCall
         && selector.kind == SelectorKind.INDEX
+        && selector.name == const SourceString('[]')
         && inputs[1].isIndexablePrimitive(types);
   }
 
   HType computeDesiredTypeForInput(HInstruction input,
                                    HTypeMap types,
                                    Compiler compiler) {
-    // TODO(ngeoffray): Move this logic into a different class that
-    // will know what type it wants for a given selector.
-    if (selector.kind != SelectorKind.INDEX) return HType.UNKNOWN;
-    if (!isInterceptorCall) return HType.UNKNOWN;
+    return specializer.computeDesiredTypeForInput(this, input, types, compiler);
+  }
 
-    HInstruction index = inputs[2];
-    if (input == inputs[1] &&
-        (index.isTypeUnknown(types) || index.isNumber(types))) {
-      return HType.INDEXABLE_PRIMITIVE;
-    }
-    // The index should be an int when the receiver is a string or array.
-    // However it turns out that inserting an integer check in the optimized
-    // version is cheaper than having another bailout case. This is true,
-    // because the integer check will simply throw if it fails.
-    return HType.UNKNOWN;
+  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
+    return specializer.computeTypeFromInputTypes(this, types, compiler);
   }
 }
 
@@ -1555,80 +1545,35 @@
   accept(HVisitor visitor) => visitor.visitForeignNew(this);
 }
 
-abstract class HInvokeBinary extends HInvokeStatic {
-  HInvokeBinary(HStatic target, HInstruction left, HInstruction right)
-      : super(<HInstruction>[target, left, right]);
+abstract class HInvokeBinary extends HInstruction {
+  HInvokeBinary(HInstruction left, HInstruction right)
+      : super(<HInstruction>[left, right]);
 
-  HInstruction get left => inputs[1];
-  HInstruction get right => inputs[2];
+  HInstruction get left => inputs[0];
+  HInstruction get right => inputs[1];
 
   BinaryOperation operation(ConstantSystem constantSystem);
-  isBuiltin(HTypeMap types);
 }
 
 abstract class HBinaryArithmetic extends HInvokeBinary {
-  HBinaryArithmetic(HStatic target, HInstruction left, HInstruction right)
-      : super(target, left, right);
+  HBinaryArithmetic(HInstruction left, HInstruction right) : super(left, right);
 
   void prepareGvn(HTypeMap types) {
     clearAllSideEffects();
-    // An arithmetic expression can take part in global value
-    // numbering and do not have any side-effects if we know that all
-    // inputs are numbers.
-    if (isBuiltin(types)) {
-      setUseGvn();
-    } else {
-      setAllSideEffects();
-    }
+    setUseGvn();
   }
 
-  bool isBuiltin(HTypeMap types)
-      => left.isNumber(types) && right.isNumber(types);
-
   HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
     if (left.isInteger(types) && right.isInteger(types)) return HType.INTEGER;
-    if (left.isNumber(types)) {
-      if (left.isDouble(types) || right.isDouble(types)) return HType.DOUBLE;
-      return HType.NUMBER;
-    }
-    return HType.UNKNOWN;
-  }
-
-  HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types,
-                                            Compiler compiler) {
-    HType propagatedType = types[this];
-    // If the desired output type should be an integer we want to get two
-    // integers as arguments.
-    if (propagatedType.isInteger()) return HType.INTEGER;
-    // If the outgoing type should be a number we can get that if both inputs
-    // are numbers. If we don't know the outgoing type we try to make it a
-    // number.
-    if (propagatedType.isUnknown() || propagatedType.isNumber()) {
-      return HType.NUMBER;
-    }
-    // Even if the desired outgoing type is not a number we still want the
-    // second argument to be a number if the first one is a number. This will
-    // not help for the outgoing type, but at least the binary arithmetic
-    // operation will not have type problems.
-    // TODO(floitsch): normally we shouldn't request a number, but simply
-    // throw an ArgumentError if it isn't. This would be similar
-    // to the array case.
-    if (input == right && left.isNumber(types)) return HType.NUMBER;
-    return HType.UNKNOWN;
-  }
-
-  HType computeLikelyType(HTypeMap types, Compiler compiler) {
-    if (left.isTypeUnknown(types)) return HType.NUMBER;
-    return HType.UNKNOWN;
+    if (left.isDouble(types)) return HType.DOUBLE;
+    return HType.NUMBER;
   }
 
   BinaryOperation operation(ConstantSystem constantSystem);
 }
 
 class HAdd extends HBinaryArithmetic {
-  HAdd(HStatic target, HInstruction left, HInstruction right)
-      : super(target, left, right);
+  HAdd(HInstruction left, HInstruction right) : super(left, right);
   accept(HVisitor visitor) => visitor.visitAdd(this);
 
   BinaryOperation operation(ConstantSystem constantSystem)
@@ -1639,22 +1584,10 @@
 }
 
 class HDivide extends HBinaryArithmetic {
-  HDivide(HStatic target, HInstruction left, HInstruction right)
-      : super(target, left, right);
+  HDivide(HInstruction left, HInstruction right) : super(left, right);
   accept(HVisitor visitor) => visitor.visitDivide(this);
 
-  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
-    if (left.isNumber(types)) return HType.DOUBLE;
-    return HType.UNKNOWN;
-  }
-
-  HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types,
-                                            Compiler compiler) {
-    // A division can never return an integer. So don't ask for integer inputs.
-    if (isInteger(types)) return HType.UNKNOWN;
-    return super.computeDesiredTypeForNonTargetInput(input, types, compiler);
-  }
+  HType get guaranteedType => HType.DOUBLE;
 
   BinaryOperation operation(ConstantSystem constantSystem)
       => constantSystem.divide;
@@ -1663,21 +1596,8 @@
   bool dataEquals(HInstruction other) => true;
 }
 
-class HModulo extends HBinaryArithmetic {
-  HModulo(HStatic target, HInstruction left, HInstruction right)
-      : super(target, left, right);
-  accept(HVisitor visitor) => visitor.visitModulo(this);
-
-  BinaryOperation operation(ConstantSystem constantSystem)
-      => constantSystem.modulo;
-  int typeCode() => HInstruction.MODULO_TYPECODE;
-  bool typeEquals(other) => other is HModulo;
-  bool dataEquals(HInstruction other) => true;
-}
-
 class HMultiply extends HBinaryArithmetic {
-  HMultiply(HStatic target, HInstruction left, HInstruction right)
-      : super(target, left, right);
+  HMultiply(HInstruction left, HInstruction right) : super(left, right);
   accept(HVisitor visitor) => visitor.visitMultiply(this);
 
   BinaryOperation operation(ConstantSystem operations)
@@ -1688,8 +1608,7 @@
 }
 
 class HSubtract extends HBinaryArithmetic {
-  HSubtract(HStatic target, HInstruction left, HInstruction right)
-      : super(target, left, right);
+  HSubtract(HInstruction left, HInstruction right) : super(left, right);
   accept(HVisitor visitor) => visitor.visitSubtract(this);
 
   BinaryOperation operation(ConstantSystem constantSystem)
@@ -1722,66 +1641,17 @@
   String toString() => "HSwitch cases = $inputs";
 }
 
-class HTruncatingDivide extends HBinaryArithmetic {
-  HTruncatingDivide(HStatic target, HInstruction left, HInstruction right)
-      : super(target, left, right);
-  accept(HVisitor visitor) => visitor.visitTruncatingDivide(this);
-
-  BinaryOperation operation(ConstantSystem constantSystem)
-      => constantSystem.truncatingDivide;
-  int typeCode() => HInstruction.TRUNCATING_DIVIDE_TYPECODE;
-  bool typeEquals(other) => other is HTruncatingDivide;
-  bool dataEquals(HInstruction other) => true;
-}
-
-
 // TODO(floitsch): Should HBinaryArithmetic really be the super class of
 // HBinaryBitOp?
 abstract class HBinaryBitOp extends HBinaryArithmetic {
-  HBinaryBitOp(HStatic target, HInstruction left, HInstruction right)
-      : super(target, left, right);
-
-  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
-    // All bitwise operations on primitive types either produce an
-    // integer or throw an error.
-    if (left.isPrimitive(types)) return HType.INTEGER;
-    return HType.UNKNOWN;
-  }
-
-  HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types,
-                                            Compiler compiler) {
-    HType propagatedType = types[this];
-    // If the outgoing type should be a number we can get that only if both
-    // inputs are integers. If we don't know the outgoing type we try to make
-    // it an integer.
-    if (propagatedType.isUnknown() || propagatedType.isNumber()) {
-      return HType.INTEGER;
-    }
-    return HType.UNKNOWN;
-  }
-
-  HType computeLikelyType(HTypeMap types, Compiler compiler) {
-    if (left.isTypeUnknown(types)) return HType.INTEGER;
-    return HType.UNKNOWN;
-  }
+  HBinaryBitOp(HInstruction left, HInstruction right) : super(left, right);
+  HType get guaranteedType => HType.INTEGER;
 }
 
 class HShiftLeft extends HBinaryBitOp {
-  HShiftLeft(HStatic target, HInstruction left, HInstruction right)
-      : super(target, left, right);
+  HShiftLeft(HInstruction left, HInstruction right) : super(left, right);
   accept(HVisitor visitor) => visitor.visitShiftLeft(this);
 
-  // Shift left cannot be mapped to the native operator unless the
-  // shift count is guaranteed to be an integer in the [0,31] range.
-  bool isBuiltin(HTypeMap types) {
-    if (!left.isNumber(types) || !right.isConstantInteger()) return false;
-    HConstant rightConstant = right;
-    IntConstant intConstant = rightConstant.constant;
-    int count = intConstant.value;
-    return count >= 0 && count <= 31;
-  }
-
   BinaryOperation operation(ConstantSystem constantSystem)
       => constantSystem.shiftLeft;
   int typeCode() => HInstruction.SHIFT_LEFT_TYPECODE;
@@ -1789,24 +1659,8 @@
   bool dataEquals(HInstruction other) => true;
 }
 
-class HShiftRight extends HBinaryBitOp {
-  HShiftRight(HStatic target, HInstruction left, HInstruction right)
-      : super(target, left, right);
-  accept(HVisitor visitor) => visitor.visitShiftRight(this);
-
-  // Shift right cannot be mapped to the native operator easily.
-  bool isBuiltin(HTypeMap types) => false;
-
-  BinaryOperation operation(ConstantSystem constantSystem)
-      => constantSystem.shiftRight;
-  int typeCode() => HInstruction.SHIFT_RIGHT_TYPECODE;
-  bool typeEquals(other) => other is HShiftRight;
-  bool dataEquals(HInstruction other) => true;
-}
-
 class HBitOr extends HBinaryBitOp {
-  HBitOr(HStatic target, HInstruction left, HInstruction right)
-      : super(target, left, right);
+  HBitOr(HInstruction left, HInstruction right) : super(left, right);
   accept(HVisitor visitor) => visitor.visitBitOr(this);
 
   BinaryOperation operation(ConstantSystem constantSystem)
@@ -1817,8 +1671,7 @@
 }
 
 class HBitAnd extends HBinaryBitOp {
-  HBitAnd(HStatic target, HInstruction left, HInstruction right)
-      : super(target, left, right);
+  HBitAnd(HInstruction left, HInstruction right) : super(left, right);
   accept(HVisitor visitor) => visitor.visitBitAnd(this);
 
   BinaryOperation operation(ConstantSystem constantSystem)
@@ -1829,8 +1682,7 @@
 }
 
 class HBitXor extends HBinaryBitOp {
-  HBitXor(HStatic target, HInstruction left, HInstruction right)
-      : super(target, left, right);
+  HBitXor(HInstruction left, HInstruction right) : super(left, right);
   accept(HVisitor visitor) => visitor.visitBitXor(this);
 
   BinaryOperation operation(ConstantSystem constantSystem)
@@ -1840,53 +1692,27 @@
   bool dataEquals(HInstruction other) => true;
 }
 
-abstract class HInvokeUnary extends HInvokeStatic {
-  HInvokeUnary(HStatic target, HInstruction input)
-      : super(<HInstruction>[target, input]);
+abstract class HInvokeUnary extends HInstruction {
+  HInvokeUnary(HInstruction input) : super(<HInstruction>[input]);
 
-  HInstruction get operand => inputs[1];
+  HInstruction get operand => inputs[0];
 
   void prepareGvn(HTypeMap types) {
     clearAllSideEffects();
-    // A unary arithmetic expression can take part in global value
-    // numbering and does not have any side-effects if its input is a
-    // number.
-    if (isBuiltin(types)) {
-      setUseGvn();
-    } else {
-      setAllSideEffects();
-    }
+    setUseGvn();
   }
 
-  bool isBuiltin(HTypeMap types) => operand.isNumber(types);
-
-  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
-    HType operandType = types[operand];
-    if (operandType.isNumber()) return operandType;
-    return HType.UNKNOWN;
-  }
-
-  HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types,
-                                            Compiler compiler) {
-    HType propagatedType = types[this];
-    // If the outgoing type should be a number (integer, double or both) we
-    // want the outgoing type to be the input too.
-    // If we don't know the outgoing type we try to make it a number.
-    if (propagatedType.isNumber()) return propagatedType;
-    if (propagatedType.isUnknown()) return HType.NUMBER;
-    return HType.UNKNOWN;
-  }
-
-  HType computeLikelyType(HTypeMap types, Compiler compiler) => HType.NUMBER;
-
   UnaryOperation operation(ConstantSystem constantSystem);
 }
 
 class HNegate extends HInvokeUnary {
-  HNegate(HStatic target, HInstruction input) : super(target, input);
+  HNegate(HInstruction input) : super(input);
   accept(HVisitor visitor) => visitor.visitNegate(this);
 
+  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
+    return types[operand];
+  }
+
   UnaryOperation operation(ConstantSystem constantSystem)
       => constantSystem.negate;
   int typeCode() => HInstruction.NEGATE_TYPECODE;
@@ -1895,28 +1721,10 @@
 }
 
 class HBitNot extends HInvokeUnary {
-  HBitNot(HStatic target, HInstruction input) : super(target, input);
+  HBitNot(HInstruction input) : super(input);
   accept(HVisitor visitor) => visitor.visitBitNot(this);
-
-  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
-    // All bitwise operations on primitive types either produce an
-    // integer or throw an error.
-    if (operand.isPrimitive(types)) return HType.INTEGER;
-    return HType.UNKNOWN;
-  }
-
-  HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types,
-                                            Compiler compiler) {
-    HType propagatedType = types[this];
-    // Bit operations only work on integers. If there is no desired output
-    // type or if it as a number we want to get an integer as input.
-    if (propagatedType.isUnknown() || propagatedType.isNumber()) {
-      return HType.INTEGER;
-    }
-    return HType.UNKNOWN;
-  }
-
+  
+  HType get guaranteedType => HType.INTEGER;
   UnaryOperation operation(ConstantSystem constantSystem)
       => constantSystem.bitNot;
   int typeCode() => HInstruction.BIT_NOT_TYPECODE;
@@ -1959,7 +1767,7 @@
 }
 
 class HTry extends HControlFlow {
-  HParameterValue exception;
+  HLocalValue exception;
   HBasicBlock catchBlock;
   HBasicBlock finallyBlock;
   HTry() : super(const <HInstruction>[]);
@@ -2082,7 +1890,6 @@
   }
   toString() => 'local ${sourceElement.name}';
   accept(HVisitor visitor) => visitor.visitLocalValue(this);
-  bool isCodeMotionInvariant() => true;
 }
 
 class HParameterValue extends HLocalValue {
@@ -2098,6 +1905,7 @@
   }
   toString() => 'this';
   accept(HVisitor visitor) => visitor.visitThis(this);
+  bool isCodeMotionInvariant() => true;
 }
 
 class HPhi extends HInstruction {
@@ -2190,10 +1998,10 @@
   accept(HVisitor visitor) => visitor.visitPhi(this);
 }
 
-abstract class HRelational extends HInvokeBinary {
+abstract class HRelational extends HInvokeStatic {
   bool usesBoolifiedInterceptor = false;
   HRelational(HStatic target, HInstruction left, HInstruction right)
-      : super(target, left, right);
+      : super(<HInstruction>[target, left, right]);
 
   void prepareGvn(HTypeMap types) {
     clearAllSideEffects();
@@ -2221,7 +2029,7 @@
                                             HTypeMap types,
                                             Compiler compiler) {
     HType propagatedType = types[this];
-    // For all relational operations exept HEquals, we expect to get numbers
+    // For all relational operations except HEquals, we expect to get numbers
     // only. With numbers the outgoing type is a boolean. If something else
     // is desired, then numbers are incorrect, though.
     if (propagatedType.isUnknown() || propagatedType.isBoolean()) {
@@ -2236,6 +2044,11 @@
 
   bool isBuiltin(HTypeMap types)
       => left.isNumber(types) && right.isNumber(types);
+
+  HInstruction get left => inputs[1];
+  HInstruction get right => inputs[2];      
+
+  BinaryOperation operation(ConstantSystem constantSystem);
 }
 
 class HEquals extends HRelational {
@@ -2409,6 +2222,24 @@
     setUseGvn();
   }
 
+  HType computeDesiredTypeForInput(HInstruction input,
+                                   HTypeMap types,
+                                   Compiler compiler) {
+    if (interceptedClasses.length != 1) return HType.UNKNOWN;
+    // If the only class being intercepted is of type number, we
+    // make this interceptor call say it wants that class as input.
+    Element interceptor = interceptedClasses.toList()[0];
+    JavaScriptBackend backend = compiler.backend;
+    if (interceptor == backend.jsNumberClass) {
+      return HType.NUMBER;
+    } else if (interceptor == backend.jsIntClass) {
+      return HType.INTEGER;
+    } else if (interceptor == backend.jsDoubleClass) {
+      return HType.DOUBLE;
+    }
+    return HType.UNKNOWN;
+  }
+
   int typeCode() => HInstruction.INTERCEPTOR_TYPECODE;
   bool typeEquals(other) => other is HInterceptor;
   bool dataEquals(HInterceptor other) {
@@ -2485,48 +2316,22 @@
   bool dataEquals(HIndex other) => true;
 }
 
-class HIndexAssign extends HInvokeStatic {
-  HIndexAssign(HStatic target,
-               HInstruction receiver,
+class HIndexAssign extends HInstruction {
+  HIndexAssign(HInstruction receiver,
                HInstruction index,
                HInstruction value)
-      : super(<HInstruction>[target, receiver, index, value]);
-  toString() => 'index assign operator';
+      : super(<HInstruction>[receiver, index, value]);
+  String toString() => 'index assign operator';
   accept(HVisitor visitor) => visitor.visitIndexAssign(this);
 
-  HInstruction get receiver => inputs[1];
-  HInstruction get index => inputs[2];
-  HInstruction get value => inputs[3];
+  HInstruction get receiver => inputs[0];
+  HInstruction get index => inputs[1];
+  HInstruction get value => inputs[2];
 
   void prepareGvn(HTypeMap types) {
     clearAllSideEffects();
-    if (isBuiltin(types)) {
-      setChangesIndex();
-    } else {
-      setAllSideEffects();
-    }
+    setChangesIndex();
   }
-
-  // Note, that we don't have a computeTypeFromInputTypes, since [HIndexAssign]
-  // is never used as input.
-
-  HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types,
-                                            Compiler compiler) {
-    if (input == receiver &&
-        (index.isTypeUnknown(types) || index.isNumber(types))) {
-      return HType.MUTABLE_ARRAY;
-    }
-    // The index should be an int when the receiver is a string or array.
-    // However it turns out that inserting an integer check in the optimized
-    // version is cheaper than having another bailout case. This is true,
-    // because the integer check will simply throw if it fails.
-    return HType.UNKNOWN;
-  }
-
-  bool isBuiltin(HTypeMap types)
-      => receiver.isMutableArray(types) && index.isInteger(types);
-  bool isJsStatement(HTypeMap types) => !isBuiltin(types);
 }
 
 class HIs extends HInstruction {
@@ -2909,7 +2714,7 @@
 
 class HTryBlockInformation implements HStatementInformation {
   final HStatementInformation body;
-  final HParameterValue catchVariable;
+  final HLocalValue catchVariable;
   final HStatementInformation catchBlock;
   final HStatementInformation finallyBlock;
   HTryBlockInformation(this.body,
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index 0af7a42..769b3ef 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -97,7 +97,10 @@
       // In order to generate correct code for the bailout version, we did not
       // propagate types from the instruction to the type guard. We do it
       // now to be able to optimize further.
-      work.guards.forEach((HTypeGuard guard) { guard.isEnabled = true; });
+      work.guards.forEach((HTypeGuard guard) {
+        guard.bailoutTarget.isEnabled = false;
+        guard.isEnabled = true;
+      });
       // We also need to insert range and integer checks for the type
       // guards. Now that they claim to have a certain type, some
       // depending instructions might become builtin (like native array
@@ -197,14 +200,18 @@
   }
 
   HInstruction visitInvokeUnary(HInvokeUnary node) {
-    HInstruction operand = node.operand;
+    HInstruction folded =
+        foldUnary(node.operation(constantSystem), node.operand);
+    return folded != null ? folded : node;
+  }
+
+  HInstruction foldUnary(UnaryOperation operation, HInstruction operand) {
     if (operand is HConstant) {
-      UnaryOperation operation = node.operation(constantSystem);
       HConstant receiver = operand;
       Constant folded = operation.fold(receiver.constant);
       if (folded != null) return graph.addConstant(folded);
     }
-    return node;
+    return null;
   }
 
   HInstruction handleInterceptorCall(HInvokeDynamicMethod node) {
@@ -228,12 +235,21 @@
           node.selector, node.inputs.getRange(1, node.inputs.length - 1));
     }
 
-    Selector selector = node.selector;
-
-    if (node.isIndexOperatorOnIndexablePrimitive(types)) {
-      return new HIndex(node.inputs[1], node.inputs[2]);
+    // Try constant folding the instruction.
+    Operation operation = node.specializer.operation(constantSystem);
+    if (operation != null) {
+      HInstruction instruction = node.inputs.length == 2
+          ? foldUnary(operation, node.inputs[1])
+          : foldBinary(operation, node.inputs[1], node.inputs[2]);
+      if (instruction != null) return instruction;
     }
 
+    // Try converting the instruction to a builtin instruction.
+    HInstruction instruction =
+        node.specializer.tryConvertToBuiltin(node, types);
+    if (instruction != null) return instruction;
+
+    Selector selector = node.selector;
     SourceString selectorName = selector.name;
     Element target;
     if (input.isExtendableArray(types)) {
@@ -350,24 +366,24 @@
     return node;
   }
 
-  HInstruction visitIndexAssign(HIndexAssign node) {
-    if (!node.receiver.canBePrimitive(types)) {
-      Selector selector = new Selector.indexSet();
-      return fromPrimitiveInstructionToDynamicInvocation(node, selector);
-    }
-    return node;
-  }
-
-  HInstruction visitInvokeBinary(HInvokeBinary node) {
-    HInstruction left = node.left;
-    HInstruction right = node.right;
-    BinaryOperation operation = node.operation(constantSystem);
+  HInstruction foldBinary(BinaryOperation operation,
+                          HInstruction left,
+                          HInstruction right) {
     if (left is HConstant && right is HConstant) {
       HConstant op1 = left;
       HConstant op2 = right;
       Constant folded = operation.fold(op1.constant, op2.constant);
       if (folded != null) return graph.addConstant(folded);
     }
+    return null;
+  }
+
+  HInstruction visitInvokeBinary(HInvokeBinary node) {
+    HInstruction left = node.left;
+    HInstruction right = node.right;
+    BinaryOperation operation = node.operation(constantSystem);
+    HConstant folded = foldBinary(operation, left, right);
+    if (folded != null) return folded;
 
     if (!left.canBePrimitive(types)
         && operation.isUserDefinable()
@@ -416,7 +432,7 @@
     return super.visitRelational(node);
   }
 
-  HInstruction handleIdentityCheck(HInvokeBinary node) {
+  HInstruction handleIdentityCheck(HRelational node) {
     HInstruction left = node.left;
     HInstruction right = node.right;
     HType leftType = types[left];
@@ -753,6 +769,9 @@
     }
 
     if (constantInterceptor == null) return node;
+    if (constantInterceptor == work.element.getEnclosingClass()) {
+      return graph.thisInstruction;
+    }
 
     Constant constant = new ConstructedConstant(
         constantInterceptor.computeType(compiler), <Constant>[]);
@@ -832,7 +851,6 @@
     }
     index = insertBoundsCheck(node, node.receiver, index);
     node.changeUse(node.index, index);
-    assert(node.isBuiltin(types));
   }
 
   void visitInvokeDynamicMethod(HInvokeDynamicMethod node) {
@@ -1484,8 +1502,20 @@
 
   void visitInterceptor(HInterceptor interceptor) {
     HInstruction receiver = interceptor.receiver;
+    JavaScriptBackend backend = compiler.backend;
     for (var user in receiver.usedBy) {
       if (user is HInterceptor && interceptor.dominates(user)) {
+        Set<ClassElement> otherIntercepted = user.interceptedClasses;
+        // If the dominated interceptor intercepts the int class or
+        // the double class, we make sure these classes are also being
+        // intercepted by the dominating interceptor. Otherwise, the
+        // dominating interceptor could just intercept the number
+        // class and therefore not implement the methods in the int or
+        // double class.
+        if (otherIntercepted.contains(backend.jsIntClass)
+            || otherIntercepted.contains(backend.jsDoubleClass)) {
+          interceptor.interceptedClasses.addAll(user.interceptedClasses);
+        }
         user.interceptedClasses = interceptor.interceptedClasses;
       }
     }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart b/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart
index 0053023..1e57acb 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart
@@ -29,6 +29,7 @@
 part 'builder.dart';
 part 'codegen.dart';
 part 'codegen_helpers.dart';
+part 'invoke_dynamic_specializers.dart';
 part 'js_names.dart';
 part 'nodes.dart';
 part 'optimize.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart b/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
index 0b46840..adb9dd8 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
@@ -225,15 +225,24 @@
     return "Boolify: ${temporaryId(node.inputs[0])}";
   }
 
-  String visitAdd(HAdd node) => visitInvokeStatic(node);
+  String handleBinaryArithmetic(HBinaryArithmetic node, String op) {
+    String left = temporaryId(node.left);
+    String right= temporaryId(node.right);
+    return '$left $op $right';
+  }
 
-  String visitBitAnd(HBitAnd node) => visitInvokeStatic(node);
+  String visitAdd(HAdd node) => handleBinaryArithmetic(node, '+');
 
-  String visitBitNot(HBitNot node) => visitInvokeStatic(node);
+  String visitBitAnd(HBitAnd node) => handleBinaryArithmetic(node, '&');
 
-  String visitBitOr(HBitOr node) => visitInvokeStatic(node);
+  String visitBitNot(HBitNot node) {
+    String operand = temporaryId(node.operand);
+    return "~$operand";
+  }
 
-  String visitBitXor(HBitXor node) => visitInvokeStatic(node);
+  String visitBitOr(HBitOr node) => handleBinaryArithmetic(node, '|');
+
+  String visitBitXor(HBitXor node) => handleBinaryArithmetic(node, '^');
 
   String visitBoundsCheck(HBoundsCheck node) {
     String lengthId = temporaryId(node.length);
@@ -259,7 +268,7 @@
     return "Continue: (B${target.id})";
   }
 
-  String visitDivide(HDivide node) => visitInvokeStatic(node);
+  String visitDivide(HDivide node) => handleBinaryArithmetic(node, '/');
 
   String visitEquals(HEquals node) => visitInvokeStatic(node);
 
@@ -312,7 +321,12 @@
     return "Index: $receiver[$index]";
   }
 
-  String visitIndexAssign(HIndexAssign node) => visitInvokeStatic(node);
+  String visitIndexAssign(HIndexAssign node) {
+    String receiver = temporaryId(node.receiver);
+    String index = temporaryId(node.index);
+    String value = temporaryId(node.value);
+    return "IndexAssign: $receiver[$index] = $value";
+  }
 
   String visitIntegerCheck(HIntegerCheck node) {
     String value = temporaryId(node.value);
@@ -389,11 +403,12 @@
     return "While ($conditionId): (B${bodyBlock.id}) then (B${exitBlock.id})";
   }
 
-  String visitModulo(HModulo node) => visitInvokeStatic(node);
+  String visitMultiply(HMultiply node) => handleBinaryArithmetic(node, '*');
 
-  String visitMultiply(HMultiply node) => visitInvokeStatic(node);
-
-  String visitNegate(HNegate node) => visitInvokeStatic(node);
+  String visitNegate(HNegate node) {
+    String operand = temporaryId(node.operand);
+    return "-$operand";
+  }
 
   String visitNot(HNot node) => "Not: ${temporaryId(node.inputs[0])}";
 
@@ -418,9 +433,7 @@
 
   String visitReturn(HReturn node) => "Return ${temporaryId(node.inputs[0])}";
 
-  String visitShiftLeft(HShiftLeft node) => visitInvokeStatic(node);
-
-  String visitShiftRight(HShiftRight node) => visitInvokeStatic(node);
+  String visitShiftLeft(HShiftLeft node) => handleBinaryArithmetic(node, '<<');
 
   String visitStatic(HStatic node)
       => "Static ${node.element.name.slowToString()}";
@@ -439,7 +452,7 @@
     return "StringConcat: $leftId + $rightId";
   }
 
-  String visitSubtract(HSubtract node) => visitInvokeStatic(node);
+  String visitSubtract(HSubtract node) => handleBinaryArithmetic(node, '-');
 
   String visitSwitch(HSwitch node) {
     StringBuffer buf = new StringBuffer();
@@ -461,10 +474,6 @@
 
   String visitThrow(HThrow node) => "Throw ${temporaryId(node.inputs[0])}";
 
-  String visitTruncatingDivide(HTruncatingDivide node) {
-    return visitInvokeStatic(node);
-  }
-
   String visitExitTry(HExitTry node) {
     return "Exit try";
   }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
index 31d511a..ee0f1a1 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
@@ -41,13 +41,14 @@
   }
 
   void considerForArgumentTypeOptimization(HInstruction instruction) {
-    if (instruction is !HBinaryArithmetic) return;
     // Update the pending optimizations map based on the potentially
     // new types of the operands. If the operand types no longer allow
     // us to optimize, we remove the pending optimization.
-    HBinaryArithmetic arithmetic = instruction;
-    HInstruction left = arithmetic.left;
-    HInstruction right = arithmetic.right;
+    if (instruction is !HInvokeDynamicMethod) return;
+    HInvokeDynamicMethod invoke = instruction;
+    if (instruction.specializer is !BinaryArithmeticSpecializer) return;
+    HInstruction left = instruction.inputs[1];
+    HInstruction right = instruction.inputs[2];
     if (left.isNumber(types) && !right.isNumber(types)) {
       pendingOptimizations[instruction] = () {
         // This callback function is invoked after we're done
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart b/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
index 2aa36a9..b7ab115 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
@@ -392,22 +392,19 @@
     return swapTemp;
   }
 
-  VariableNames(Map<Element, String> parameterNames)
+  VariableNames()
     : ownName = new Map<HInstruction, String>(),
       copyHandlers = new Map<HBasicBlock, CopyHandler>(),
       allUsedNames = new Set<String>(),
-      swapTemp = computeFreshWithPrefix("t", parameterNames),
-      stateName = computeFreshWithPrefix("state", parameterNames);
+      swapTemp = computeFreshWithPrefix("t"),
+      stateName = computeFreshWithPrefix("state");
 
   int get numberOfVariables => allUsedNames.length;
 
   /** Returns a fresh variable with the given prefix. */
-  static String computeFreshWithPrefix(String prefix,
-                                       Map<Element, String> parameterNames) {
-    Set<String> parameters = new Set<String>.from(parameterNames.values);
+  static String computeFreshWithPrefix(String prefix) {
     String name = '${prefix}0';
     int i = 1;
-    while (parameters.contains(name)) name = '$prefix${i++}';
     return name;
   }
 
@@ -443,14 +440,12 @@
   final VariableNames names;
   final Compiler compiler;
   final Set<String> usedNames;
-  final Map<Element, String> parameterNames;
   final List<String> freeTemporaryNames;
   int temporaryIndex = 0;
   static final RegExp regexp = new RegExp('t[0-9]+');
 
   VariableNamer(LiveEnvironment environment,
                 this.names,
-                this.parameterNames,
                 this.compiler)
     : usedNames = new Set<String>(),
       freeTemporaryNames = new List<String>() {
@@ -516,13 +511,7 @@
       if (name != null) return addAllocatedName(instruction, name);
     }
 
-    if (instruction is HParameterValue
-        && instruction.sourceElement.enclosingElement.isNative()) {
-      // The dom/html libraries have inline JS code that reference	
-      // parameter names directly. Long-term such code will be rejected.
-      // Now, just don't mangle the parameter name.
-      name = instruction.sourceElement.name.slowToString();
-    } else if (instruction.sourceElement != null) {
+    if (instruction.sourceElement != null) {
       name = allocateWithHint(instruction.sourceElement.name.slowToString());
     } else {
       // We could not find an element for the instruction. If the
@@ -539,9 +528,6 @@
   }
 
   String addAllocatedName(HInstruction instruction, String name) {
-    if (instruction is HParameterValue) {
-      parameterNames[instruction.sourceElement] = name;
-    }
     usedNames.add(name);
     names.addNameUsed(name);
     names.ownName[instruction] = name;
@@ -584,17 +570,14 @@
   final Map<HBasicBlock, LiveEnvironment> liveInstructions;
   final Map<HInstruction, LiveInterval> liveIntervals;
   final Set<HInstruction> generateAtUseSite;
-  final Map<Element, String> parameterNames;
 
   final VariableNames names;
 
   SsaVariableAllocator(this.compiler,
                        this.liveInstructions,
                        this.liveIntervals,
-                       this.generateAtUseSite,
-                       parameterNames)
-    : this.names = new VariableNames(parameterNames),
-      this.parameterNames = parameterNames;
+                       this.generateAtUseSite)
+    : this.names = new VariableNames();
 
   void visitGraph(HGraph graph) {
     visitDominatorTree(graph);
@@ -602,7 +585,7 @@
 
   void visitBasicBlock(HBasicBlock block) {
     VariableNamer namer = new VariableNamer(
-        liveInstructions[block], names, parameterNames, compiler);
+        liveInstructions[block], names, compiler);
 
     block.forEachPhi((HPhi phi) {
       handlePhi(phi, namer);
@@ -618,11 +601,8 @@
    * have no users or that are generated at use site does not need a name.
    */
   bool needsName(HInstruction instruction) {
-    // TODO(ngeoffray): locals/parameters are being generated at use site,
-    // but we need a name for them. We should probably not make
-    // them generate at use site to make things simpler.
     if (instruction is HThis) return false;
-    if (instruction is HLocalValue) return true;
+    if (instruction is HParameterValue) return true;
     if (instruction.usedBy.isEmpty) return false;
     if (generateAtUseSite.contains(instruction)) return false;
     // A [HCheck] instruction that has control flow needs a name only if its
diff --git a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
index f317de4..2d49054 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
@@ -48,8 +48,10 @@
   R visitLiteralString(LiteralString node) => visitStringNode(node);
   R visitStringJuxtaposition(StringJuxtaposition node) => visitStringNode(node);
   R visitLoop(Loop node) => visitStatement(node);
+  R visitMixinApplication(MixinApplication node) => visitNode(node);
   R visitModifiers(Modifiers node) => visitNode(node);
   R visitNamedArgument(NamedArgument node) => visitExpression(node);
+  R visitNamedMixinApplication(NamedMixinApplication node) => visitNode(node);
   R visitNewExpression(NewExpression node) => visitExpression(node);
   R visitNodeList(NodeList node) => visitNode(node);
   R visitOperator(Operator node) => visitIdentifier(node);
@@ -144,7 +146,7 @@
   ContinueStatement asContinueStatement() => null;
   DoWhile asDoWhile() => null;
   EmptyStatement asEmptyStatement() => null;
-  Export AsExport() => null;
+  Export asExport() => null;
   Expression asExpression() => null;
   ExpressionStatement asExpressionStatement() => null;
   For asFor() => null;
@@ -153,10 +155,10 @@
   FunctionExpression asFunctionExpression() => null;
   Identifier asIdentifier() => null;
   If asIf() => null;
-  Import AsImport() => null;
+  Import asImport() => null;
   Label asLabel() => null;
   LabeledStatement asLabeledStatement() => null;
-  LibraryName AsLibraryName() => null;
+  LibraryName asLibraryName() => null;
   LiteralBool asLiteralBool() => null;
   LiteralDouble asLiteralDouble() => null;
   LiteralInt asLiteralInt() => null;
@@ -165,13 +167,14 @@
   LiteralMapEntry asLiteralMapEntry() => null;
   LiteralNull asLiteralNull() => null;
   LiteralString asLiteralString() => null;
+  MixinApplication asMixinApplication() => null;
   Modifiers asModifiers() => null;
   NamedArgument asNamedArgument() => null;
   NodeList asNodeList() => null;
   Operator asOperator() => null;
   ParenthesizedExpression asParenthesizedExpression() => null;
-  Part AsPart() => null;
-  PartOf AsPartOf() => null;
+  Part asPart() => null;
+  PartOf asPartOf() => null;
   Return asReturn() => null;
   ScriptTag asScriptTag() => null;
   Send asSend() => null;
@@ -198,7 +201,7 @@
 class ClassNode extends Node {
   final Modifiers modifiers;
   final Identifier name;
-  final TypeAnnotation superclass;
+  final Node superclass;
   final NodeList interfaces;
   final NodeList typeParameters;
   final NodeList body;
@@ -235,6 +238,54 @@
   Token getEndToken() => endToken;
 }
 
+class MixinApplication extends Node {
+  final Modifiers modifiers;
+  final TypeAnnotation superclass;
+  final NodeList mixins;
+
+  MixinApplication(this.modifiers, this.superclass, this.mixins);
+
+  MixinApplication asMixinApplication() => this;
+
+  accept(Visitor visitor) => visitor.visitMixinApplication(this);
+
+  visitChildren(Visitor visitor) {
+    if (modifiers != null) modifiers.accept(visitor);
+    if (superclass != null) superclass.accept(visitor);
+    if (mixins != null) mixins.accept(visitor);
+  }
+
+  Token getBeginToken() => superclass.getBeginToken();
+  Token getEndToken() => mixins.getEndToken();
+}
+
+// TODO(kasperl): Let this share some structure with the typedef for function
+// type aliases?
+class NamedMixinApplication extends Node {
+  final Identifier name;
+  final NodeList typeParameters;
+  final MixinApplication mixinApplication;
+
+  final Token typedefKeyword;
+  final Token endToken;
+
+  NamedMixinApplication(this.name, this.typeParameters, this.mixinApplication,
+                        this.typedefKeyword, this.endToken);
+
+  NamedMixinApplication asNamedMixinApplication() => this;
+
+  accept(Visitor visitor) => visitor.visitNamedMixinApplication(this);
+
+  visitChildren(Visitor visitor) {
+    name.accept(visitor);
+    if (typeParameters != null) typeParameters.accept(visitor);
+    mixinApplication.accept(visitor);
+  }
+
+  Token getBeginToken() => typedefKeyword;
+  Token getEndToken() => endToken;
+}
+
 abstract class Expression extends Node {
   Expression();
 
diff --git a/sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart b/sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart
index 683ab5a..129c637 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart
@@ -263,6 +263,10 @@
         {"value" : node.token.slowToString()});
   }
 
+  visitMixinApplication(MixinApplication node) {
+    visitNodeWithChildren(node, "MixinApplication");
+  }
+
   visitModifiers(Modifiers node) {
     visitNodeWithChildren(node, "Modifiers");
   }
@@ -271,6 +275,10 @@
     visitNodeWithChildren(node, "NamedArgument");
   }
 
+  visitNamedMixinApplication(NamedMixinApplication node) {
+    visitNodeWithChildren(node, "NamedMixinApplication");
+  }
+
   visitNewExpression(NewExpression node) {
     visitNodeWithChildren(node, "NewExpression");
   }
diff --git a/sdk/lib/_internal/compiler/implementation/tree/unparser.dart b/sdk/lib/_internal/compiler/implementation/tree/unparser.dart
index 69c5375..4a0e6e7 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/unparser.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/unparser.dart
@@ -81,6 +81,27 @@
     unparseClassWithBody(node, node.body.nodes);
   }
 
+  visitMixinApplication(MixinApplication node) {
+    if (!node.modifiers.nodes.isEmpty) {
+      visit(node.modifiers);
+      sb.add(' ');
+    }
+    visit(node.superclass);
+    sb.add(' with ');
+    visit(node.mixins);
+  }
+
+  visitNamedMixinApplication(NamedMixinApplication node) {
+    sb.add('typedef ');
+    visit(node.name);
+    if (node.typeParameters != null) {
+      visit(node.typeParameters);
+    }
+    sb.add(' = ');
+    visit(node.mixinApplication);
+    sb.add(';');
+  }
+
   visitConditional(Conditional node) {
     visit(node.condition);
     add(node.questionToken.value);
diff --git a/sdk/lib/_internal/compiler/implementation/typechecker.dart b/sdk/lib/_internal/compiler/implementation/typechecker.dart
index b89ce75..4c49b74 100644
--- a/sdk/lib/_internal/compiler/implementation/typechecker.dart
+++ b/sdk/lib/_internal/compiler/implementation/typechecker.dart
@@ -800,6 +800,14 @@
     fail(node);
   }
 
+  DartType visitMixinApplication(MixinApplication node) {
+    fail(node);
+  }
+
+  DartType visitNamedMixinApplication(NamedMixinApplication node) {
+    fail(node);
+  }
+
   DartType visitDoWhile(DoWhile node) {
     StatementType bodyType = analyze(node.body);
     checkCondition(node.condition);
diff --git a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
index eb5f364..fae1650 100644
--- a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
@@ -32,6 +32,7 @@
   final ClassElement element;
 
   ClassBaseType(this.element);
+
   bool operator ==(BaseType other) {
     if (identical(this, other)) return true;
     if (other is! ClassBaseType) return false;
@@ -194,14 +195,15 @@
 class ConcreteTypeCartesianProduct
     extends Iterable<ConcreteTypesEnvironment> {
   final ConcreteTypesInferrer inferrer;
-  final BaseType baseTypeOfThis;
+  final ClassElement typeOfThis;
   final Map<Element, ConcreteType> concreteTypes;
-  ConcreteTypeCartesianProduct(this.inferrer, this.baseTypeOfThis,
+  ConcreteTypeCartesianProduct(this.inferrer, this.typeOfThis,
                                this.concreteTypes);
   Iterator get iterator => concreteTypes.isEmpty
-      ? [new ConcreteTypesEnvironment(inferrer, baseTypeOfThis)].iterator
-      : new ConcreteTypeCartesianProductIterator(inferrer, baseTypeOfThis,
-                                                 concreteTypes);
+      ? [new ConcreteTypesEnvironment(inferrer, new ClassBaseType(typeOfThis))]
+            .iterator
+      : new ConcreteTypeCartesianProductIterator(inferrer,
+            new ClassBaseType(typeOfThis), concreteTypes);
   String toString() {
     List<ConcreteTypesEnvironment> cartesianProduct =
         new List<ConcreteTypesEnvironment>.from(this);
@@ -647,7 +649,7 @@
    * of [receiverType].
    */
   ConcreteType getSendReturnType(FunctionElement function,
-                                 BaseType receiverType,
+                                 ClassElement receiverType,
                                  ArgumentsTypes argumentsTypes) {
     ConcreteType result = emptyConcreteType;
     Map<Element, ConcreteType> argumentMap =
@@ -656,6 +658,7 @@
     if (argumentMap == null) {
       return emptyConcreteType;
     }
+
     argumentMap.forEach(augmentParameterType);
     ConcreteTypeCartesianProduct product =
         new ConcreteTypeCartesianProduct(this, receiverType, argumentMap);
@@ -675,62 +678,81 @@
                                                 ArgumentsTypes argumentsTypes) {
     final Map<Element, ConcreteType> result = new Map<Element, ConcreteType>();
     final FunctionSignature signature = function.computeSignature(compiler);
-    // too many arguments
+
+    // guard 1: too many arguments
     if (argumentsTypes.length > signature.parameterCount) {
       return null;
     }
-    // not enough arguments
+    // guard 2: not enough arguments
     if (argumentsTypes.positional.length < signature.requiredParameterCount) {
       return null;
     }
-    final HasNextIterator<ConcreteType> remainingPositionalArguments =
-        new HasNextIterator<ConcreteType>(argumentsTypes.positional.iterator);
+    // guard 3: too many positional arguments
+    if (signature.optionalParametersAreNamed &&
+        argumentsTypes.positional.length > signature.requiredParameterCount) {
+      return null;
+    }
+
+    handleLeftoverOptionalParameter(Element parameter) {
+      // TODO(polux): use default value whenever available
+      // TODO(polux): add a marker to indicate whether an argument was provided
+      //     in order to handle "?parameter" tests
+      result[parameter] = singletonConcreteType(const NullBaseType());
+    }
+
+    final Iterator<ConcreteType> remainingPositionalArguments =
+        argumentsTypes.positional.iterator;
     // we attach each positional parameter to its corresponding positional
     // argument
     for (Link<Element> requiredParameters = signature.requiredParameters;
-         !requiredParameters.isEmpty;
-         requiredParameters = requiredParameters.tail) {
+        !requiredParameters.isEmpty;
+        requiredParameters = requiredParameters.tail) {
       final Element requiredParameter = requiredParameters.head;
-      // we know next() is defined because of the guard above
-      result[requiredParameter] = remainingPositionalArguments.next();
+      // we know moveNext() succeeds because of guard 2
+      remainingPositionalArguments.moveNext();
+      result[requiredParameter] = remainingPositionalArguments.current;
     }
-    // we attach the remaining positional arguments to their corresponding
-    // named arguments
-    Link<Element> remainingNamedParameters = signature.optionalParameters;
-    while (remainingPositionalArguments.hasNext) {
-      final Element namedParameter = remainingNamedParameters.head;
-      result[namedParameter] = remainingPositionalArguments.next();
-      // we know tail is defined because of the guard above
-      remainingNamedParameters = remainingNamedParameters.tail;
+    if (signature.optionalParametersAreNamed) {
+      // we build a map out of the remaining named parameters
+      Link<Element> remainingOptionalParameters = signature.optionalParameters;
+      final Map<SourceString, Element> leftOverNamedParameters =
+          new Map<SourceString, Element>();
+      for (;
+           !remainingOptionalParameters.isEmpty;
+           remainingOptionalParameters = remainingOptionalParameters.tail) {
+        final Element namedParameter = remainingOptionalParameters.head;
+        leftOverNamedParameters[namedParameter.name] = namedParameter;
+      }
+      // we attach the named arguments to their corresponding optional
+      // parameters
+      for (Identifier identifier in argumentsTypes.named.keys) {
+        final ConcreteType concreteType = argumentsTypes.named[identifier];
+        SourceString source = identifier.source;
+        final Element namedParameter = leftOverNamedParameters[source];
+        // unexisting or already used named parameter
+        if (namedParameter == null) return null;
+        result[namedParameter] = concreteType;
+        leftOverNamedParameters.remove(source);
+      }
+      leftOverNamedParameters.forEach((_, Element parameter) {
+        handleLeftoverOptionalParameter(parameter);
+      });
+    } else { // optional parameters are positional
+      // we attach the remaining positional arguments to their corresponding
+      // optional parameters
+      Link<Element> remainingOptionalParameters = signature.optionalParameters;
+      while (remainingPositionalArguments.moveNext()) {
+        final Element optionalParameter = remainingOptionalParameters.head;
+        result[optionalParameter] = remainingPositionalArguments.current;
+        // we know tail is defined because of guard 1
+        remainingOptionalParameters = remainingOptionalParameters.tail;
+      }
+      for (;
+           !remainingOptionalParameters.isEmpty;
+           remainingOptionalParameters = remainingOptionalParameters.tail) {
+        handleLeftoverOptionalParameter(remainingOptionalParameters.head);
+      }
     }
-    // we build a map out of the remaining named parameters
-    final Map<SourceString, Element> leftOverNamedParameters =
-        new Map<SourceString, Element>();
-    for (;
-         !remainingNamedParameters.isEmpty;
-         remainingNamedParameters = remainingNamedParameters.tail) {
-      final Element namedParameter = remainingNamedParameters.head;
-      leftOverNamedParameters[namedParameter.name] = namedParameter;
-    }
-    // we attach the named arguments to their corresponding named paramaters
-    // (we don't use foreach because we want to be able to return early)
-    for (Identifier identifier in argumentsTypes.named.keys) {
-      final ConcreteType concreteType = argumentsTypes.named[identifier];
-      SourceString source = identifier.source;
-      final Element namedParameter = leftOverNamedParameters[source];
-      // unexisting or already used named parameter
-      if (namedParameter == null) return null;
-      result[namedParameter] = concreteType;
-      leftOverNamedParameters.remove(source);
-    };
-    // we use null for each unused named parameter
-    // TODO(polux): use default value whenever available
-    // TODO(polux): add a marker to indicate whether an argument was provided
-    //     in order to handle "?parameter" tests
-    leftOverNamedParameters.forEach((_, Element namedParameter) {
-      result[namedParameter] =
-          singletonConcreteType(const NullBaseType());
-    });
     return result;
   }
 
@@ -815,7 +837,7 @@
           new Selector.callDefaultConstructor(enclosingClass.getLibrary()));
         final superClassConcreteType = singletonConcreteType(
             new ClassBaseType(enclosingClass));
-        getSendReturnType(target, new ClassBaseType(enclosingClass),
+        getSendReturnType(target, enclosingClass,
             new ArgumentsTypes(new List(), new Map()));
       }
     }
@@ -1051,8 +1073,7 @@
       // exceptions for instance, we need to do it by uncommenting the following
       // line.
       // inferrer.addCaller(setter, currentMethod);
-      BaseType baseReceiverType = new ClassBaseType(receiver.enclosingElement);
-      inferrer.getSendReturnType(setter, baseReceiverType,
+      inferrer.getSendReturnType(setter, receiver.enclosingElement,
           new ArgumentsTypes([argumentType], new Map()));
     }
     return argumentType;
@@ -1062,7 +1083,7 @@
                               SourceString name) {
     ConcreteType receiverType = analyze(receiver);
 
-    void augmentField(BaseType baseReceiverType, Element member) {
+    void augmentField(ClassElement receiverType, Element member) {
       if (member.isField()) {
         inferrer.augmentFieldType(member, argumentType);
       } else if (member.isAbstractField()){
@@ -1074,7 +1095,7 @@
         // exceptions for instance, we need to do it by uncommenting the
         // following line.
         // inferrer.addCaller(setter, currentMethod);
-        inferrer.getSendReturnType(setter, baseReceiverType,
+        inferrer.getSendReturnType(setter, receiverType,
             new ArgumentsTypes([argumentType], new Map()));
       }
       // since this is a sendSet we ignore non-fields
@@ -1083,9 +1104,8 @@
     if (receiverType.isUnkown()) {
       for (Element member in inferrer.getMembersByName(name)) {
         if (!(member.isField() || member.isAbstractField())) continue;
-        Element classElem = member.getEnclosingClass();
-        BaseType baseReceiverType = new ClassBaseType(classElem);
-        augmentField(baseReceiverType, member);
+        Element cls = member.getEnclosingClass();
+        augmentField(cls, member);
       }
     } else {
       for (BaseType baseReceiverType in receiverType.baseTypes) {
@@ -1093,7 +1113,7 @@
         ClassBaseType baseReceiverClassType = baseReceiverType;
         Element member = baseReceiverClassType.element.lookupMember(name);
         if (member != null) {
-          augmentField(baseReceiverClassType, member);
+          augmentField(baseReceiverClassType.element, member);
         }
       }
     }
@@ -1197,8 +1217,8 @@
     Element constructor = elements[node.send];
     inferrer.addCaller(constructor, currentMethod);
     ClassElement cls = constructor.enclosingElement;
-    return inferrer.getSendReturnType(constructor,
-        new ClassBaseType(cls), analyzeArguments(node.send.arguments));
+    return inferrer.getSendReturnType(constructor, cls,
+                                      analyzeArguments(node.send.arguments));
   }
 
   ConcreteType visitLiteralList(LiteralList node) {
@@ -1366,11 +1386,11 @@
     return inferrer.getFieldType(field);
   }
 
-  ConcreteType analyzeGetterSend(BaseType baseReceiverType,
+  ConcreteType analyzeGetterSend(ClassElement receiverType,
                                  FunctionElement getter) {
       inferrer.addCaller(getter, currentMethod);
       return inferrer.getSendReturnType(getter,
-                                        baseReceiverType,
+                                        receiverType,
                                         new ArgumentsTypes([], new Map()));
   }
 
@@ -1388,9 +1408,8 @@
           return analyzeFieldRead(element);
         } else {
           assert(element.isGetter());
-          ClassBaseType baseReceiverType =
-              new ClassBaseType(element.enclosingElement);
-          return analyzeGetterSend(baseReceiverType, element);
+          ClassElement receiverType = element.enclosingElement;
+          return analyzeGetterSend(receiverType, element);
         }
       }
     } else {
@@ -1398,7 +1417,7 @@
       assert(node.receiver != null);
 
       ConcreteType result = inferrer.emptyConcreteType;
-      void augmentResult(BaseType baseReceiverType, Element member) {
+      void augmentResult(ClassElement baseReceiverType, Element member) {
         if (member.isField()) {
           result = inferrer.union(result, analyzeFieldRead(member));
         } else if (member.isAbstractField()){
@@ -1417,18 +1436,18 @@
             inferrer.getMembersByName(node.selector.asIdentifier().source);
         for (Element member in members) {
           if (!(member.isField() || member.isAbstractField())) continue;
-          Element classElement = member.getEnclosingClass();
-          ClassBaseType baseReceiverType = new ClassBaseType(classElement);
-          augmentResult(baseReceiverType, member);
+          Element cls = member.getEnclosingClass();
+          augmentResult(cls, member);
         }
       } else {
         for (BaseType baseReceiverType in receiverType.baseTypes) {
           if (!baseReceiverType.isNull()) {
             ClassBaseType classBaseType = baseReceiverType;
-            Element getterOrField = classBaseType.element
-                .lookupMember(node.selector.asIdentifier().source);
+            ClassElement cls = classBaseType.element;
+            Element getterOrField =
+                cls.lookupMember(node.selector.asIdentifier().source);
             if (getterOrField != null) {
-              augmentResult(baseReceiverType, getterOrField);
+              augmentResult(cls, getterOrField);
             }
           }
         }
@@ -1455,26 +1474,23 @@
         if (!element.isFunction()) continue;
         FunctionElement method = element;
         inferrer.addCaller(method, currentMethod);
-        Element classElem = method.enclosingElement;
-        ClassBaseType baseReceiverType = new ClassBaseType(classElem);
+        Element cls = method.enclosingElement;
         result = inferrer.union(
             result,
-            inferrer.getSendReturnType(method,baseReceiverType,
-                                       argumentsTypes));
+            inferrer.getSendReturnType(method, cls, argumentsTypes));
       }
 
     } else {
       for (BaseType baseReceiverType in receiverType.baseTypes) {
         if (!baseReceiverType.isNull()) {
           ClassBaseType classBaseReceiverType = baseReceiverType;
-          FunctionElement method = classBaseReceiverType.element.lookupMember(
-              canonicalizedMethodName);
+          ClassElement cls = classBaseReceiverType.element;
+          FunctionElement method = cls.lookupMember(canonicalizedMethodName);
           if (method != null) {
             inferrer.addCaller(method, currentMethod);
             result = inferrer.union(
                 result,
-                inferrer.getSendReturnType(method, baseReceiverType,
-                                           argumentsTypes));
+                inferrer.getSendReturnType(method, cls, argumentsTypes));
           }
         }
       }
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index 02a0b82..3619f47 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -215,6 +215,10 @@
   bool isGetter() => identical(kind, SelectorKind.GETTER);
   bool isSetter() => identical(kind, SelectorKind.SETTER);
   bool isCall() => identical(kind, SelectorKind.CALL);
+  bool isClosureCall() {
+    SourceString callName = Compiler.CALL_OPERATOR_NAME;
+    return isCall() && name == callName;
+  }
 
   bool isIndex() => identical(kind, SelectorKind.INDEX) && argumentCount == 1;
   bool isIndexSet() => identical(kind, SelectorKind.INDEX) && argumentCount == 2;
@@ -226,10 +230,6 @@
   /** Check whether this is a call to 'assert'. */
   bool isAssert() => isCall() && identical(name.stringValue, "assert");
 
-  /** Check whether this is a closure invocation call. */
-  bool isClosureCall() =>
-      isCall() && identical(name.stringValue, Compiler.CALL_OPERATOR_NAME);
-
   int get hashCode => argumentCount + 1000 * namedArguments.length;
   int get namedArgumentCount => namedArguments.length;
   int get positionalArgumentCount => argumentCount - namedArgumentCount;
diff --git a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
index 9b51ff4..9d906b7 100644
--- a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
+++ b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
@@ -34,7 +34,6 @@
 
 
 // TODO(rnystrom): Use "package:" URL (#4968).
-part 'src/dartdoc/comment_map.dart';
 part 'src/dartdoc/nav.dart';
 part 'src/dartdoc/utils.dart';
 
@@ -1836,20 +1835,7 @@
       if (filename.endsWith('appcache.manifest')) {
         return;
       }
-      // TODO(johnniwinther): If [outputDir] has trailing slashes, [filename]
-      // contains double (back)slashes for files in the immediate [toCache]
-      // directory. These are not handled by [relativeTo] thus
-      // wrongfully producing the path `/foo.html` for a file `foo.html` in
-      // [toCache].
-      //
-      // This can be handled in two ways. 1) By ensuring that
-      // [Directory.fromPath] does not receive a path with a trailing slash, or
-      // better, by making [Directory.fromPath] handle such trailing slashes.
-      // 2) By ensuring that [filePath] does not have double slashes before
-      // calling [relativeTo], or better, by making [relativeTo] handle double
-      // slashes correctly.
-      Path filePath = new Path(filename).canonicalize();
-      Path relativeFilePath = filePath.relativeTo(outputDir);
+      Path relativeFilePath = new Path(filename).relativeTo(outputDir);
       write("$relativeFilePath\n");
     };
     toCacheLister.onDone = (done) => endFile();
diff --git a/sdk/lib/_internal/dartdoc/lib/src/dartdoc/comment_map.dart b/sdk/lib/_internal/dartdoc/lib/src/dartdoc/comment_map.dart
deleted file mode 100644
index 7c8bd59..0000000
--- a/sdk/lib/_internal/dartdoc/lib/src/dartdoc/comment_map.dart
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dartdoc;
-
-/**
- * The cached lookup-table to associate doc comments with spans. The outer map
- * is from filenames to doc comments in that file. The inner map maps from the
- * token positions to doc comments. Each position is the starting offset of the
- * next non-comment token *following* the doc comment. For example, the position
- * for this comment would be the position of the "class" token below.
- */
-class CommentMap {
-  /**
-   * Maps from (filename, pos) to doc comment preceding the token at that
-   * position.
-   */
-  Map<String, Map<int, String>> _comments;
-
-  /** Doc comments before `library` directives. */
-  Map<String, String> _libraryComments;
-
-  CommentMap()
-    : _comments = <String, Map<int, String>>{},
-      _libraryComments = <String, String>{};
-
-  /**
-   * Finds the doc comment preceding the given source span, if there is one.
-   *
-   * If a comment is returned, it is guaranteed to be non-empty.
-   */
-  String find(SourceLocation span) {
-    if (span == null) return null;
-
-    _ensureFileParsed(span);
-    String comment = _comments[span.sourceUri.toString()][span.offset];
-    assert(comment == null || !comment.trim().isEmpty);
-    return comment;
-  }
-
-  /**
-   * Finds the doc comment associated with the `library` directive for the
-   * given file.
-   *
-   * If a comment is returned, it is guaranteed to be non-empty.
-   */
-  String findLibrary(SourceLocation source) {
-    _ensureFileParsed(source);
-    String comment = _libraryComments[source.sourceUri.toString()];
-    assert(comment == null || !comment.trim().isEmpty);
-    return comment;
-  }
-
-  _ensureFileParsed(SourceLocation source) {
-    _comments.putIfAbsent(source.sourceUri.toString(), () =>
-        _parseComments(source));
-  }
-
-  _parseComments(SourceLocation source) {
-    final comments = new Map<int, String>();
-
-    final scanner = new dart2js.StringScanner(source.sourceText,
-                                              includeComments: true);
-    var lastComment = null;
-
-    var token = scanner.tokenize();
-    while (token.kind != dart2js.EOF_TOKEN) {
-      if (token.kind == dart2js.COMMENT_TOKEN) {
-        final text = token.slowToString();
-        if (text.startsWith('/**')) {
-          // Remember that we've encountered a doc comment.
-          lastComment = stripComment(token.slowToString());
-        } else if (text.startsWith('///')) {
-          var line = text.substring(3);
-          // Allow a leading space.
-          if (line.startsWith(' ')) line = line.substring(1);
-          if (lastComment == null) {
-            lastComment = line;
-          } else {
-            lastComment = '$lastComment\n$line';
-          }
-        }
-      } else if (token.stringValue == 'library' && lastComment != null) {
-        // Look for `library` to find the library comment.
-        _libraryComments[source.sourceUri.toString()] = lastComment;
-        lastComment = null;
-      } else if (lastComment != null) {
-        if (!lastComment.trim().isEmpty) {
-          // We haven't attached the last doc comment to something yet, so stick
-          // it to this token.
-          comments[token.charOffset] = lastComment;
-        }
-        lastComment = null;
-      }
-      token = token.next;
-    }
-
-    return comments;
-  }
-
-  /**
-   * Pulls the raw text out of a doc comment (i.e. removes the comment
-   * characters).
-   */
-  stripComment(String comment) {
-    StringBuffer buf = new StringBuffer();
-
-    for (var line in comment.split('\n')) {
-      line = line.trim();
-      if (line.startsWith('/**')) line = line.substring(3);
-      if (line.endsWith('*/')) line = line.substring(0, line.length - 2);
-      line = line.trim();
-      if (line.startsWith('* ')) {
-        line = line.substring(2);
-      } else if (line.startsWith('*')) {
-        line = line.substring(1);
-      }
-
-      buf.add(line);
-      buf.add('\n');
-    }
-
-    return buf.toString();
-  }
-}
diff --git a/sdk/lib/_internal/dartdoc/test/comment_map_test.dart b/sdk/lib/_internal/dartdoc/test/comment_map_test.dart
deleted file mode 100644
index 3d6c4c9..0000000
--- a/sdk/lib/_internal/dartdoc/test/comment_map_test.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Unit tests for comment map.
-library commentMapTests;
-
-import 'dart:uri';
-import 'dart:mirrors';
-
-import '../../compiler/implementation/scanner/scannerlib.dart' as dart2js;
-
-// TODO(rnystrom): Better path to unittest.
-import '../../../../../pkg/unittest/lib/unittest.dart';
-
-// TODO(rnystrom): Use "package:" URL (#4968).
-part '../lib/src/dartdoc/comment_map.dart';
-
-class FakeSourceLocation implements SourceLocation {
-  Uri get sourceUri => new Uri('file:///tmp/test.dart');
-  int get offset => 69;
-  String get sourceText => """
-    /// Testing
-    ///     var testing = 'this is source code';
-    get foo => 'bar';
-  """;
-}
-
-main() {
-  test('triple slashed comments retain newlines', () {
-    Commentmap cm = new CommentMap();
-    var comment = cm.find(new FakeSourceLocation());
-    expect(
-      comment,
-      equals("Testing\n    var testing = 'this is source code';")
-    );
-  });
-}
diff --git a/sdk/lib/_internal/libraries.dart b/sdk/lib/_internal/libraries.dart
index 709bf8a..d5c747e 100644
--- a/sdk/lib/_internal/libraries.dart
+++ b/sdk/lib/_internal/libraries.dart
@@ -26,8 +26,17 @@
       "async/async.dart",
       dart2jsPatchPath: "_internal/compiler/implementation/lib/async_patch.dart"),
 
+  "chrome": const LibraryInfo(
+      "chrome/dartium/chrome_dartium.dart",
+      category: "Client",
+      dart2jsPath: "chrome/dart2js/chrome_dart2js.dart",
+      documented: false,
+      implementation: true), // Not really, just hiding it for now.
+
   "collection": const LibraryInfo("collection/collection.dart"),
 
+  "collection-dev": const LibraryInfo("collection_dev/collection_dev.dart"),
+
   "core": const LibraryInfo(
       "core/core.dart",
       dart2jsPatchPath: "_internal/compiler/implementation/lib/core_patch.dart"),
diff --git a/sdk/lib/async/async_error.dart b/sdk/lib/async/async_error.dart
index 065630d..fc46e32 100644
--- a/sdk/lib/async/async_error.dart
+++ b/sdk/lib/async/async_error.dart
@@ -9,7 +9,7 @@
  */
 class AsyncError {
   /** The actual error thrown by the computation. */
-  final Object error;
+  final error;
   /** Stack trace corresponding to the error, if available. */
   final Object stackTrace;
   /** Asynchronous error leading to this error, if error handling fails. */
@@ -17,8 +17,8 @@
 
   // TODO(lrn): When possible, combine into one constructor with both optional
   // positional and named arguments.
-  AsyncError(Object this.error, [Object this.stackTrace]): cause = null;
-  AsyncError.withCause(Object this.error, Object this.stackTrace, this.cause);
+  AsyncError(this.error, [this.stackTrace]): cause = null;
+  AsyncError.withCause(this.error, this.stackTrace, this.cause);
 
   void _writeOn(StringBuffer buffer) {
     buffer.add("'");
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index b92bfd4..6b332e6 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -30,12 +30,8 @@
     } else {
       asyncError = new AsyncError(error, stackTrace);
     }
-    // Never complete an error in the same cycle. Otherwise users might
-    // not have a chance to register their error-handlers.
-    new Timer(0, (_) {
-      _FutureImpl future = this.future;
-      future._setError(asyncError);
-    });
+    _FutureImpl future = this.future;
+    future._setError(asyncError);
   }
 }
 
@@ -69,13 +65,20 @@
   static const int _INCOMPLETE = 0;
   static const int _VALUE = 1;
   static const int _ERROR = 2;
+  static const int _UNHANDLED_ERROR = 4;
 
   /** Whether the future is complete, and as what. */
   int _state = _INCOMPLETE;
 
   bool get _isComplete => _state != _INCOMPLETE;
   bool get _hasValue => _state == _VALUE;
-  bool get _hasError => _state == _ERROR;
+  bool get _hasError => (_state & _ERROR) != 0;
+  bool get _hasUnhandledError => (_state & _UNHANDLED_ERROR) != 0;
+
+  void _clearUnhandledError() {
+    // Works because _UNHANDLED_ERROR is highest bit in use.
+    _state &= ~_UNHANDLED_ERROR;
+  }
 
   /**
    * Either the result, or a list of listeners until the future completes.
@@ -105,11 +108,11 @@
     } else {
       asyncError = new AsyncError(error, stackTrace);
     }
-    new Timer(0, (_) { _setError(asyncError); });
+    _setError(asyncError);
   }
 
   factory _FutureImpl.wait(Iterable<Future> futures) {
-    // TODO(ajohnsen): can we do better wrt the generic type T?
+    // TODO(ajohnsen): can we do better wrt. the generic type T?
     if (futures.isEmpty) {
       return new Future<List>.immediate(const []);
     }
@@ -175,20 +178,22 @@
     if (!_isComplete) {
       _addListener(whenFuture);
     } else if (_hasValue) {
+      T value = _resultOrListeners;
       new Timer(0, (_) {
-        T value = _resultOrListeners;
         whenFuture._sendValue(value);
       });
     } else {
       assert(_hasError);
+      _clearUnhandledError();
+      AsyncError error = _resultOrListeners;
       new Timer(0, (_) {
-        AsyncError error = _resultOrListeners;
         whenFuture._sendError(error);
       });
     }
     return whenFuture;
   }
 
+  /** Handle a late listener on a completed future with a value. */
   Future _handleValue(onValue(var value)) {
     assert(_hasValue);
     _ThenFuture thenFuture = new _ThenFuture(onValue);
@@ -197,8 +202,10 @@
     return thenFuture;
   }
 
+  /** Handle a late listener on a completed future with an error. */
   Future _handleError(onError(AsyncError error), bool test(error)) {
     assert(_hasError);
+    _clearUnhandledError();
     AsyncError error = _resultOrListeners;
     _CatchErrorFuture errorFuture = new _CatchErrorFuture(onError, test);
     new Timer(0, (_) { errorFuture._sendError(error); });
@@ -208,7 +215,7 @@
   Stream<T> asStream() => new Stream.fromFuture(this);
 
   void _setValue(T value) {
-    if (_state != _INCOMPLETE) throw new StateError("Future already completed");
+    if (_isComplete) throw new StateError("Future already completed");
     _FutureListener listeners = _removeListeners();
     _state = _VALUE;
     _resultOrListeners = value;
@@ -226,15 +233,33 @@
     _state = _ERROR;
     _resultOrListeners = error;
     if (listeners == null) {
-      error.throwDelayed();
+      _scheduleUnhandledError();
       return;
     }
-    while (listeners != null) {
+    do {
       _FutureListener listener = listeners;
       listeners = listener._nextListener;
       listener._nextListener = null;
       listener._sendError(error);
-    }
+    } while (listeners != null);
+  }
+
+  void _scheduleUnhandledError() {
+    _state |= _UNHANDLED_ERROR;
+    // Wait for the rest of the current event's duration to see
+    // if a subscriber is added to handle the error.
+    new Timer(0, (_) {
+      if (_hasUnhandledError) {
+        // No error handler has been added since the error was set.
+        _clearUnhandledError();
+        AsyncError error = _resultOrListeners;
+        print("Uncaught Error: ${error.error}");
+        if (stackTrace != null) {
+          print("Stack Trace:\n${error.stackTrace}\n");
+        }
+        throw error.error;
+      }
+    });
   }
 
   void _addListener(_FutureListener listener) {
@@ -453,7 +478,6 @@
       _setError(new AsyncError(e, s));
       return;
     }
-
     _setValue(value);
   }
 
@@ -469,8 +493,7 @@
         return;
       }
     } on AsyncError catch (e) {
-      _setError(e);
-      return;
+      error = e;
     } catch (e, s) {
       error = new AsyncError.withCause(e, s, error);
     }
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index 407a689..8fd9272 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -8,11 +8,56 @@
 // Core Stream types
 // -------------------------------------------------------------------
 
+/**
+ * A source of asynchronous data events.
+ *
+ * A Stream provides a sequence of events. Each event is either a data event or
+ * an error event, representing the result of a single computation. When the
+ * Stream is exhausted, it may send a single "done" event.
+ *
+ * You can [listen] on a stream to receive the events it sends. When you listen,
+ * you receive a [StreamSubscription] object that can be used to stop listening,
+ * or to temporarily pause events from the stream.
+ *
+ * When an event is fired, all listeners at that time are informed.
+ * If a listener is added or removed while an event is being fired, the change
+ * will only take effect after the event is completely fired.
+ *
+ * Streams always respect "pause" requests. If necessary they need to buffer
+ * their input, but often, and preferably, they can simply request their input
+ * to pause too.
+ *
+ * There are two kinds of streams: Single-subscription streams and
+ * multi-subscription streams.
+ *
+ * A single-subscription stream allows only a single listener in its entire
+ * life-cycle. It holds back events until it gets a listener, and it exhausts
+ * itself when the listener is unsubscribed, even if the stream wasn't done.
+ *
+ * Single-subscription streams are generally used for streaming parts of
+ * contiguous data like file I/O.
+ *
+ * A multi-subscription stream allows any number of listeners, and it fires
+ * its events when they are ready, whether there are listeners or not.
+ *
+ * Multi-subscription streams are used for independent events/observers.
+ *
+ * The default implementation of [isSingleSubscription] and
+ * [asMultiSubscriptionStream] are assuming this is a single-subscription stream
+ * and a multi-subscription stream inheriting from [Stream] must override these
+ * to return [:false:] and [:this:] respectively.
+ */
 abstract class Stream<T> {
   Stream();
 
+  /**
+   * Creates a new single-subscription stream from the future.
+   *
+   * When the future completes, the stream will fire one event, either
+   * data or error, and then close with a done-event.
+   */
   factory Stream.fromFuture(Future<T> future) {
-    _StreamImpl<T> stream = new _MultiStreamImpl<T>();
+    _StreamImpl<T> stream = new _SingleStreamImpl<T>();
     future.then((value) {
         stream._add(value);
         stream._close();
@@ -28,11 +73,14 @@
    * Creates a single-subscription stream that gets its data from [data].
    */
   factory Stream.fromIterable(Iterable<T> data) {
-    return new _IterableSingleStreamImpl<T>(data);
+    _PendingEvents iterableEvents = new _IterablePendingEvents<T>(data);
+    return new _GeneratedSingleStreamImpl<T>(iterableEvents);
   }
 
-  /** Whether the stream is a single-subscription stream. */
-  bool get isSingleSubscription;
+  /**
+   * Whether the stream is a single-subscription stream.
+   */
+  bool get isSingleSubscription => true;
 
   /**
    * Returns a multi-subscription stream that produces the same events as this.
@@ -44,7 +92,9 @@
    *
    * If this stream is already multi-subscriber, it is returned unmodified.
    */
-  Stream<T> asMultiSubscriberStream();
+  Stream<T> asMultiSubscriberStream() {
+    return new _SingleStreamMultiplexer<T>(this);
+  }
 
   /**
    * Stream that outputs events from the [sources] in cyclic order.
@@ -99,7 +149,7 @@
    * but it only sends the data events that satisfy the [test].
    */
   Stream<T> where(bool test(T event)) {
-    return this.transform(new WhereTransformer<T>(test));
+    return new WhereStream<T>(this, test);
   }
 
   /**
@@ -107,7 +157,7 @@
    * to a new value using the [convert] function.
    */
   Stream mappedBy(convert(T event)) {
-    return this.transform(new MapTransformer<T, dynamic>(convert));
+    return new MapStream<T, dynamic>(this, convert);
   }
 
   /**
@@ -125,7 +175,7 @@
    */
    // TODO(lrn): Say what to do if you want to convert the error to a value.
   Stream<T> handleError(void handle(AsyncError error), { bool test(error) }) {
-    return this.transform(new HandleErrorTransformer<T>(handle, test));
+    return new HandleErrorStream<T>(this, handle, test);
   }
 
   /**
@@ -137,8 +187,7 @@
    * in order.
    */
   Stream expand(Iterable convert(T value)) {
-    return this.transform(
-        new ExpandTransformer<T, dynamic>(convert));
+    return new ExpandStream<T, dynamic>(this, convert);
   }
 
   /**
@@ -343,10 +392,10 @@
   }
 
   /**
-   * Finds the least element in the stream.
+   * Finds the largest element in the stream.
    *
    * If the stream is empty, the result is [:null:].
-   * Otherwise the result is an value from the stream that is not greater
+   * Otherwise the result is an value from the stream that is not smaller
    * than any other value from the stream (according to [compare], which must
    * be a [Comparator]).
    *
@@ -440,7 +489,7 @@
    * so will the returned stream.
    */
   Stream<T> take(int count) {
-    return this.transform(new TakeTransformer<T>(count));
+    return new TakeStream(this, count);
   }
 
   /**
@@ -452,14 +501,14 @@
    * a value that [test] doesn't accept.
    */
   Stream<T> takeWhile(bool test(T value)) {
-    return this.transform(new TakeWhileTransformer<T>(test));
+    return new TakeWhileStream(this, test);
   }
 
   /**
    * Skips the first [count] data events from this stream.
    */
   Stream<T> skip(int count) {
-    return this.transform(new SkipTransformer<T>(count));
+    return new SkipStream(this, count);
   }
 
   /**
@@ -471,7 +520,7 @@
    * event data, the returned stream will have the same events as this stream.
    */
   Stream<T> skipWhile(bool test(T value)) {
-    return this.transform(new SkipWhileTransformer<T>(test));
+    return new SkipWhileStream(this, test);
   }
 
   /**
@@ -484,7 +533,7 @@
    * omitted, the '==' operator on the last provided data element is used.
    */
   Stream<T> distinct([bool equals(T previous, T next)]) {
-    return this.transform(new DistinctTransformer<T>(equals));
+    return new DistinctStream(this, equals);
   }
 
   /**
@@ -733,7 +782,7 @@
 /**
  * A control object for the subscription on a [Stream].
  *
- * When you subscribe on a [Stream] using [Stream.subscribe],
+ * When you subscribe on a [Stream] using [Stream.listen],
  * a [StreamSubscription] object is returned. This object
  * is used to later unsubscribe again, or to temporarily pause
  * the stream's events.
@@ -760,7 +809,9 @@
    * Request that the stream pauses events until further notice.
    *
    * If [resumeSignal] is provided, the stream will undo the pause
-   * when the future completes in any way.
+   * when the future completes. If the future completes with an error,
+   * it will not be handled!
+   *
    * A call to [resume] will also undo a pause.
    *
    * If the subscription is paused more than once, an equal number
@@ -840,7 +891,7 @@
    * If a parameter is omitted, a default handler is used that forwards the
    * event directly to the sink.
    *
-   * Pauses on the are forwarded to the input stream as well.
+   * Pauses on the returned stream are forwarded to the input stream as well.
    */
   factory StreamTransformer.from({
       void onData(S data, StreamSink<T> sink),
diff --git a/sdk/lib/async/stream_controller.dart b/sdk/lib/async/stream_controller.dart
index cf49a17..98a45783 100644
--- a/sdk/lib/async/stream_controller.dart
+++ b/sdk/lib/async/stream_controller.dart
@@ -16,24 +16,10 @@
  * its [stream].
  * This class can be used to create a simple stream that others
  * can listen on, and to push events to that stream.
- * For more specialized streams, the [createStream] method can be
- * overridden to return a specialization of [ControllerStream], and
- * other public methods can be overridden too (but it's recommended
- * that the overriding method calls its super method).
  *
- * A [StreamController] may have zero or more subscribers.
- *
- * If it has subscribers, it may also be paused by any number of its
- * subscribers. When paused, all incoming events are queued. It is the
- * responsibility of the user of this stream to prevent incoming events when
- * the controller is paused. When there are no pausing subscriptions left,
- * either due to them resuming, or due to the pausing subscriptions
- * unsubscribing, events are resumed.
- *
- * When "close" is invoked (but not necessarily when the done event is fired,
- * depending on pause state) the stream controller is closed.
- * When the done event is fired to a subscriber, the subscriber is automatically
- * unsubscribed.
+ * It's possible to check whether the stream is paused or not, and whether
+ * it has subscribers or not, as well as getting a callback when either of
+ * these change.
  */
 class StreamController<T> extends Stream<T> implements StreamSink<T> {
   _StreamImpl<T> _stream;
@@ -42,7 +28,7 @@
   /**
    * A controller with a [stream] that supports multiple subscribers.
    */
-  StreamController() {
+  StreamController.multiSubscription() {
     _stream = new _MultiControllerStream<T>(onSubscriptionStateChange,
                                             onPauseStateChange);
   }
@@ -51,13 +37,15 @@
    * The controller will buffer all incoming events until the subscriber is
    * registered.
    */
-  StreamController.singleSubscription() {
+  StreamController() {
     _stream = new _SingleControllerStream<T>(onSubscriptionStateChange,
                                              onPauseStateChange);
   }
 
   bool get isSingleSubscription => _stream.isSingleSubscription;
 
+  Stream<T> asMultiSubscriptionStream() => _stream.asMultiSubscriptionStream();
+
   StreamSubscription listen(void onData(T data),
                             { void onError(AsyncError error),
                               void onDone(),
@@ -87,10 +75,10 @@
   /**
    * Send or enqueue an error event.
    *
-   * If [error] is not an [AsyncError], [exception] and an optional [stackTrace]
+   * If [error] is not an [AsyncError], [error] and an optional [stackTrace]
    * is combined into an [AsyncError] and sent this stream's listeners.
    *
-   * Itherwise, if [error] is an [AsyncError], it is used directly as the
+   * Otherwise, if [error] is an [AsyncError], it is used directly as the
    * error object reported to listeners, and the [stackTrace] is ignored.
    *
    * If a subscription has requested to be unsubscribed on errors,
diff --git a/sdk/lib/async/stream_impl.dart b/sdk/lib/async/stream_impl.dart
index fe66c2e..0ca98e1 100644
--- a/sdk/lib/async/stream_impl.dart
+++ b/sdk/lib/async/stream_impl.dart
@@ -9,7 +9,7 @@
 /// Initial and default state where the stream can receive and send events.
 const int _STREAM_OPEN = 0;
 /// The stream has received a request to complete, but hasn't done so yet.
-/// No further events can be aded to the stream.
+/// No further events can be added to the stream.
 const int _STREAM_CLOSED = 1;
 /// The stream has completed and will no longer receive or send events.
 /// Also counts as closed. The stream must not be paused when it's completed.
@@ -57,7 +57,7 @@
    * stored here.
    * Also supports scheduling the events for later execution.
    */
-  _StreamImplEvents _pendingEvents;
+  _PendingEvents _pendingEvents;
 
   // ------------------------------------------------------------------
   // Stream interface.
@@ -204,6 +204,8 @@
 
   void _startFiring() {
     assert(!_isFiring);
+    assert(_hasSubscribers);
+    assert(!_isPaused);
     // This sets the _STREAM_FIRING bit and toggles the _STREAM_EVENT_ID
     // bit. All current subscribers will now have a _LISTENER_EVENT_ID
     // that doesn't match _STREAM_EVENT_ID, and they will receive the
@@ -214,6 +216,8 @@
   void _endFiring() {
     assert(_isFiring);
     _state ^= _STREAM_FIRING;
+    if (_isPaused) _onPauseStateChange();
+    if (!_hasSubscribers) _onSubscriptionStateChange();
   }
 
   /**
@@ -236,7 +240,7 @@
     if (resumeSignal != null) {
       resumeSignal.whenComplete(() { this._resume(listener, true); });
     }
-    if (!wasPaused) {
+    if (!wasPaused && !_isFiring) {
       _onPauseStateChange();
     }
   }
@@ -248,18 +252,24 @@
     assert(_isPaused);
     _decrementPauseCount(listener);
     if (!_isPaused) {
-      _onPauseStateChange();
+      if (!_isFiring) _onPauseStateChange();
       if (_hasPendingEvent) {
         // If we can fire events now, fire any pending events right away.
         if (fromEvent && !_isFiring) {
           _handlePendingEvents();
         } else {
-          _pendingEvents.schedule(this);
+          _schedulePendingEvents();
         }
       }
     }
   }
 
+  /** Schedule pending events to be executed. */
+  void _schedulePendingEvents() {
+    assert(_hasPendingEvent);
+    _pendingEvents.schedule(this);
+  }
+
   /** Create a subscription object. Called by [subcribe]. */
   _StreamSubscriptionImpl<T> _createSubscription(
       void onData(T data),
@@ -316,15 +326,16 @@
   /** Add a pending event at the end of the pending event queue. */
   void _addPendingEvent(_DelayedEvent event) {
     if (_pendingEvents == null) _pendingEvents = new _StreamImplEvents();
-    _pendingEvents.add(event);
+    _StreamImplEvents events = _pendingEvents;
+    events.add(event);
   }
 
   /** Fire any pending events until the pending event queue. */
   void _handlePendingEvents() {
-    _StreamImplEvents events = _pendingEvents;
+    _PendingEvents events = _pendingEvents;
     if (events == null) return;
     while (!events.isEmpty && !_isPaused) {
-      events.removeFirst().perform(this);
+      events.handleNext(this);
     }
   }
 
@@ -383,7 +394,6 @@
       }
     });
     assert(!_hasSubscribers);
-    _onSubscriptionStateChange();
   }
 }
 
@@ -420,14 +430,8 @@
 class _SingleStreamImpl<T> extends _StreamImpl<T> {
   _StreamListener _subscriber = null;
 
-  Stream<T> asMultiSubscriberStream() {
-    return new _SingleStreamMultiplexer<T>(this);
-  }
-
-  bool get isSingleSubscription => true;
-
   /** Whether one or more active subscribers have requested a pause. */
-  bool get _isPaused => !_hasSubscribers || super._isPaused;
+  bool get _isPaused => (!_hasSubscribers && !_isComplete) || super._isPaused;
 
   /** Whether there is currently a subscriber on this [Stream]. */
   bool get _hasSubscribers => _subscriber != null;
@@ -455,9 +459,7 @@
     subscription._setSubscribed(0);
     _onSubscriptionStateChange();
     if (_hasPendingEvent) {
-      new Timer(0, (_) {
-        _handlePendingEvents();
-      });
+      _schedulePendingEvents();
     }
   }
 
@@ -479,16 +481,20 @@
       return;
     }
     _subscriber = null;
-    int timesPaused = subscriber._setUnsubscribed();
-    _updatePauseCount(-timesPaused);
-    if (timesPaused > 0) {
-      _onPauseStateChange();
+    // Unsubscribing a paused subscription also cancels its pauses.
+    int subscriptionPauseCount = subscriber._setUnsubscribed();
+    _updatePauseCount(-subscriptionPauseCount);
+    if (!_isFiring) {
+      if (subscriptionPauseCount > 0) {
+        _onPauseStateChange();
+      }
+      _onSubscriptionStateChange();
     }
-    _onSubscriptionStateChange();
   }
 
   void _forEachSubscriber(
       void action(_StreamListener<T> subscription)) {
+    assert(!_isPaused);
     _StreamListener subscription = _subscriber;
     assert(subscription != null);
     _startFiring();
@@ -538,10 +544,10 @@
     _nextLink = _previousLink = this;
   }
 
-  Stream<T> asMultiSubscriberStream() => this;
-
   bool get isSingleSubscription => false;
 
+  Stream<T> asMultiSubscriberStream() => this;
+
   // ------------------------------------------------------------------
   // Helper functions that can be overridden in subclasses.
 
@@ -594,8 +600,6 @@
       }
     }
     _endFiring();
-    if (_isPaused) _onPauseStateChange();
-    if (!_hasSubscribers) _onSubscriptionStateChange();
   }
 
   void _addListener(_StreamListener listener) {
@@ -654,53 +658,62 @@
 }
 
 
-/** Abstract superclass for streams that generate their own events. */
-abstract class _GeneratedSingleStreamImpl<T> extends _SingleStreamImpl<T> {
-  bool _isHandlingPendingEvents = false;
-  bool get _hasPendingEvent => !_isClosed;
-
+/** Stream that generates its own events. */
+class _GeneratedSingleStreamImpl<T> extends _SingleStreamImpl<T> {
   /**
-   * Generate one (or possibly more) new events.
+   * Initializes the stream to have only the events provided by [events].
    *
-   * The events should be added to the stream using [_add], [_signalError] and
-   * [_close].
+   * A [_PendingEvents] implementation provides events that are handled
+   * by calling [_PendingEvents.handleNext] with the [_StreamImpl].
    */
-  void _generateNextEvent();
+  _GeneratedSingleStreamImpl(_PendingEvents events) {
+    _pendingEvents = events;
+    _setClosed();  // Closed for input since all events are already pending.
+  }
 
-  void _handlePendingEvents() {
-    // Avoid reentry from _add/_signalError/_close potentially called
-    // from _generateNextEvent.
-    if (_isHandlingPendingEvents) return;
-    _isHandlingPendingEvents = true;
-    while (!_isPaused && !_isClosed) {
-      // Call super's handle event in case _generateNextEvent generates
-      // more than one event, and the following ones are delayed.
-      super._handlePendingEvents();
-      if (!_isPaused && !_isClosed) {
-        _generateNextEvent();
-      }
-    }
-    _isHandlingPendingEvents = false;
+  void _add(T value) {
+    throw new UnsupportedError("Cannot inject events into generated stream");
+  }
+
+  void _signalError(AsyncError value) {
+    throw new UnsupportedError("Cannot inject events into generated stream");
+  }
+
+  void _close() {
+    throw new UnsupportedError("Cannot inject events into generated stream");
   }
 }
 
 
-/** Stream that gets its events from an [Iterable]. */
-class _IterableSingleStreamImpl<T> extends _GeneratedSingleStreamImpl<T> {
-  Iterator<T> _iterator;
+/** Pending events object that gets its events from an [Iterable]. */
+class _IterablePendingEvents<T> extends _PendingEvents {
+  final Iterator<T> _iterator;
+  /**
+   * Whether there are no more events to be sent.
+   *
+   * This starts out as [:false:] since there is always at least
+   * a 'done' event to be sent.
+   */
+  bool _isDone = false;
 
-  _IterableSingleStreamImpl(Iterable<T> data) : _iterator = data.iterator;
+  _IterablePendingEvents(Iterable<T> data) : _iterator = data.iterator;
 
-  void _generateNextEvent() {
+  bool get isEmpty => _isDone;
+
+  void handleNext(_StreamImpl<T> stream) {
+    if (_isDone) throw new StateError("No events pending.");
     try {
-      if (_iterator.moveNext()) {
-        _add(_iterator.current);
-        return;
+      _isDone = !_iterator.moveNext();
+      if (!_isDone) {
+        stream._sendData(_iterator.current);
+      } else {
+        stream._sendDone();
       }
     } catch (e, s) {
-      _signalError(new AsyncError(e, s));
+      stream._sendError(new AsyncError(e, s));
+      stream._sendDone();
+      _isDone = true;
     }
-    _close();
   }
 }
 
@@ -918,7 +931,15 @@
   }
 }
 
-abstract class _StreamListener<T> extends _InternalLink {
+/** Abstract type for an internal interface for sending events. */
+abstract class _StreamOutputSink<T> {
+  _sendData(T data);
+  _sendError(AsyncError error);
+  _sendDone();
+}
+
+abstract class _StreamListener<T> extends _InternalLink
+                                  implements _StreamOutputSink<T> {
   final _StreamImpl _source;
   int _state = _LISTENER_UNSUBSCRIBED;
 
@@ -988,12 +1009,8 @@
   _sendDone();
 }
 
-/** Class holding pending events for a [_StreamImpl]. */
-class _StreamImplEvents {
-  /// Single linked list of [_DelayedEvent] objects.
-  _DelayedEvent firstPendingEvent = null;
-  /// Last element in the list of pending events. New events are added after it.
-  _DelayedEvent lastPendingEvent = null;
+/** Superclass for provider of pending events. */
+abstract class _PendingEvents {
   /**
    * Timer set when pending events are scheduled for execution.
    *
@@ -1003,7 +1020,7 @@
    */
   Timer scheduleTimer = null;
 
-  bool get isEmpty => lastPendingEvent == null;
+  bool get isEmpty;
 
   bool get isScheduled => scheduleTimer != null;
 
@@ -1021,6 +1038,21 @@
     scheduleTimer = null;
   }
 
+  void handleNext(_StreamImpl stream);
+}
+
+
+/** Class holding pending events for a [_StreamImpl]. */
+class _StreamImplEvents extends _PendingEvents {
+  /// Single linked list of [_DelayedEvent] objects.
+  _DelayedEvent firstPendingEvent = null;
+  /// Last element in the list of pending events. New events are added after it.
+  _DelayedEvent lastPendingEvent = null;
+
+  bool get isEmpty => lastPendingEvent == null;
+
+  bool get isScheduled => scheduleTimer != null;
+
   void add(_DelayedEvent event) {
     if (lastPendingEvent == null) {
       firstPendingEvent = lastPendingEvent = event;
@@ -1029,14 +1061,14 @@
     }
   }
 
-  _DelayedEvent removeFirst() {
+  void handleNext(_StreamImpl stream) {
     if (isScheduled) cancelSchedule();
     _DelayedEvent event = firstPendingEvent;
     firstPendingEvent = event.next;
     if (firstPendingEvent == null) {
       lastPendingEvent = null;
     }
-    return event;
+    event.perform(stream);
   }
 }
 
diff --git a/sdk/lib/async/stream_pipe.dart b/sdk/lib/async/stream_pipe.dart
index 0b4b6ab..d145d1f 100644
--- a/sdk/lib/async/stream_pipe.dart
+++ b/sdk/lib/async/stream_pipe.dart
@@ -38,136 +38,178 @@
 
 
 /**
- * A [StreamTransformer] that forwards events and subscriptions.
+ * A [Stream] that forwards subscriptions to another stream.
  *
- * By default this transformer subscribes to [_source] and forwards all events
- * to [_stream]. It does not subscribe to [_source] until there is a subscriber,
- * on [_stream] and unsubscribes again when there are no subscribers left.
- *
- * The events are passed through the [_handleData], [_handleError] and
- * [_handleDone] methods. Subclasses are supposed to add handling of some of
- * the events by overriding these methods.
+ * This stream implements [Stream], but forwards all subscriptions
+ * to an underlying stream, and wraps the returned subscription to
+ * modify the events on the way.
  *
  * This class is intended for internal use only.
  */
+abstract class _ForwardingStream<S, T> extends Stream<T> {
+  final Stream<S> _source;
+
+  _ForwardingStream(this._source);
+
+  bool get isSingleSubscription => _source.isSingleSubscription;
+
+  StreamSubscription listen(void onData(T value),
+                            { void onError(AsyncError error),
+                              void onDone(),
+                              bool unsubscribeOnError }) {
+    if (onData == null) onData = _nullDataHandler;
+    if (onError == null) onError = _nullErrorHandler;
+    if (onDone == null) onDone = _nullDoneHandler;
+    unsubscribeOnError = identical(true, unsubscribeOnError);
+    StreamSubscription subscription =
+        new _ForwardingStreamSubscription<S, T>(
+            this, onData, onError, onDone, unsubscribeOnError);
+    return subscription;
+  }
+
+  // Override the following methods in subclasses to change the behavior.
+
+  void _handleData(S data, _StreamOutputSink<T> sink) {
+    var outputData = data;
+    sink._sendData(outputData);
+  }
+
+  void _handleError(AsyncError error, _StreamOutputSink<T> sink) {
+    sink._sendError(error);
+  }
+
+  void _handleDone(_StreamOutputSink<T> sink) {
+    sink._sendDone();
+  }
+}
+
 /**
- *
- * Handles backwards propagation of subscription and pause.
+ * Abstract superclass for subscriptions that forward to other subscriptions.
  */
-class _ForwardingStreamTransformer<S, T> implements StreamTransformer<S, T> {
-  Stream<T> _stream;
-  Stream<S> _source;
+class _ForwardingStreamSubscription<S, T>
+    implements StreamSubscription<T>, _StreamOutputSink<T> {
+  final _ForwardingStream<S, T> _stream;
+  // TODO(ahe): Restore type when feature is implemented in dart2js
+  // checked mode. http://dartbug.com/7733
+  var /* _DataHandler<T> */ _onData;
+  _ErrorHandler _onError;
+  _DoneHandler _onDone;
+
   StreamSubscription<S> _subscription;
 
-  Stream<T> _createOutputStream() {
-    if (_source.isSingleSubscription) {
-      return new _ForwardingSingleStream<T>(this);
-    }
-    return new _ForwardingMultiStream<T>(this);
+  _ForwardingStreamSubscription(this._stream,
+                                this._onData,
+                                this._onError,
+                                this._onDone,
+                                bool unsubscribeOnError) {
+    _subscription =
+        _stream._source.listen(_handleData,
+                               onError: _handleError,
+                               onDone: _handleDone,
+                               unsubscribeOnError: unsubscribeOnError);
   }
 
-  Stream<T> bind(Stream<S> source) {
-    if (_source != null) {
-      throw new StateError("Transformer source already bound");
+  // StreamSubscription interface.
+
+  void onData(void handleData(T event)) {
+    if (handleData == null) {
+      handleData = _StreamSubscriptionImpl._nullDataHandler;
     }
-    _source = source;
-    _stream = _createOutputStream();
-    return _stream;
+    _onData = handleData;
   }
 
-  void _onPauseStateChange(bool isPaused) {
-    if (isPaused) {
-      if (_subscription != null) {
-        _subscription.pause();
-      }
-    } else {
-      if (_subscription != null) {
-        _subscription.resume();
-      }
+  void onError(void handleError(AsyncError error)) {
+    if (handleError == null) {
+      handleError = _StreamSubscriptionImpl._nullErrorHandler;
     }
+    _onError = handleError;
   }
 
-  /**
-    * Subscribe or unsubscribe on [_source] depending on whether
-    * [_stream] has subscribers.
-    */
-  void _onSubscriptionStateChange(bool hasSubscribers) {
-    if (hasSubscribers) {
-      assert(_subscription == null);
-      _subscription = _source.listen(this._handleData,
-                                     onError: this._handleError,
-                                     onDone: this._handleDone);
-    } else {
-      // TODO(lrn): Check why this can happen.
-      if (_subscription == null) return;
+  void onDone(void handleDone()) {
+    if (handleDone == null) {
+      handleDone = _StreamSubscriptionImpl._nullDoneHandler;
+    }
+    _onDone = handleDone;
+  }
+
+  void pause([Future resumeSignal]) {
+    if (_subscription == null) {
+      throw new StateError("Subscription has been unsubscribed");
+    }
+    _subscription.pause(resumeSignal);
+  }
+
+  void resume() {
+    if (_subscription == null) {
+      throw new StateError("Subscription has been unsubscribed");
+    }
+    _subscription.resume();
+  }
+
+  void cancel() {
+    if (_subscription == null) {
+      throw new StateError("Subscription has been unsubscribed");
+    }
+    _subscription.cancel();
+    _subscription = null;
+  }
+
+  // _StreamOutputSink interface. Sends data to this subscription.
+
+  void _sendData(T data) {
+    _onData(data);
+  }
+
+  void _sendError(AsyncError error) {
+    _onError(error);
+  }
+
+  void _sendDone() {
+    // If the transformation sends a done signal, we stop the subscription.
+    if (_subscription != null) {
       _subscription.cancel();
       _subscription = null;
     }
+    _onDone();
   }
 
-  void _handleData(S inputEvent) {
-    var outputEvent = inputEvent;
-    _stream._add(outputEvent);
+  // Methods used as listener on source subscription.
+
+  void _handleData(S data) {
+    _stream._handleData(data, this);
   }
 
   void _handleError(AsyncError error) {
-    _stream._signalError(error);
+    _stream._handleError(error, this);
   }
 
   void _handleDone() {
-    _stream._close();
+    _stream._handleDone(this);
   }
 }
 
-class _ForwardingMultiStream<T> extends _MultiStreamImpl<T> {
-  _ForwardingStreamTransformer _transformer;
-  _ForwardingMultiStream(this._transformer);
-
-  _onSubscriptionStateChange() {
-    _transformer._onSubscriptionStateChange(_hasSubscribers);
-  }
-
-  _onPauseStateChange() {
-    _transformer._onPauseStateChange(_isPaused);
-  }
-}
-
-class _ForwardingSingleStream<T> extends _SingleStreamImpl<T> {
-  _ForwardingStreamTransformer _transformer;
-  _ForwardingSingleStream(this._transformer);
-
-  _onSubscriptionStateChange() {
-    _transformer._onSubscriptionStateChange(_hasSubscribers);
-  }
-
-  _onPauseStateChange() {
-    _transformer._onPauseStateChange(_isPaused);
-  }
-}
-
-
 // -------------------------------------------------------------------
 // Stream transformers used by the default Stream implementation.
 // -------------------------------------------------------------------
 
 typedef bool _Predicate<T>(T value);
 
-class WhereTransformer<T> extends _ForwardingStreamTransformer<T, T> {
+class WhereStream<T> extends _ForwardingStream<T, T> {
   final _Predicate<T> _test;
 
-  WhereTransformer(bool test(T value))
-      : this._test = test;
+  WhereStream(Stream<T> source, bool test(T value))
+      : _test = test, super(source);
 
-  void _handleData(T inputEvent) {
+  void _handleData(T inputEvent, _StreamOutputSink<T> sink) {
     bool satisfies;
     try {
       satisfies = _test(inputEvent);
     } catch (e, s) {
-      _stream._signalError(_asyncError(e, s));
+      sink._sendError(_asyncError(e, s));
       return;
     }
     if (satisfies) {
-      _stream._add(inputEvent);
+      sink._sendData(inputEvent);
     }
   }
 }
@@ -178,42 +220,42 @@
 /**
  * A stream pipe that converts data events before passing them on.
  */
-class MapTransformer<S, T> extends _ForwardingStreamTransformer<S, T> {
+class MapStream<S, T> extends _ForwardingStream<S, T> {
   final _Transformation _transform;
 
-  MapTransformer(T transform(S event))
-      : this._transform = transform;
+  MapStream(Stream<S> source, T transform(S event))
+      : this._transform = transform, super(source);
 
-  void _handleData(S inputEvent) {
+  void _handleData(S inputEvent, _StreamOutputSink<T> sink) {
     T outputEvent;
     try {
       outputEvent = _transform(inputEvent);
     } catch (e, s) {
-      _stream._signalError(_asyncError(e, s));
+      sink._sendError(_asyncError(e, s));
       return;
     }
-    _stream._add(outputEvent);
+    sink._sendData(outputEvent);
   }
 }
 
 /**
  * A stream pipe that converts data events before passing them on.
  */
-class ExpandTransformer<S, T> extends _ForwardingStreamTransformer<S, T> {
+class ExpandStream<S, T> extends _ForwardingStream<S, T> {
   final _Transformation<S, Iterable<T>> _expand;
 
-  ExpandTransformer(Iterable<T> expand(S event))
-      : this._expand = expand;
+  ExpandStream(Stream<S> source, Iterable<T> expand(S event))
+      : this._expand = expand, super(source);
 
-  void _handleData(S inputEvent) {
+  void _handleData(S inputEvent, _StreamOutputSink<T> sink) {
     try {
       for (T value in _expand(inputEvent)) {
-        _stream._add(value);
+        sink._sendData(value);
       }
     } catch (e, s) {
       // If either _expand or iterating the generated iterator throws,
       // we abort the iteration.
-      _stream._signalError(_asyncError(e, s));
+      sink._sendError(_asyncError(e, s));
     }
   }
 }
@@ -226,20 +268,22 @@
  * A stream pipe that converts or disposes error events
  * before passing them on.
  */
-class HandleErrorTransformer<T> extends _ForwardingStreamTransformer<T, T> {
+class HandleErrorStream<T> extends _ForwardingStream<T, T> {
   final _ErrorTransformation _transform;
   final _ErrorTest _test;
 
-  HandleErrorTransformer(void transform(AsyncError event), bool test(error))
-      : this._transform = transform, this._test = test;
+  HandleErrorStream(Stream<T> source,
+                    void transform(AsyncError event),
+                    bool test(error))
+      : this._transform = transform, this._test = test, super(source);
 
-  void _handleError(AsyncError error) {
+  void _handleError(AsyncError error, _StreamOutputSink<T> sink) {
     bool matches = true;
     if (_test != null) {
       try {
         matches = _test(error.error);
       } catch (e, s) {
-        _stream._signalError(_asyncError(e, s, error));
+        sink._sendError(_asyncError(e, s, error));
         return;
       }
     }
@@ -247,11 +291,141 @@
       try {
         _transform(error);
       } catch (e, s) {
-        _stream._signalError(_asyncError(e, s, error));
+        sink._sendError(_asyncError(e, s, error));
         return;
       }
     } else {
-      _stream._signalError(error);
+      sink._sendError(error);
+    }
+  }
+}
+
+
+class TakeStream<T> extends _ForwardingStream<T, T> {
+  int _remaining;
+
+  TakeStream(Stream<T> source, int count)
+      : this._remaining = count, super(source) {
+    // This test is done early to avoid handling an async error
+    // in the _handleData method.
+    if (count is! int) throw new ArgumentError(count);
+  }
+
+  void _handleData(T inputEvent, _StreamOutputSink<T> sink) {
+    if (_remaining > 0) {
+      sink._sendData(inputEvent);
+      _remaining -= 1;
+      if (_remaining == 0) {
+        // Closing also unsubscribes all subscribers, which unsubscribes
+        // this from source.
+        sink._sendDone();
+      }
+    }
+  }
+}
+
+
+class TakeWhileStream<T> extends _ForwardingStream<T, T> {
+  final _Predicate<T> _test;
+
+  TakeWhileStream(Stream<T> source, bool test(T value))
+      : this._test = test, super(source);
+
+  void _handleData(T inputEvent, _StreamOutputSink<T> sink) {
+    bool satisfies;
+    try {
+      satisfies = _test(inputEvent);
+    } catch (e, s) {
+      sink._sendError(_asyncError(e, s));
+      // The test didn't say true. Didn't say false either, but we stop anyway.
+      sink._sendDone();
+      return;
+    }
+    if (satisfies) {
+      sink._sendData(inputEvent);
+    } else {
+      sink._sendDone();
+    }
+  }
+}
+
+class SkipStream<T> extends _ForwardingStream<T, T> {
+  int _remaining;
+
+  SkipStream(Stream<T> source, int count)
+      : this._remaining = count, super(source) {
+    // This test is done early to avoid handling an async error
+    // in the _handleData method.
+    if (count is! int || count < 0) throw new ArgumentError(count);
+  }
+
+  void _handleData(T inputEvent, _StreamOutputSink<T> sink) {
+    if (_remaining > 0) {
+      _remaining--;
+      return;
+    }
+    return sink._sendData(inputEvent);
+  }
+}
+
+class SkipWhileStream<T> extends _ForwardingStream<T, T> {
+  final _Predicate<T> _test;
+  bool _hasFailed = false;
+
+  SkipWhileStream(Stream<T> source, bool test(T value))
+      : this._test = test, super(source);
+
+  void _handleData(T inputEvent, _StreamOutputSink<T> sink) {
+    if (_hasFailed) {
+      sink._sendData(inputEvent);
+    }
+    bool satisfies;
+    try {
+      satisfies = _test(inputEvent);
+    } catch (e, s) {
+      sink._sendError(_asyncError(e, s));
+      // A failure to return a boolean is considered "not matching".
+      _hasFailed = true;
+      return;
+    }
+    if (!satisfies) {
+      _hasFailed = true;
+      sink._sendData(inputEvent);
+    }
+  }
+}
+
+typedef bool _Equality<T>(T a, T b);
+
+class DistinctStream<T> extends _ForwardingStream<T, T> {
+  static var _SENTINEL = new Object();
+
+  _Equality<T> _equals;
+  var _previous = _SENTINEL;
+
+  DistinctStream(Stream<T> source, bool equals(T a, T b))
+      : _equals = equals, super(source);
+
+  void _handleData(T inputEvent, _StreamOutputSink<T> sink) {
+    if (identical(_previous, _SENTINEL)) {
+      _previous = inputEvent;
+      return sink._sendData(inputEvent);
+    } else {
+      bool isEqual;
+      try {
+        if (_equals == null) {
+          isEqual = (_previous == inputEvent);
+        } else {
+          isEqual = _equals(_previous, inputEvent);
+        }
+      } catch (e, s) {
+        sink._sendError(_asyncError(e, s));
+        return null;
+      }
+      if (!isEqual) {
+        sink._sendData(inputEvent);
+        _previous = inputEvent;
+      }
     }
   }
 }
@@ -262,7 +436,7 @@
 typedef void _TransformDoneHandler<T>(StreamSink<T> sink);
 
 /**
- * A stream transfomer that intercepts all events and can generate any event as
+ * A stream transformer that intercepts all events and can generate any event as
  * output.
  *
  * Each incoming event on the source stream is passed to the corresponding
@@ -270,7 +444,7 @@
  * Stream.
  * The handler can then decide exactly which events to send to the output.
  */
-class _StreamTransformerImpl<S, T> extends _ForwardingStreamTransformer<S, T> {
+class _StreamTransformerImpl<S, T> implements StreamTransformer<S, T> {
   final _TransformDataHandler<S, T> _onData;
   final _TransformErrorHandler<T> _onError;
   final _TransformDoneHandler<T> _onDone;
@@ -284,9 +458,10 @@
         this._onDone = (onDone == null ? _defaultHandleDone : onDone);
 
   Stream<T> bind(Stream<S> source) {
-    Stream<T> stream = super.bind(source);
+    Stream<T> stream = new _SingleStreamImpl<T>();
     // Cache a Sink object to avoid creating a new one for each event.
     _sink = new _StreamImplSink(stream);
+    source.listen(_handleData, onError: _handleError, onDone: _handleDone);
     return stream;
   }
 
@@ -338,131 +513,3 @@
 }
 
 
-class TakeTransformer<T> extends _ForwardingStreamTransformer<T, T> {
-  int _remaining;
-
-  TakeTransformer(int count)
-      : this._remaining = count {
-    // This test is done early to avoid handling an async error
-    // in the _handleData method.
-    if (count is! int) throw new ArgumentError(count);
-  }
-
-  void _handleData(T inputEvent) {
-    if (_remaining > 0) {
-      _stream._add(inputEvent);
-      _remaining -= 1;
-      if (_remaining == 0) {
-        // Closing also unsubscribes all subscribers, which unsubscribes
-        // this from source.
-        _stream._close();
-      }
-    }
-  }
-}
-
-
-class TakeWhileTransformer<T> extends _ForwardingStreamTransformer<T, T> {
-  final _Predicate<T> _test;
-
-  TakeWhileTransformer(bool test(T value))
-      : this._test = test;
-
-  void _handleData(T inputEvent) {
-    bool satisfies;
-    try {
-      satisfies = _test(inputEvent);
-    } catch (e, s) {
-      _stream._signalError(_asyncError(e, s));
-      // The test didn't say true. Didn't say false either, but we stop anyway.
-      _stream._close();
-      return;
-    }
-    if (satisfies) {
-      _stream._add(inputEvent);
-    } else {
-      _stream._close();
-    }
-  }
-}
-
-class SkipTransformer<T> extends _ForwardingStreamTransformer<T, T> {
-  int _remaining;
-
-  SkipTransformer(int count)
-      : this._remaining = count{
-    // This test is done early to avoid handling an async error
-    // in the _handleData method.
-    if (count is! int || count < 0) throw new ArgumentError(count);
-  }
-
-  void _handleData(T inputEvent) {
-    if (_remaining > 0) {
-      _remaining--;
-      return;
-    }
-    return _stream._add(inputEvent);
-  }
-}
-
-class SkipWhileTransformer<T> extends _ForwardingStreamTransformer<T, T> {
-  final _Predicate<T> _test;
-  bool _hasFailed = false;
-
-  SkipWhileTransformer(bool test(T value))
-      : this._test = test;
-
-  void _handleData(T inputEvent) {
-    if (_hasFailed) {
-      _stream._add(inputEvent);
-    }
-    bool satisfies;
-    try {
-      satisfies = _test(inputEvent);
-    } catch (e, s) {
-      _stream._signalError(_asyncError(e, s));
-      // A failure to return a boolean is considered "not matching".
-      _hasFailed = true;
-      return;
-    }
-    if (!satisfies) {
-      _hasFailed = true;
-      _stream._add(inputEvent);
-    }
-  }
-}
-
-typedef bool _Equality<T>(T a, T b);
-
-class DistinctTransformer<T> extends _ForwardingStreamTransformer<T, T> {
-  static var _SENTINEL = new Object();
-
-  _Equality<T> _equals;
-  var _previous = _SENTINEL;
-
-  DistinctTransformer(bool equals(T a, T b))
-      : _equals = equals;
-
-  void _handleData(T inputEvent) {
-    if (identical(_previous, _SENTINEL)) {
-      _previous = inputEvent;
-      return _stream._add(inputEvent);
-    } else {
-      bool isEqual;
-      try {
-        if (_equals == null) {
-          isEqual = (_previous == inputEvent);
-        } else {
-          isEqual = _equals(_previous, inputEvent);
-        }
-      } catch (e, s) {
-        _stream._signalError(_asyncError(e, s));
-        return null;
-      }
-      if (!isEqual) {
-        _stream._add(inputEvent);
-        _previous = inputEvent;
-      }
-    }
-  }
-}
diff --git a/sdk/lib/chrome/dart2js/chrome_dart2js.dart b/sdk/lib/chrome/dart2js/chrome_dart2js.dart
new file mode 100644
index 0000000..9ab5df7
--- /dev/null
+++ b/sdk/lib/chrome/dart2js/chrome_dart2js.dart
@@ -0,0 +1,46 @@
+library chrome;
+
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// DO NOT EDIT
+// Auto-generated dart:chrome library.
+
+
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+// This is an example of exposing chrome APIs in Dart and will be replaced with
+// the proper implementation in the future.
+
+class AppModule {
+  AppModule._();
+
+  WindowModule get window => new WindowModule._();
+}
+
+class WindowModule {
+  WindowModule._();
+
+  void create(String url) {
+    var chrome = JS('', 'chrome');
+
+    if (chrome == null) {
+      throw new UnsupportedError('Not supported by current browser');
+    }
+    var app = JS('', '#.app', chrome);
+    if (app == null) {
+      throw new UnsupportedError('Not supported by current browser');
+    }
+    var window = JS('', '#.window', app);
+    if (app == null) {
+      throw new UnsupportedError('Not supported by current browser');
+    }
+    JS('void', '#.create(#)', window, url);
+  }
+}
+
+final app = new AppModule._();
diff --git a/sdk/lib/chrome/dartium/chrome_dartium.dart b/sdk/lib/chrome/dartium/chrome_dartium.dart
new file mode 100644
index 0000000..c228655
--- /dev/null
+++ b/sdk/lib/chrome/dartium/chrome_dartium.dart
@@ -0,0 +1,9 @@
+library chrome;
+
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// DO NOT EDIT
+// Auto-generated dart:chrome library.
+
diff --git a/sdk/lib/collection/collection.dart b/sdk/lib/collection/collection.dart
index 3219649..7c9e6a3 100644
--- a/sdk/lib/collection/collection.dart
+++ b/sdk/lib/collection/collection.dart
@@ -4,7 +4,10 @@
 
 library dart.collection;
 
+import 'dart:collection-dev';
+
 part 'arrays.dart';
 part 'collections.dart';
 part 'maps.dart';
+part 'sort.dart';
 part 'splay_tree.dart';
diff --git a/sdk/lib/collection/collection_sources.gypi b/sdk/lib/collection/collection_sources.gypi
index 9eea155..f2137e7 100644
--- a/sdk/lib/collection/collection_sources.gypi
+++ b/sdk/lib/collection/collection_sources.gypi
@@ -8,6 +8,7 @@
     'arrays.dart',
     'collections.dart',
     'maps.dart',
+    'sort.dart',
     'splay_tree.dart',
   ],
 }
diff --git a/sdk/lib/collection/collections.dart b/sdk/lib/collection/collections.dart
index 4bd1fad..9a34944 100644
--- a/sdk/lib/collection/collections.dart
+++ b/sdk/lib/collection/collections.dart
@@ -5,11 +5,11 @@
 part of dart.collection;
 
 /**
- * The [Collections] class implements static methods useful when
- * writing a class that implements [Collection] and the [iterator]
- * method.
+ * This class provides default implementations for Iterables (including Lists).
+ *
+ * Once Dart receives Mixins it will be replaced with mixin classes.
  */
-class Collections {
+class IterableMixinWorkaround {
   static bool contains(Iterable iterable, var element) {
     for (final e in iterable) {
       if (element == e) return true;
@@ -46,6 +46,80 @@
     return initialValue;
   }
 
+  /**
+   * Simple implementation for [Collection.removeAll].
+   *
+   * This implementation assumes that [Collection.remove] on [collection]
+   * is efficient. The [:remove:] method on [List] objects is typically
+   * not efficient since it requires linear search to find an element.
+   */
+  static void removeAll(Collection collection, Iterable elementsToRemove) {
+    for (Object object in elementsToRemove) {
+      collection.remove(object);
+    }
+  }
+
+  /**
+   * Implementation of [Collection.removeAll] for lists.
+   *
+   * This implementation assumes that [Collection.remove] is not efficient
+   * (as it usually isn't on a [List]) and uses [Collection.removeMathcing]
+   * instead of just repeatedly calling remove.
+   */
+  static void removeAllList(Collection collection, Iterable elementsToRemove) {
+    Set setToRemove;
+    // Assume contains is efficient on a Set.
+    if (elementsToRemove is Set) {
+      setToRemove = elementsToRemove;
+    } else {
+      setToRemove = elementsToRemove.toSet();
+    }
+    collection.removeMatching(setToRemve.contains);
+  }
+
+  /**
+   * Simple implemenation for [Collection.retainAll].
+   *
+   * This implementation assumes that [Collecton.retainMatching] on [collection]
+   * is efficient.
+   */
+  static void retainAll(Collection collection, Iterable elementsToRetain) {
+    Set lookup;
+    if (elementsToRetain is Set) {
+      lookup = elementsToRetain;
+    } else {
+      lookup = elementsToRetain.toSet();
+    }
+    collection.retainMatching(lookup.contains);
+  }
+
+  /**
+   * Simple implemenation for [Collection.removeMatching].
+   *
+   * This implementation assumes that [Collecton.removeAll] on [collection] is
+   * efficient.
+   */
+  static void removeMatching(Collection collection, bool test(var element)) {
+    List elementsToRemove = [];
+    for (var element in collection) {
+      if (test(element)) elementsToRemove.add(element);
+    }
+    collection.removeAll(elementsToRemove);
+  }
+
+  /**
+   * Simple implemenation for [Collection.retainMatching].
+   *
+   * This implementation assumes that [Collecton.removeAll] on [collection] is
+   * efficient.
+   */
+  static void retainMatching(Collection collection, bool test(var element)) {
+    List elementsToRemove = [];
+    for (var element in collection) {
+      if (!test(element)) elementsToRemove.add(element);
+    }
+    collection.removeAll(elementsToRemove);
+  }
   static bool isEmpty(Iterable iterable) {
     return !iterable.iterator.moveNext();
   }
@@ -186,7 +260,7 @@
     return buffer.toString();
   }
 
-  static String joinList(List<Object> list, [String separator]) {
+  static String joinList(List list, [String separator]) {
     if (list.isEmpty) return "";
     if (list.length == 1) return "${list[0]}";
     StringBuffer buffer = new StringBuffer();
@@ -204,6 +278,151 @@
     return buffer.toString();
   }
 
+  static Iterable where(Iterable iterable, bool f(var element)) {
+    return new WhereIterable(iterable, f);
+  }
+
+  static List mappedByList(List list, f(var element)) {
+    return new MappedList(list, f);
+  }
+
+  static List takeList(List list, int n) {
+    // The generic type is currently lost. It will be fixed with mixins.
+    return new ListView(list, 0, n);
+  }
+
+  static Iterable takeWhile(Iterable iterable, bool test(var value)) {
+    // The generic type is currently lost. It will be fixed with mixins.
+    return new TakeWhileIterable(iterable, test);
+  }
+
+  static List skipList(List list, int n) {
+    // The generic type is currently lost. It will be fixed with mixins.
+    return new ListView(list, n, null);
+  }
+
+  static Iterable skipWhile(Iterable iterable, bool test(var value)) {
+    // The generic type is currently lost. It will be fixed with mixins.
+    return new SkipWhileIterable(iterable, test);
+  }
+
+  static void sortList(List l, int compare(a, b)) {
+    if (compare == null) compare = Comparable.compare;
+    _Sort.sort(l, compare);
+  }
+}
+
+/**
+ * The [Collections] class implements static methods useful when
+ * writing a class that implements [Collection] and the [iterator]
+ * method.
+ */
+class Collections {
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static bool contains(Iterable iterable, var element)
+      => IterableMixinWorkaround.contains(iterable, element);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static void forEach(Iterable iterable, void f(o)) {
+    IterableMixinWorkaround.forEach(iterable, f);
+  }
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static bool any(Iterable iterable, bool f(o))
+      => IterableMixinWorkaround.any(iterable, f);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static bool every(Iterable iterable, bool f(o))
+      => IterableMixinWorkaround.every(iterable, f);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static dynamic reduce(Iterable iterable,
+                        dynamic initialValue,
+                        dynamic combine(dynamic previousValue, element))
+      => IterableMixinWorkaround.reduce(iterable, initialValue, combine);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static bool isEmpty(Iterable iterable)
+      => IterableMixinWorkaround.isEmpty(iterable);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static dynamic first(Iterable iterable)
+      => IterableMixinWorkaround.first(iterable);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static dynamic last(Iterable iterable)
+      => IterableMixinWorkaround.last(iterable);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static dynamic min(Iterable iterable, [int compare(var a, var b)])
+      => IterableMixinWorkaround.min(iterable, compare);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static dynamic max(Iterable iterable, [int compare(var a, var b)])
+      => IterableMixinWorkaround.max(iterable, compare);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static dynamic single(Iterable iterable)
+      => IterableMixinWorkaround.single(iterable);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static dynamic firstMatching(Iterable iterable,
+                               bool test(dynamic value),
+                               dynamic orElse())
+      => IterableMixinWorkaround.firstMatching(iterable, test, orElse);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static dynamic lastMatching(Iterable iterable,
+                              bool test(dynamic value),
+                              dynamic orElse())
+      => IterableMixinWorkaround.lastMatching(iterable, test, orElse);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static dynamic lastMatchingInList(List list,
+                                    bool test(dynamic value),
+                                    dynamic orElse())
+      => IterableMixinWorkaround.lastMatchingInList(list, test, orElse);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static dynamic singleMatching(Iterable iterable, bool test(dynamic value))
+      => IterableMixinWorkaround.singleMatching(iterable, test);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static dynamic elementAt(Iterable iterable, int index)
+      => IterableMixinWorkaround.elementAt(iterable, index);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static String join(Iterable iterable, [String separator])
+      => IterableMixinWorkaround.join(iterable, separator);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static String joinList(List list, [String separator])
+      => IterableMixinWorkaround.joinList(list, separator);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static Iterable where(Iterable iterable, bool f(var element))
+      => IterableMixinWorkaround.where(iterable, f);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static List mappedByList(List list, f(var element))
+      => IterableMixinWorkaround.mappedByList(list, f);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static List takeList(List list, int n)
+      => IterableMixinWorkaround.takeList(list, n);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static Iterable takeWhile(Iterable iterable, bool test(var value))
+      => IterableMixinWorkaround.takeWhile(iterable, test);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static List skipList(List list, int n)
+      => IterableMixinWorkaround.skipList(list, n);
+
+  /** Deprecated. Use the same method in [IterableMixinWorkaround] instead.*/
+  static Iterable skipWhile(Iterable iterable, bool test(var value))
+      => IterableMixinWorkaround.skipWhile(iterable, test);
+
   // TODO(jjb): visiting list should be an identityHashSet when it exists
 
   /**
diff --git a/sdk/lib/collection/maps.dart b/sdk/lib/collection/maps.dart
index 6c9472c..62c760f 100644
--- a/sdk/lib/collection/maps.dart
+++ b/sdk/lib/collection/maps.dart
@@ -39,7 +39,7 @@
   }
 
   static clear(Map map) {
-    for (final k in map.keys) {
+    for (final k in map.keys.toList()) {
       map.remove(k);
     }
   }
@@ -50,17 +50,13 @@
     }
   }
 
-  static Collection getValues(Map map) {
-    final result = [];
-    for (final k in map.keys) {
-      result.add(map[k]);
-    }
-    return result;
+  static Iterable getValues(Map map) {
+    return map.keys.mappedBy((key) => map[key]);
   }
 
   static int length(Map map) => map.keys.length;
 
-  static bool isEmpty(Map map) => length(map) == 0;
+  static bool isEmpty(Map map) => map.keys.isEmpty;
 
   /**
    * Returns a string representing the specified map. The returned string
diff --git a/sdk/lib/core/sort.dart b/sdk/lib/collection/sort.dart
similarity index 97%
rename from sdk/lib/core/sort.dart
rename to sdk/lib/collection/sort.dart
index 96d987a..a5805cd 100644
--- a/sdk/lib/core/sort.dart
+++ b/sdk/lib/collection/sort.dart
@@ -2,13 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of dart.core;
-
-// TODO(ajohnsen): Remove once dart2js intercepters can work without it.
-/**
- * WARNING: This method is temporary and will go away soon.
- */
-void coreSort(List l, int compare(a, b)) => _Sort.sort(l, compare);
+part of dart.collection;
 
 /**
  * Dual-Pivot Quicksort algorithm.
diff --git a/sdk/lib/collection_dev/collection_dev.dart b/sdk/lib/collection_dev/collection_dev.dart
new file mode 100644
index 0000000..20eaac9
--- /dev/null
+++ b/sdk/lib/collection_dev/collection_dev.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart.collection.dev;
+
+part 'iterable.dart';
+part 'list.dart';
diff --git a/sdk/lib/collection_dev/collection_dev_sources.gypi b/sdk/lib/collection_dev/collection_dev_sources.gypi
new file mode 100644
index 0000000..4bee7d2
--- /dev/null
+++ b/sdk/lib/collection_dev/collection_dev_sources.gypi
@@ -0,0 +1,11 @@
+# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# This file contains all sources for the dart:collection-dev library.
+{
+  'sources': [
+    'iterable.dart',
+    'list.dart',
+  ],
+}
diff --git a/sdk/lib/collection_dev/iterable.dart b/sdk/lib/collection_dev/iterable.dart
new file mode 100644
index 0000000..8fcef18
--- /dev/null
+++ b/sdk/lib/collection_dev/iterable.dart
@@ -0,0 +1,226 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dart.collection.dev;
+
+typedef T _Transformation<S, T>(S value);
+
+class MappedIterable<S, T> extends Iterable<T> {
+  final Iterable<S> _iterable;
+  // TODO(ahe): Restore type when feature is implemented in dart2js
+  // checked mode. http://dartbug.com/7733
+  final /* _Transformation<S, T> */ _f;
+
+  MappedIterable(this._iterable, T this._f(S element));
+
+  Iterator<T> get iterator => new MappedIterator<S, T>(_iterable.iterator, _f);
+
+  // Length related functions are independent of the mapping.
+  int get length => _iterable.length;
+  bool get isEmpty => _iterable.isEmpty;
+}
+
+class MappedIterator<S, T> extends Iterator<T> {
+  T _current;
+  final Iterator<S> _iterator;
+  // TODO(ahe): Restore type when feature is implemented in dart2js
+  // checked mode. http://dartbug.com/7733
+  final /* _Transformation<S, T> */ _f;
+
+  MappedIterator(this._iterator, T this._f(S element));
+
+  bool moveNext() {
+    if (_iterator.moveNext()) {
+      _current = _f(_iterator.current);
+      return true;
+    } else {
+      _current = null;
+      return false;
+    }
+  }
+
+  T get current => _current;
+}
+
+typedef bool _ElementPredicate<E>(E element);
+
+class WhereIterable<E> extends Iterable<E> {
+  final Iterable<E> _iterable;
+  // TODO(ahe): Restore type when feature is implemented in dart2js
+  // checked mode. http://dartbug.com/7733
+  final /* _ElementPredicate */ _f;
+
+  WhereIterable(this._iterable, bool this._f(E element));
+
+  Iterator<E> get iterator => new WhereIterator<E>(_iterable.iterator, _f);
+}
+
+class WhereIterator<E> extends Iterator<E> {
+  final Iterator<E> _iterator;
+  // TODO(ahe): Restore type when feature is implemented in dart2js
+  // checked mode. http://dartbug.com/7733
+  final /* _ElementPredicate */ _f;
+
+  WhereIterator(this._iterator, bool this._f(E element));
+
+  bool moveNext() {
+    while (_iterator.moveNext()) {
+      if (_f(_iterator.current)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  E get current => _iterator.current;
+}
+
+class TakeIterable<E> extends Iterable<E> {
+  final Iterable<E> _iterable;
+  final int _takeCount;
+
+  TakeIterable(this._iterable, this._takeCount) {
+    if (_takeCount is! int || _takeCount < 0) {
+      throw new ArgumentError(_takeCount);
+    }
+  }
+
+  Iterator<E> get iterator {
+    return new TakeIterator<E>(_iterable.iterator, _takeCount);
+  }
+}
+
+class TakeIterator<E> extends Iterator<E> {
+  final Iterator<E> _iterator;
+  int _remaining;
+
+  TakeIterator(this._iterator, this._remaining) {
+    assert(_remaining is int && _remaining >= 0);
+  }
+
+  bool moveNext() {
+    _remaining--;
+    if (_remaining >= 0) {
+      return _iterator.moveNext();
+    }
+    _remaining = -1;
+    return false;
+  }
+
+  E get current {
+    if (_remaining < 0) return null;
+    return _iterator.current;
+  }
+}
+
+class TakeWhileIterable<E> extends Iterable<E> {
+  final Iterable<E> _iterable;
+  // TODO(ahe): Restore type when feature is implemented in dart2js
+  // checked mode. http://dartbug.com/7733
+  final /* _ElementPredicate */ _f;
+
+  TakeWhileIterable(this._iterable, bool this._f(E element));
+
+  Iterator<E> get iterator {
+    return new TakeWhileIterator<E>(_iterable.iterator, _f);
+  }
+}
+
+class TakeWhileIterator<E> extends Iterator<E> {
+  final Iterator<E> _iterator;
+  // TODO(ahe): Restore type when feature is implemented in dart2js
+  // checked mode. http://dartbug.com/7733
+  final /* _ElementPredicate */ _f;
+  bool _isFinished = false;
+
+  TakeWhileIterator(this._iterator, bool this._f(E element));
+
+  bool moveNext() {
+    if (_isFinished) return false;
+    if (!_iterator.moveNext() || !_f(_iterator.current)) {
+      _isFinished = true;
+      return false;
+    }
+    return true;
+  }
+
+  E get current {
+    if (_isFinished) return null;
+    return _iterator.current;
+  }
+}
+
+class SkipIterable<E> extends Iterable<E> {
+  final Iterable<E> _iterable;
+  final int _skipCount;
+
+  SkipIterable(this._iterable, this._skipCount) {
+    if (_skipCount is! int || _skipCount < 0) {
+      throw new ArgumentError(_skipCount);
+    }
+  }
+
+  Iterable<E> skip(int n) {
+    if (n is! int || n < 0) {
+      throw new ArgumentError(n);
+    }
+    return new SkipIterable<E>(_iterable, _skipCount + n);
+  }
+
+  Iterator<E> get iterator {
+    return new SkipIterator<E>(_iterable.iterator, _skipCount);
+  }
+}
+
+class SkipIterator<E> extends Iterator<E> {
+  final Iterator<E> _iterator;
+  int _skipCount;
+
+  SkipIterator(this._iterator, this._skipCount) {
+    assert(_skipCount is int && _skipCount >= 0);
+  }
+
+  bool moveNext() {
+    for (int i = 0; i < _skipCount; i++) _iterator.moveNext();
+    _skipCount = 0;
+    return _iterator.moveNext();
+  }
+
+  E get current => _iterator.current;
+}
+
+class SkipWhileIterable<E> extends Iterable<E> {
+  final Iterable<E> _iterable;
+  // TODO(ahe): Restore type when feature is implemented in dart2js
+  // checked mode. http://dartbug.com/7733
+  final /* _ElementPredicate */ _f;
+
+  SkipWhileIterable(this._iterable, bool this._f(E element));
+
+  Iterator<E> get iterator {
+    return new SkipWhileIterator<E>(_iterable.iterator, _f);
+  }
+}
+
+class SkipWhileIterator<E> extends Iterator<E> {
+  final Iterator<E> _iterator;
+  // TODO(ahe): Restore type when feature is implemented in dart2js
+  // checked mode. http://dartbug.com/7733
+  final /* _ElementPredicate */ _f;
+  bool _hasSkipped = false;
+
+  SkipWhileIterator(this._iterator, bool this._f(E element));
+
+  bool moveNext() {
+    if (!_hasSkipped) {
+      _hasSkipped = true;
+      while (_iterator.moveNext()) {
+        if (!_f(_iterator.current)) return true;
+      }
+    }
+    return _iterator.moveNext();
+  }
+
+  E get current => _iterator.current;
+}
diff --git a/sdk/lib/collection_dev/list.dart b/sdk/lib/collection_dev/list.dart
new file mode 100644
index 0000000..48b31fa
--- /dev/null
+++ b/sdk/lib/collection_dev/list.dart
@@ -0,0 +1,267 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dart.collection.dev;
+
+/**
+ * Skeleton class for an unmodifiable [List].
+ */
+abstract class NonExtensibleListMixin<E>
+    extends Iterable<E> implements List<E> {
+
+  Iterator<E> get iterator => new ListIterator(this);
+
+  void forEach(f(E element)) {
+    for (int i = 0; i < this.length; i++) f(this[i]);
+  }
+
+  bool contains(E value) {
+    for (int i = 0; i < length; i++) {
+      if (this[i] == value) return true;
+    }
+    return false;
+  }
+
+  reduce(initialValue, combine(previousValue, E element)) {
+    var value = initialValue;
+    for (int i = 0; i < this.length; i++) {
+      value = combine(value, this[i]);
+    }
+    return value;
+  }
+
+  bool every(bool f(E element)) {
+    for (int i = 0; i < this.length; i++) {
+      if (!f(this[i])) return false;
+    }
+    return true;
+  }
+
+  bool any(bool f(E element)) {
+    for (int i = 0; i < this.length; i++) {
+      if (f(this[i])) return true;
+    }
+    return false;
+  }
+
+  bool get isEmpty {
+    return this.length == 0;
+  }
+
+  E elementAt(int index) {
+    return this[index];
+  }
+
+  int indexOf(E value, [int start = 0]) {
+    for (int i = start; i < length; i++) {
+      if (this[i] == value) return i;
+    }
+    return -1;
+  }
+
+  int lastIndexOf(E value, [int start]) {
+    if (start == null) start = length - 1;
+    for (int i = start; i >= 0; i--) {
+      if (this[i] == value) return i;
+    }
+    return -1;
+  }
+
+  E get first {
+    if (length > 0) return this[0];
+    throw new StateError("No elements");
+  }
+
+  E get last {
+    if (length > 0) return this[length - 1];
+    throw new StateError("No elements");
+  }
+
+  E get single {
+    if (length == 1) return this[0];
+    if (length == 0) throw new StateError("No elements");
+    throw new StateError("More than one element");
+  }
+
+  List<E> getRange(int start, int length) {
+    List<E> result = <E>[];
+    for (int i = 0; i < length; i++) {
+      result.add(this[start + i]);
+    }
+    return result;
+  }
+
+  void operator []=(int index, E value) {
+    throw new UnsupportedError(
+        "Cannot modify an unmodifiable list");
+  }
+
+  void set length(int newLength) {
+    throw new UnsupportedError(
+        "Cannot change the length of an unmodifiable list");
+  }
+
+  void add(E value) {
+    throw new UnsupportedError(
+        "Cannot add to an unmodifiable list");
+  }
+
+  void addLast(E value) {
+    throw new UnsupportedError(
+        "Cannot add to an unmodifiable list");
+  }
+
+  void addAll(Iterable<E> iterable) {
+    throw new UnsupportedError(
+        "Cannot add to an unmodifiable list");
+  }
+
+  void remove(E element) {
+    throw new UnsupportedError(
+        "Cannot remove from an unmodifiable list");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError(
+        "Cannot remove from an unmodifiable list");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError(
+        "Cannot remove from an unmodifiable list");
+  }
+
+  void removeMatching(bool test(E element)) {
+    throw new UnsupportedError(
+        "Cannot remove from an unmodifiable list");
+  }
+  void sort([Comparator<E> compare]) {
+    throw new UnsupportedError(
+        "Cannot modify an unmodifiable list");
+  }
+
+  void clear() {
+    throw new UnsupportedError(
+        "Cannot clear an unmodifiable list");
+  }
+
+  E removeAt(int index) {
+    throw new UnsupportedError(
+        "Cannot remove from an unmodifiable list");
+  }
+
+  E removeLast() {
+    throw new UnsupportedError(
+        "Cannot remove from an unmodifiable list");
+  }
+
+  void setRange(int start, int length, List<E> from, [int startFrom]) {
+    throw new UnsupportedError(
+        "Cannot modify an unmodifiable list");
+  }
+
+  void removeRange(int start, int length) {
+    throw new UnsupportedError(
+        "Cannot remove from an unmodifiable list");
+  }
+
+  void insertRange(int start, int length, [E initialValue]) {
+    throw new UnsupportedError(
+        "Cannot insert range in an unmodifiable list");
+  }
+}
+
+/**
+ * Iterates over a [List] in growing index order.
+ */
+class ListIterator<E> implements Iterator<E> {
+  final List<E> _list;
+  int _position;
+  E _current;
+
+  ListIterator(this._list) : _position = -1;
+
+  bool moveNext() {
+    int nextPosition = _position + 1;
+    if (nextPosition < _list.length) {
+      _current = _list[nextPosition];
+      _position = nextPosition;
+      return true;
+    }
+    _position = _list.length;
+    _current = null;
+    return false;
+  }
+
+  E get current => _current;
+}
+
+class MappedList<S, T> extends NonExtensibleListMixin<T> {
+  final List<S> _list;
+  // TODO(ahe): Restore type when feature is implemented in dart2js
+  // checked mode. http://dartbug.com/7733
+  final /* _Transformation<S, T> */ _f;
+
+  MappedList(this._list, T this._f(S element));
+
+  T operator[](int index) => _f(_list[index]);
+  int get length => _list.length;
+}
+
+/**
+ * An immutable view of a [List].
+ */
+class ListView<E> extends NonExtensibleListMixin<E> {
+  final List<E> _list;
+  final int _offset;
+  final int _length;
+
+  /**
+   * If the given length is `null` then the ListView's length is bound by
+   * the backed [list].
+   */
+  ListView(List<E> list, this._offset, this._length) : _list = list {
+    if (_offset is! int || _offset < 0) {
+      throw new ArgumentError(_offset);
+    }
+    if (_length != null &&
+        (_length is! int || _length < 0)) {
+      throw new ArgumentError(_length);
+    }
+  }
+
+  int get length {
+    int originalLength = _list.length;
+    int skipLength = originalLength - _offset;
+    if (skipLength < 0) return 0;
+    if (_length == null || _length > skipLength) return skipLength;
+    return _length;
+  }
+
+  E operator[](int index) {
+    int skipIndex = index + _offset;
+    if (index < 0 ||
+        (_length != null && index >= _length) ||
+        index + _offset >= _list.length) {
+      throw new RangeError.value(index);
+    }
+    return _list[index + _offset];
+  }
+
+  ListView<E> skip(int skipCount) {
+    if (skipCount is! int || skipCount < 0) {
+      throw new ArgumentError(skipCount);
+    }
+    return new ListView(_list, _offset + skipCount, _length);
+  }
+
+  ListView<E> take(int takeCount) {
+    if (takeCount is! int || takeCount < 0) {
+      throw new ArgumentError(takeCount);
+    }
+    int newLength = takeCount;
+    if (_length != null && takeCount > _length) newLength = _length;
+    return new ListView(_list, _offset, newLength);
+  }
+}
diff --git a/sdk/lib/core/collection.dart b/sdk/lib/core/collection.dart
index 23b08e6..48ab1de 100644
--- a/sdk/lib/core/collection.dart
+++ b/sdk/lib/core/collection.dart
@@ -5,11 +5,83 @@
 part of dart.core;
 
 /**
- * The common interface of all collections.
+ * A collection of individual elements.
  *
- * The [Collection] class contains a skeleton implementation of
- * an iterator based collection.
+ * A [Collection] contains some elements in a structure optimized
+ * for certain operations. Different collections are optimized for different
+ * uses.
+ *
+ * A collection can be updated by adding or removing elements.
+ *
+ * Collections are [Iterable]. The order of iteration is defined by
+ * each type of collection.
  */
 abstract class Collection<E> extends Iterable<E> {
   const Collection();
+
+  /**
+   * Adds an element to this collection.
+   */
+  void add(E element);
+
+  /**
+   * Adds all of [elements] to this collection.
+   *
+   * Equivalent to adding each element in [elements] using [add],
+   * but some collections may be able to optimize it.
+   */
+  void addAll(Iterable<E> elements) {
+    for (E element in elements) {
+      add(element);
+    }
+  }
+
+  /**
+   * Removes an instance of [element] from this collection.
+   *
+   * This removes only one instance of the element for collections that can
+   * contain the same element more than once (e.g., [List]). Which instance
+   * is removed is decided by the collection.
+   *
+   * Has no effect if the elements is not in this collection.
+   */
+  void remove(Object element);
+
+  /**
+   * Removes all of [elements] from this collection.
+   *
+   * Equivalent to calling [remove] once for each element in
+   * [elements], but may be faster for some collections.
+   */
+  void removeAll(Iterable elements) {
+    IterableMixinWorkaround.removeAll(this, elements);
+  }
+
+  /**
+   * Removes all elements of this collection that are not
+   * in [elements].
+   *
+   * For [Set]s, this is the intersection of the two original sets.
+   */
+  void retainAll(Iterable elements) {
+    IterableMixinWorkaround.retainAll(this, elements);
+  }
+
+  /**
+   * Removes all elements of this collection that satisfy [test].
+   *
+   * An elements [:e:] satisfies [test] if [:test(e):] is true.
+   */
+  void removeMatching(bool test(E element)) {
+    IterableMixinWorkaround.removeMatching(this, test);
+  }
+
+  /**
+   * Removes all elements of this collection that fail to satisfy [test].
+   *
+   * An elements [:e:] satisfies [test] if [:test(e):] is true.
+   */
+  void retainMatching(bool test(E element)) {
+    IterableMixinWorkaround.retainMatching(this, test);
+  }
 }
diff --git a/sdk/lib/core/core.dart b/sdk/lib/core/core.dart
index af086a7..706b92d 100644
--- a/sdk/lib/core/core.dart
+++ b/sdk/lib/core/core.dart
@@ -5,6 +5,7 @@
 library dart.core;
 
 import "dart:collection";
+import "dart:collection-dev";
 
 part "bool.dart";
 part "collection.dart";
@@ -33,7 +34,6 @@
 part "regexp.dart";
 part "set.dart";
 part "sink.dart";
-part "sort.dart";
 part "stopwatch.dart";
 part "string.dart";
 part "string_buffer.dart";
diff --git a/sdk/lib/core/corelib_sources.gypi b/sdk/lib/core/corelib_sources.gypi
index dd48fd0..b502e96 100644
--- a/sdk/lib/core/corelib_sources.gypi
+++ b/sdk/lib/core/corelib_sources.gypi
@@ -30,7 +30,6 @@
     'queue.dart',
     'regexp.dart',
     'set.dart',
-    'sort.dart',
     'sink.dart',
     'stopwatch.dart',
     'string.dart',
diff --git a/sdk/lib/core/iterable.dart b/sdk/lib/core/iterable.dart
index a2cc9cd..896d356 100644
--- a/sdk/lib/core/iterable.dart
+++ b/sdk/lib/core/iterable.dart
@@ -372,227 +372,6 @@
   }
 }
 
-typedef T _Transformation<S, T>(S value);
-
-class MappedIterable<S, T> extends Iterable<T> {
-  final Iterable<S> _iterable;
-  // TODO(ahe): Restore type when feature is implemented in dart2js
-  // checked mode. http://dartbug.com/7733
-  final /* _Transformation<S, T> */ _f;
-
-  MappedIterable(this._iterable, T this._f(S element));
-
-  Iterator<T> get iterator => new MappedIterator<S, T>(_iterable.iterator, _f);
-
-  // Length related functions are independent of the mapping.
-  int get length => _iterable.length;
-  bool get isEmpty => _iterable.isEmpty;
-}
-
-class MappedIterator<S, T> extends Iterator<T> {
-  T _current;
-  final Iterator<S> _iterator;
-  // TODO(ahe): Restore type when feature is implemented in dart2js
-  // checked mode. http://dartbug.com/7733
-  final /* _Transformation<S, T> */ _f;
-
-  MappedIterator(this._iterator, T this._f(S element));
-
-  bool moveNext() {
-    if (_iterator.moveNext()) {
-      _current = _f(_iterator.current);
-      return true;
-    } else {
-      _current = null;
-      return false;
-    }
-  }
-
-  T get current => _current;
-}
-
-typedef bool _ElementPredicate<E>(E element);
-
-class WhereIterable<E> extends Iterable<E> {
-  final Iterable<E> _iterable;
-  // TODO(ahe): Restore type when feature is implemented in dart2js
-  // checked mode. http://dartbug.com/7733
-  final /* _ElementPredicate */ _f;
-
-  WhereIterable(this._iterable, bool this._f(E element));
-
-  Iterator<E> get iterator => new WhereIterator<E>(_iterable.iterator, _f);
-}
-
-class WhereIterator<E> extends Iterator<E> {
-  final Iterator<E> _iterator;
-  // TODO(ahe): Restore type when feature is implemented in dart2js
-  // checked mode. http://dartbug.com/7733
-  final /* _ElementPredicate */ _f;
-
-  WhereIterator(this._iterator, bool this._f(E element));
-
-  bool moveNext() {
-    while (_iterator.moveNext()) {
-      if (_f(_iterator.current)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  E get current => _iterator.current;
-}
-
-class TakeIterable<E> extends Iterable<E> {
-  final Iterable<E> _iterable;
-  final int _takeCount;
-
-  TakeIterable(this._iterable, this._takeCount) {
-    if (_takeCount is! int || _takeCount < 0) {
-      throw new ArgumentError(_takeCount);
-    }
-  }
-
-  Iterator<E> get iterator {
-    return new TakeIterator<E>(_iterable.iterator, _takeCount);
-  }
-}
-
-class TakeIterator<E> extends Iterator<E> {
-  final Iterator<E> _iterator;
-  int _remaining;
-
-  TakeIterator(this._iterator, this._remaining) {
-    assert(_remaining is int && _remaining >= 0);
-  }
-
-  bool moveNext() {
-    _remaining--;
-    if (_remaining >= 0) {
-      return _iterator.moveNext();
-    }
-    _remaining = -1;
-    return false;
-  }
-
-  E get current {
-    if (_remaining < 0) return null;
-    return _iterator.current;
-  }
-}
-
-class TakeWhileIterable<E> extends Iterable<E> {
-  final Iterable<E> _iterable;
-  // TODO(ahe): Restore type when feature is implemented in dart2js
-  // checked mode. http://dartbug.com/7733
-  final /* _ElementPredicate */ _f;
-
-  TakeWhileIterable(this._iterable, bool this._f(E element));
-
-  Iterator<E> get iterator {
-    return new TakeWhileIterator<E>(_iterable.iterator, _f);
-  }
-}
-
-class TakeWhileIterator<E> extends Iterator<E> {
-  final Iterator<E> _iterator;
-  // TODO(ahe): Restore type when feature is implemented in dart2js
-  // checked mode. http://dartbug.com/7733
-  final /* _ElementPredicate */ _f;
-  bool _isFinished = false;
-
-  TakeWhileIterator(this._iterator, bool this._f(E element));
-
-  bool moveNext() {
-    if (_isFinished) return false;
-    if (!_iterator.moveNext() || !_f(_iterator.current)) {
-      _isFinished = true;
-      return false;
-    }
-    return true;
-  }
-
-  E get current {
-    if (_isFinished) return null;
-    return _iterator.current;
-  }
-}
-
-class SkipIterable<E> extends Iterable<E> {
-  final Iterable<E> _iterable;
-  final int _skipCount;
-
-  SkipIterable(this._iterable, this._skipCount) {
-    if (_skipCount is! int || _skipCount < 0) {
-      throw new ArgumentError(_skipCount);
-    }
-  }
-
-  Iterable<E> skip(int n) {
-    if (n is! int || n < 0) {
-      throw new ArgumentError(n);
-    }
-    return new SkipIterable<E>(_iterable, _skipCount + n);
-  }
-
-  Iterator<E> get iterator {
-    return new SkipIterator<E>(_iterable.iterator, _skipCount);
-  }
-}
-
-class SkipIterator<E> extends Iterator<E> {
-  final Iterator<E> _iterator;
-  int _skipCount;
-
-  SkipIterator(this._iterator, this._skipCount) {
-    assert(_skipCount is int && _skipCount >= 0);
-  }
-
-  bool moveNext() {
-    for (int i = 0; i < _skipCount; i++) _iterator.moveNext();
-    _skipCount = 0;
-    return _iterator.moveNext();
-  }
-
-  E get current => _iterator.current;
-}
-
-class SkipWhileIterable<E> extends Iterable<E> {
-  final Iterable<E> _iterable;
-  // TODO(ahe): Restore type when feature is implemented in dart2js
-  // checked mode. http://dartbug.com/7733
-  final /* _ElementPredicate */ _f;
-
-  SkipWhileIterable(this._iterable, bool this._f(E element));
-
-  Iterator<E> get iterator {
-    return new SkipWhileIterator<E>(_iterable.iterator, _f);
-  }
-}
-
-class SkipWhileIterator<E> extends Iterator<E> {
-  final Iterator<E> _iterator;
-  // TODO(ahe): Restore type when feature is implemented in dart2js
-  // checked mode. http://dartbug.com/7733
-  final /* _ElementPredicate */ _f;
-  bool _hasSkipped = false;
-
-  SkipWhileIterator(this._iterator, bool this._f(E element));
-
-  bool moveNext() {
-    if (!_hasSkipped) {
-      _hasSkipped = true;
-      while (_iterator.moveNext()) {
-        if (!_f(_iterator.current)) return true;
-      }
-    }
-    return _iterator.moveNext();
-  }
-
-  E get current => _iterator.current;
-}
-
 
 typedef E _Generator<E>(int index);
 
diff --git a/sdk/lib/core/list.dart b/sdk/lib/core/list.dart
index a2c299a..2ab0a06 100644
--- a/sdk/lib/core/list.dart
+++ b/sdk/lib/core/list.dart
@@ -190,246 +190,3 @@
    */
   void insertRange(int start, int length, [E fill]);
 }
-
-/**
- * An unmodifiable [List].
- */
-abstract class NonExtensibleListMixin<E>
-    extends Iterable<E> implements List<E> {
-
-  Iterator<E> get iterator => new ListIterator(this);
-
-  void forEach(f(E element)) {
-    for (int i = 0; i < this.length; i++) f(this[i]);
-  }
-
-  bool contains(E value) {
-    for (int i = 0; i < length; i++) {
-      if (this[i] == value) return true;
-    }
-    return false;
-  }
-
-  reduce(initialValue, combine(previousValue, E element)) {
-    var value = initialValue;
-    for (int i = 0; i < this.length; i++) {
-      value = combine(value, this[i]);
-    }
-    return value;
-  }
-
-  bool every(bool f(E element)) {
-    for (int i = 0; i < this.length; i++) {
-      if (!f(this[i])) return false;
-    }
-    return true;
-  }
-
-  bool any(bool f(E element)) {
-    for (int i = 0; i < this.length; i++) {
-      if (f(this[i])) return true;
-    }
-    return false;
-  }
-
-  bool get isEmpty {
-    return this.length == 0;
-  }
-
-  E elementAt(int index) {
-    return this[index];
-  }
-
-  int indexOf(E value, [int start = 0]) {
-    for (int i = start; i < length; i++) {
-      if (this[i] == value) return i;
-    }
-    return -1;
-  }
-
-  int lastIndexOf(E value, [int start]) {
-    if (start == null) start = length - 1;
-    for (int i = start; i >= 0; i--) {
-      if (this[i] == value) return i;
-    }
-    return -1;
-  }
-
-  E get first {
-    if (length > 0) return this[0];
-    throw new StateError("No elements");
-  }
-
-  E get last {
-    if (length > 0) return this[length - 1];
-    throw new StateError("No elements");
-  }
-
-  E get single {
-    if (length == 1) return this[0];
-    if (length == 0) throw new StateError("No elements");
-    throw new StateError("More than one element");
-  }
-
-  List<E> getRange(int start, int length) {
-    List<E> result = <E>[];
-    for (int i = 0; i < length; i++) {
-      result.add(this[start + i]);
-    }
-    return result;
-  }
-
-  void operator []=(int index, E value) {
-    throw new UnsupportedError(
-        "Cannot modify an unmodifiable list");
-  }
-
-  void set length(int newLength) {
-    throw new UnsupportedError(
-        "Cannot change the length of an unmodifiable list");
-  }
-
-  void add(E value) {
-    throw new UnsupportedError(
-        "Cannot add to an unmodifiable list");
-  }
-
-  void addLast(E value) {
-    throw new UnsupportedError(
-        "Cannot add to an unmodifiable list");
-  }
-
-  void addAll(Iterable<E> iterable) {
-    throw new UnsupportedError(
-        "Cannot add to an unmodifiable list");
-  }
-
-  void sort([Comparator<E> compare]) {
-    throw new UnsupportedError(
-        "Cannot modify an unmodifiable list");
-  }
-
-  void clear() {
-    throw new UnsupportedError(
-        "Cannot clear an unmodifiable list");
-  }
-
-  E removeAt(int index) {
-    throw new UnsupportedError(
-        "Cannot remove in an unmodifiable list");
-  }
-
-  E removeLast() {
-    throw new UnsupportedError(
-        "Cannot remove in an unmodifiable list");
-  }
-
-  void setRange(int start, int length, List<E> from, [int startFrom]) {
-    throw new UnsupportedError(
-        "Cannot modify an unmodifiable list");
-  }
-
-  void removeRange(int start, int length) {
-    throw new UnsupportedError(
-        "Cannot remove in an unmodifiable list");
-  }
-
-  void insertRange(int start, int length, [E initialValue]) {
-    throw new UnsupportedError(
-        "Cannot insert range in an unmodifiable list");
-  }
-}
-
-/**
- * Iterates over a [Sequence] in growing index order.
- */
-class ListIterator<E> implements Iterator<E> {
-  final List<E> _list;
-  int _position;
-  E _current;
-
-  ListIterator(this._list) : _position = -1;
-
-  bool moveNext() {
-    int nextPosition = _position + 1;
-    if (nextPosition < _list.length) {
-      _current = _list[nextPosition];
-      _position = nextPosition;
-      return true;
-    }
-    _position = _list.length;
-    _current = null;
-    return false;
-  }
-
-  E get current => _current;
-}
-
-class MappedList<S, T> extends NonExtensibleListMixin<T> {
-  final List<S> _list;
-  // TODO(ahe): Restore type when feature is implemented in dart2js
-  // checked mode. http://dartbug.com/7733
-  final /* _Transformation<S, T> */ _f;
-
-  MappedList(this._list, T this._f(S element));
-
-  T operator[](int index) => _f(_list[index]);
-  int get length => _list.length;
-}
-
-/**
- * An immutable view of a [List].
- */
-class ListView<E> extends NonExtensibleListMixin<E> {
-  final List<E> _list;
-  final int _offset;
-  final int _length;
-
-  /**
-   * If the given length is `null` then the ListView's length is bound by
-   * the backed [list].
-   */
-  ListView(List<E> list, this._offset, this._length) : _list = list {
-    if (_offset is! int || _offset < 0) {
-      throw new ArgumentError(_offset);
-    }
-    if (_length != null &&
-        (_length is! int || _length < 0)) {
-      throw new ArgumentError(_length);
-    }
-  }
-
-  int get length {
-    int originalLength = _list.length;
-    int skipLength = originalLength - _offset;
-    if (skipLength < 0) return 0;
-    if (_length == null || _length > skipLength) return skipLength;
-    return _length;
-  }
-
-  E operator[](int index) {
-    int skipIndex = index + _offset;
-    if (index < 0 ||
-        (_length != null && index >= _length) ||
-        index + _offset >= _list.length) {
-      throw new RangeError.value(index);
-    }
-    return _list[index + _offset];
-  }
-
-  ListView<E> skip(int skipCount) {
-    if (skipCount is! int || skipCount < 0) {
-      throw new ArgumentError(skipCount);
-    }
-    return new ListView(_list, _offset + skipCount, _length);
-  }
-
-  ListView<E> take(int takeCount) {
-    if (takeCount is! int || takeCount < 0) {
-      throw new ArgumentError(takeCount);
-    }
-    int newLength = takeCount;
-    if (_length != null && takeCount > _length) newLength = _length;
-    return new ListView(_list, _offset, newLength);
-  }
-}
diff --git a/sdk/lib/core/queue.dart b/sdk/lib/core/queue.dart
index 9a000c3..8f20efd 100644
--- a/sdk/lib/core/queue.dart
+++ b/sdk/lib/core/queue.dart
@@ -201,6 +201,44 @@
     return _sentinel._next.remove();
   }
 
+  void remove(Object o) {
+    DoubleLinkedQueueEntry<E> entry = firstEntry();
+    while (!identical(entry, _sentinel)) {
+      if (entry.element == o) {
+        entry.remove();
+        return;
+      }
+      entry = entry._next;
+    }
+  }
+
+  void removeAll(Iterable elements) {
+    // Use this method when remove is slow and removeMatching more efficient.
+    IterableMixinWorkaround.removeAllList(this, elements);
+  }
+
+  void removeMatching(bool test(E element)) {
+    DoubleLinkedQueueEntry<E> entry = firstEntry();
+    while (!identical(entry, _sentinel)) {
+      DoubleLinkedQueueEntry<E> next = entry._next;
+      if (test(entry.element)) {
+        entry.remove();
+      }
+      entry = next;
+    }
+  }
+
+  void retainMatching(bool test(E element)) {
+    DoubleLinkedQueueEntry<E> entry = firstEntry();
+    while (!identical(entry, _sentinel)) {
+      DoubleLinkedQueueEntry<E> next = entry._next;
+      if (!test(entry.element)) {
+        entry.remove();
+      }
+      entry = next;
+    }
+  }
+
   E get first {
     return _sentinel._next.element;
   }
diff --git a/sdk/lib/core/set.dart b/sdk/lib/core/set.dart
index 95a633a..556c1fa 100644
--- a/sdk/lib/core/set.dart
+++ b/sdk/lib/core/set.dart
@@ -9,12 +9,12 @@
  * without duplicates.
  */
 abstract class Set<E> extends Collection<E> {
-  factory Set() => new _HashSetImpl<E>();
+  factory Set() => new HashSet<E>();
 
   /**
    * Creates a [Set] that contains all elements of [other].
    */
-  factory Set.from(Iterable<E> other) => new _HashSetImpl<E>.from(other);
+  factory Set.from(Iterable<E> other) => new HashSet<E>.from(other);
 
   /**
    * Returns true if [value] is in the set.
@@ -32,17 +32,7 @@
    * in the set. Returns false otherwise. The method has no effect
    * if [value] value was not in the set.
    */
-  bool remove(E value);
-
-  /**
-   * Adds all the elements of the given [iterable] to the set.
-   */
-  void addAll(Iterable<E> iterable);
-
-  /**
-   * Removes all the elements of the given collection from the set.
-   */
-  void removeAll(Iterable<E> iterable);
+  bool remove(Object value);
 
   /**
    * Returns true if [collection] contains all the elements of this
@@ -66,27 +56,22 @@
    * Removes all elements in the set.
    */
   void clear();
-
 }
 
-abstract class HashSet<E> extends Set<E> {
-  factory HashSet() => new _HashSetImpl<E>();
+
+class HashSet<E> extends Collection<E> implements Set<E> {
+  // The map backing this set. The associations in this map are all
+  // of the form element -> element. If a value is not in the map,
+  // then it is not in the set.
+  final _HashMapImpl<E, E> _backingMap;
+
+  HashSet() : _backingMap = new _HashMapImpl<E, E>();
 
   /**
    * Creates a [Set] that contains all elements of [other].
    */
-  factory HashSet.from(Iterable<E> other) => new _HashSetImpl<E>.from(other);
-}
-
-
-class _HashSetImpl<E> extends Iterable<E> implements HashSet<E> {
-
-  _HashSetImpl() {
-    _backingMap = new _HashMapImpl<E, E>();
-  }
-
-  factory _HashSetImpl.from(Iterable<E> other) {
-    Set<E> set = new _HashSetImpl<E>();
+  factory HashSet.from(Iterable<E> other) {
+    Set<E> set = new HashSet<E>();
     for (final e in other) {
       set.add(e);
     }
@@ -101,20 +86,14 @@
     _backingMap[value] = value;
   }
 
-  bool contains(E value) {
-    return _backingMap.containsKey(value);
-  }
-
-  bool remove(E value) {
+  bool remove(Object value) {
     if (!_backingMap.containsKey(value)) return false;
     _backingMap.remove(value);
     return true;
   }
 
-  void addAll(Iterable<E> iterable) {
-    for (E element in iterable) {
-      add(element);
-    }
+  bool contains(E value) {
+    return _backingMap.containsKey(value);
   }
 
   Set<E> intersection(Collection<E> collection) {
@@ -129,12 +108,6 @@
     return new Set<E>.from(other).containsAll(this);
   }
 
-  void removeAll(Iterable<E> iterable) {
-    for (E value in iterable) {
-      remove(value);
-    }
-  }
-
   bool containsAll(Collection<E> collection) {
     return collection.every((E value) {
       return contains(value);
@@ -160,16 +133,11 @@
   String toString() {
     return Collections.collectionToString(this);
   }
-
-  // The map backing this set. The associations in this map are all
-  // of the form element -> element. If a value is not in the map,
-  // then it is not in the set.
-  _HashMapImpl<E, E> _backingMap;
 }
 
 class _HashSetIterator<E> implements Iterator<E> {
 
-  _HashSetIterator(_HashSetImpl<E> set)
+  _HashSetIterator(HashSet<E> set)
     : _keysIterator = set._backingMap._keys.iterator;
 
   E get current {
diff --git a/sdk/lib/core/sink.dart b/sdk/lib/core/sink.dart
index ef1c2aa..d0dafc0 100644
--- a/sdk/lib/core/sink.dart
+++ b/sdk/lib/core/sink.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of dart.core;
 /**
  * An interface for an object that can receive a sequence of values.
  */
@@ -24,6 +25,14 @@
   final _CollectionSinkCallback<T> callback;
   bool _isClosed = false;
 
+  /**
+   * Create a sink that stores incoming values in a collection.
+   *
+   * The [collection] is the collection to add the values to.
+   *
+   * If [callback] is provided, then it's called with the collection as arugment
+   * when the sink's [close] method is called.
+   */
   CollectionSink(this.collection, [void callback(Collection<T> collection)])
       : this.callback = callback;
 
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 614cb9f..01a6bfe 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -2,6 +2,7 @@
 
 import 'dart:async';
 import 'dart:collection';
+import 'dart:collection-dev';
 import 'dart:html_common';
 import 'dart:indexed_db';
 import 'dart:isolate';
@@ -54,36 +55,39 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AbstractWorker; @docsEditable true
+
+@DocsEditable
+@DomName('AbstractWorker')
 class AbstractWorker extends EventTarget native "*AbstractWorker" {
 
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   AbstractWorkerEvents get on =>
     new AbstractWorkerEvents(this);
 
-  /// @domName AbstractWorker.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('AbstractWorker.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName AbstractWorker.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('AbstractWorker.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName AbstractWorker.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('AbstractWorker.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   Stream<Event> get onError => errorEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class AbstractWorkerEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   AbstractWorkerEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -91,65 +95,67 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLAnchorElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLAnchorElement')
 class AnchorElement extends Element native "*HTMLAnchorElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory AnchorElement({String href}) {
     var e = document.$dom_createElement("a");
     if (href != null) e.href = href;
     return e;
   }
 
-  /// @domName HTMLAnchorElement.download; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.download')
   String download;
 
-  /// @domName HTMLAnchorElement.hash; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.hash')
   String hash;
 
-  /// @domName HTMLAnchorElement.host; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.host')
   String host;
 
-  /// @domName HTMLAnchorElement.hostname; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.hostname')
   String hostname;
 
-  /// @domName HTMLAnchorElement.href; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.href')
   String href;
 
-  /// @domName HTMLAnchorElement.hreflang; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.hreflang')
   String hreflang;
 
-  /// @domName HTMLAnchorElement.name; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.name')
   String name;
 
-  /// @domName HTMLAnchorElement.origin; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.origin')
   final String origin;
 
-  /// @domName HTMLAnchorElement.pathname; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.pathname')
   String pathname;
 
-  /// @domName HTMLAnchorElement.ping; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.ping')
   String ping;
 
-  /// @domName HTMLAnchorElement.port; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.port')
   String port;
 
-  /// @domName HTMLAnchorElement.protocol; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.protocol')
   String protocol;
 
-  /// @domName HTMLAnchorElement.rel; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.rel')
   String rel;
 
-  /// @domName HTMLAnchorElement.search; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.search')
   String search;
 
-  /// @domName HTMLAnchorElement.target; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.target')
   String target;
 
-  /// @domName HTMLAnchorElement.type; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.type')
   String type;
 
-  /// @domName HTMLAnchorElement.toString; @docsEditable true
+  @DocsEditable @DomName('HTMLAnchorElement.toString')
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -157,13 +163,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitAnimationEvent; @docsEditable true
+
+@DocsEditable
+@DomName('WebKitAnimationEvent')
 class AnimationEvent extends Event native "*WebKitAnimationEvent" {
 
-  /// @domName WebKitAnimationEvent.animationName; @docsEditable true
+  @DocsEditable @DomName('WebKitAnimationEvent.animationName')
   final String animationName;
 
-  /// @domName WebKitAnimationEvent.elapsedTime; @docsEditable true
+  @DocsEditable @DomName('WebKitAnimationEvent.elapsedTime')
   final num elapsedTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -171,48 +179,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLAppletElement; @docsEditable true
-class AppletElement extends Element native "*HTMLAppletElement" {
 
-  /// @domName HTMLAppletElement.align; @docsEditable true
-  String align;
-
-  /// @domName HTMLAppletElement.alt; @docsEditable true
-  String alt;
-
-  /// @domName HTMLAppletElement.archive; @docsEditable true
-  String archive;
-
-  /// @domName HTMLAppletElement.code; @docsEditable true
-  String code;
-
-  /// @domName HTMLAppletElement.codeBase; @docsEditable true
-  String codeBase;
-
-  /// @domName HTMLAppletElement.height; @docsEditable true
-  String height;
-
-  /// @domName HTMLAppletElement.hspace; @docsEditable true
-  String hspace;
-
-  /// @domName HTMLAppletElement.name; @docsEditable true
-  String name;
-
-  /// @domName HTMLAppletElement.object; @docsEditable true
-  String object;
-
-  /// @domName HTMLAppletElement.vspace; @docsEditable true
-  String vspace;
-
-  /// @domName HTMLAppletElement.width; @docsEditable true
-  String width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName DOMApplicationCache; @docsEditable true
+@DocsEditable
+@DomName('DOMApplicationCache')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.FIREFOX)
+@SupportedBrowser(SupportedBrowser.IE, '10')
+@SupportedBrowser(SupportedBrowser.OPERA)
+@SupportedBrowser(SupportedBrowser.SAFARI)
 class ApplicationCache extends EventTarget native "*DOMApplicationCache" {
 
   static const EventStreamProvider<Event> cachedEvent = const EventStreamProvider<Event>('cached');
@@ -231,7 +205,11 @@
 
   static const EventStreamProvider<Event> updateReadyEvent = const EventStreamProvider<Event>('updateready');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  /// Checks if this type is supported on the current platform.
+  static bool get supported => JS('bool', '!!(window.applicationCache)');
+
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   ApplicationCacheEvents get on =>
     new ApplicationCacheEvents(this);
 
@@ -247,28 +225,28 @@
 
   static const int UPDATEREADY = 4;
 
-  /// @domName DOMApplicationCache.status; @docsEditable true
+  @DocsEditable @DomName('DOMApplicationCache.status')
   final int status;
 
-  /// @domName DOMApplicationCache.abort; @docsEditable true
+  @DocsEditable @DomName('DOMApplicationCache.abort')
   void abort() native;
 
-  /// @domName DOMApplicationCache.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('DOMApplicationCache.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName DOMApplicationCache.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('DOMApplicationCache.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName DOMApplicationCache.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('DOMApplicationCache.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName DOMApplicationCache.swapCache; @docsEditable true
+  @DocsEditable @DomName('DOMApplicationCache.swapCache')
   void swapCache() native;
 
-  /// @domName DOMApplicationCache.update; @docsEditable true
+  @DocsEditable @DomName('DOMApplicationCache.update')
   void update() native;
 
   Stream<Event> get onCached => cachedEvent.forTarget(this);
@@ -288,33 +266,33 @@
   Stream<Event> get onUpdateReady => updateReadyEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class ApplicationCacheEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   ApplicationCacheEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get cached => this['cached'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get checking => this['checking'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get downloading => this['downloading'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get noUpdate => this['noupdate'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get obsolete => this['obsolete'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get progress => this['progress'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get updateReady => this['updateready'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -322,49 +300,51 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLAreaElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLAreaElement')
 class AreaElement extends Element native "*HTMLAreaElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory AreaElement() => document.$dom_createElement("area");
 
-  /// @domName HTMLAreaElement.alt; @docsEditable true
+  @DocsEditable @DomName('HTMLAreaElement.alt')
   String alt;
 
-  /// @domName HTMLAreaElement.coords; @docsEditable true
+  @DocsEditable @DomName('HTMLAreaElement.coords')
   String coords;
 
-  /// @domName HTMLAreaElement.hash; @docsEditable true
+  @DocsEditable @DomName('HTMLAreaElement.hash')
   final String hash;
 
-  /// @domName HTMLAreaElement.host; @docsEditable true
+  @DocsEditable @DomName('HTMLAreaElement.host')
   final String host;
 
-  /// @domName HTMLAreaElement.hostname; @docsEditable true
+  @DocsEditable @DomName('HTMLAreaElement.hostname')
   final String hostname;
 
-  /// @domName HTMLAreaElement.href; @docsEditable true
+  @DocsEditable @DomName('HTMLAreaElement.href')
   String href;
 
-  /// @domName HTMLAreaElement.pathname; @docsEditable true
+  @DocsEditable @DomName('HTMLAreaElement.pathname')
   final String pathname;
 
-  /// @domName HTMLAreaElement.ping; @docsEditable true
+  @DocsEditable @DomName('HTMLAreaElement.ping')
   String ping;
 
-  /// @domName HTMLAreaElement.port; @docsEditable true
+  @DocsEditable @DomName('HTMLAreaElement.port')
   final String port;
 
-  /// @domName HTMLAreaElement.protocol; @docsEditable true
+  @DocsEditable @DomName('HTMLAreaElement.protocol')
   final String protocol;
 
-  /// @domName HTMLAreaElement.search; @docsEditable true
+  @DocsEditable @DomName('HTMLAreaElement.search')
   final String search;
 
-  /// @domName HTMLAreaElement.shape; @docsEditable true
+  @DocsEditable @DomName('HTMLAreaElement.shape')
   String shape;
 
-  /// @domName HTMLAreaElement.target; @docsEditable true
+  @DocsEditable @DomName('HTMLAreaElement.target')
   String target;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -372,24 +352,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ArrayBuffer
+@DocsEditable
+@DomName('ArrayBuffer')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
 class ArrayBuffer native "*ArrayBuffer" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory ArrayBuffer(int length) => ArrayBuffer._create(length);
   static ArrayBuffer _create(int length) => JS('ArrayBuffer', 'new ArrayBuffer(#)', length);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', 'typeof window.ArrayBuffer != "undefined"');
 
-  /// @domName ArrayBuffer.byteLength; @docsEditable true
+  @DocsEditable @DomName('ArrayBuffer.byteLength')
   final int byteLength;
 
-  /// @domName ArrayBuffer.slice;
+  @DomName('ArrayBuffer.slice')
   ArrayBuffer slice(int begin, [int end]) {
     // IE10 supports ArrayBuffers but does not have the slice method.
     if (JS('bool', '!!#.slice', this)) {
@@ -423,20 +404,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ArrayBufferView; @docsEditable true
+
+@DocsEditable
+@DomName('ArrayBufferView')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
 class ArrayBufferView native "*ArrayBufferView" {
 
-  /// @domName ArrayBufferView.buffer; @docsEditable true
+  @DocsEditable @DomName('ArrayBufferView.buffer')
   final ArrayBuffer buffer;
 
-  /// @domName ArrayBufferView.byteLength; @docsEditable true
+  @DocsEditable @DomName('ArrayBufferView.byteLength')
   final int byteLength;
 
-  /// @domName ArrayBufferView.byteOffset; @docsEditable true
+  @DocsEditable @DomName('ArrayBufferView.byteOffset')
   final int byteOffset;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -444,33 +427,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Attr; @docsEditable true
+
+@DocsEditable
+@DomName('Attr')
 class Attr extends Node native "*Attr" {
-
-  /// @domName Attr.isId; @docsEditable true
-  final bool isId;
-
-  /// @domName Attr.name; @docsEditable true
-  final String name;
-
-  /// @domName Attr.ownerElement; @docsEditable true
-  final Element ownerElement;
-
-  /// @domName Attr.specified; @docsEditable true
-  final bool specified;
-
-  /// @domName Attr.value; @docsEditable true
-  String value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLAudioElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLAudioElement')
 class AudioElement extends MediaElement native "*HTMLAudioElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory AudioElement([String src]) {
     if (!?src) {
       return AudioElement._create();
@@ -489,10 +461,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLBRElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLBRElement')
 class BRElement extends Element native "*HTMLBRElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory BRElement() => document.$dom_createElement("br");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -500,10 +474,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName BarInfo; @docsEditable true
+
+@DocsEditable
+@DomName('BarInfo')
 class BarInfo native "*BarInfo" {
 
-  /// @domName BarInfo.visible; @docsEditable true
+  @DocsEditable @DomName('BarInfo.visible')
   final bool visible;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -511,16 +487,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLBaseElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLBaseElement')
 class BaseElement extends Element native "*HTMLBaseElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory BaseElement() => document.$dom_createElement("base");
 
-  /// @domName HTMLBaseElement.href; @docsEditable true
+  @DocsEditable @DomName('HTMLBaseElement.href')
   String href;
 
-  /// @domName HTMLBaseElement.target; @docsEditable true
+  @DocsEditable @DomName('HTMLBaseElement.target')
   String target;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -528,24 +506,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLBaseFontElement; @docsEditable true
-class BaseFontElement extends Element native "*HTMLBaseFontElement" {
 
-  /// @domName HTMLBaseFontElement.color; @docsEditable true
-  String color;
-
-  /// @domName HTMLBaseFontElement.face; @docsEditable true
-  String face;
-
-  /// @domName HTMLBaseFontElement.size; @docsEditable true
-  int size;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName BatteryManager; @docsEditable true
+@DocsEditable
+@DomName('BatteryManager')
 class BatteryManager extends EventTarget native "*BatteryManager" {
 
   static const EventStreamProvider<Event> chargingChangeEvent = const EventStreamProvider<Event>('chargingchange');
@@ -556,32 +519,33 @@
 
   static const EventStreamProvider<Event> levelChangeEvent = const EventStreamProvider<Event>('levelchange');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   BatteryManagerEvents get on =>
     new BatteryManagerEvents(this);
 
-  /// @domName BatteryManager.charging; @docsEditable true
+  @DocsEditable @DomName('BatteryManager.charging')
   final bool charging;
 
-  /// @domName BatteryManager.chargingTime; @docsEditable true
+  @DocsEditable @DomName('BatteryManager.chargingTime')
   final num chargingTime;
 
-  /// @domName BatteryManager.dischargingTime; @docsEditable true
+  @DocsEditable @DomName('BatteryManager.dischargingTime')
   final num dischargingTime;
 
-  /// @domName BatteryManager.level; @docsEditable true
+  @DocsEditable @DomName('BatteryManager.level')
   final num level;
 
-  /// @domName BatteryManager.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('BatteryManager.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName BatteryManager.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('BatteryManager.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native;
 
-  /// @domName BatteryManager.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('BatteryManager.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   Stream<Event> get onChargingChange => chargingChangeEvent.forTarget(this);
@@ -593,21 +557,21 @@
   Stream<Event> get onLevelChange => levelChangeEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class BatteryManagerEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   BatteryManagerEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get chargingChange => this['chargingchange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get chargingTimeChange => this['chargingtimechange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dischargingTimeChange => this['dischargingtimechange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get levelChange => this['levelchange'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -615,10 +579,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName BeforeLoadEvent; @docsEditable true
+
+@DocsEditable
+@DomName('BeforeLoadEvent')
 class BeforeLoadEvent extends Event native "*BeforeLoadEvent" {
 
-  /// @domName BeforeLoadEvent.url; @docsEditable true
+  @DocsEditable @DomName('BeforeLoadEvent.url')
   final String url;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -626,10 +592,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Blob
+@DocsEditable
+@DomName('Blob')
 class Blob native "*Blob" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory Blob(List blobParts, [String type, String endings]) {
     if (!?type) {
       return Blob._create(blobParts);
@@ -640,13 +607,13 @@
     return Blob._create(blobParts, type, endings);
   }
 
-  /// @domName Blob.size; @docsEditable true
+  @DocsEditable @DomName('Blob.size')
   final int size;
 
-  /// @domName Blob.type; @docsEditable true
+  @DocsEditable @DomName('Blob.type')
   final String type;
 
-  /// @domName Blob.slice; @docsEditable true
+  @DocsEditable @DomName('Blob.slice')
   Blob slice([int start, int end, String contentType]) native;
 
   static Blob _create([List blobParts = null, String type, String endings]) {
@@ -674,7 +641,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLBodyElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLBodyElement')
 class BodyElement extends Element native "*HTMLBodyElement" {
 
   static const EventStreamProvider<Event> beforeUnloadEvent = const EventStreamProvider<Event>('beforeunload');
@@ -703,16 +672,14 @@
 
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
 
-  ///@docsEditable true
+  @DocsEditable
   factory BodyElement() => document.$dom_createElement("body");
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   BodyElementEvents get on =>
     new BodyElementEvents(this);
 
-  /// @domName HTMLBodyElement.vLink; @docsEditable true
-  String vLink;
-
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
   Stream<Event> get onBlur => blurEvent.forTarget(this);
@@ -740,48 +707,48 @@
   Stream<Event> get onUnload => unloadEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class BodyElementEvents extends ElementEvents {
-  /// @docsEditable true
+  @DocsEditable
   BodyElementEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get beforeUnload => this['beforeunload'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get blur => this['blur'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get focus => this['focus'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get hashChange => this['hashchange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get load => this['load'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get message => this['message'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get offline => this['offline'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get online => this['online'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get popState => this['popstate'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get resize => this['resize'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get storage => this['storage'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get unload => this['unload'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -789,62 +756,64 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLButtonElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLButtonElement')
 class ButtonElement extends Element native "*HTMLButtonElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory ButtonElement() => document.$dom_createElement("button");
 
-  /// @domName HTMLButtonElement.autofocus; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.autofocus')
   bool autofocus;
 
-  /// @domName HTMLButtonElement.disabled; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.disabled')
   bool disabled;
 
-  /// @domName HTMLButtonElement.form; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.form')
   final FormElement form;
 
-  /// @domName HTMLButtonElement.formAction; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.formAction')
   String formAction;
 
-  /// @domName HTMLButtonElement.formEnctype; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.formEnctype')
   String formEnctype;
 
-  /// @domName HTMLButtonElement.formMethod; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.formMethod')
   String formMethod;
 
-  /// @domName HTMLButtonElement.formNoValidate; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.formNoValidate')
   bool formNoValidate;
 
-  /// @domName HTMLButtonElement.formTarget; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.formTarget')
   String formTarget;
 
-  /// @domName HTMLButtonElement.labels; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.labels')
   @Returns('NodeList') @Creates('NodeList')
   final List<Node> labels;
 
-  /// @domName HTMLButtonElement.name; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.name')
   String name;
 
-  /// @domName HTMLButtonElement.type; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.type')
   String type;
 
-  /// @domName HTMLButtonElement.validationMessage; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.validationMessage')
   final String validationMessage;
 
-  /// @domName HTMLButtonElement.validity; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.validity')
   final ValidityState validity;
 
-  /// @domName HTMLButtonElement.value; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.value')
   String value;
 
-  /// @domName HTMLButtonElement.willValidate; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.willValidate')
   final bool willValidate;
 
-  /// @domName HTMLButtonElement.checkValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.checkValidity')
   bool checkValidity() native;
 
-  /// @domName HTMLButtonElement.setCustomValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLButtonElement.setCustomValidity')
   void setCustomValidity(String error) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -852,7 +821,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CDATASection; @docsEditable true
+
+@DocsEditable
+@DomName('CDATASection')
 class CDataSection extends Text native "*CDATASection" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -860,10 +831,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLCanvasElement
+@DocsEditable
+@DomName('HTMLCanvasElement')
 class CanvasElement extends Element native "*HTMLCanvasElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory CanvasElement({int width, int height}) {
     var e = document.$dom_createElement("canvas");
     if (width != null) e.width = width;
@@ -871,56 +843,14 @@
     return e;
   }
 
-  /// The height of this canvas element in CSS pixels.
-  /// @domName HTMLCanvasElement.height; @docsEditable true
+  @DocsEditable @DomName('HTMLCanvasElement.height')
   int height;
 
-  /// The width of this canvas element in CSS pixels.
-  /// @domName HTMLCanvasElement.width; @docsEditable true
+  @DocsEditable @DomName('HTMLCanvasElement.width')
   int width;
 
-  /**
-   * Returns a data URI containing a representation of the image in the
-   * format specified by type (defaults to 'image/png').
-   *
-   * Data Uri format is as follow `data:[<MIME-type>][;charset=<encoding>][;base64],<data>`
-   *
-   * Optional parameter [quality] in the range of 0.0 and 1.0 can be used when requesting [type]
-   * 'image/jpeg' or 'image/webp'. If [quality] is not passed the default
-   * value is used. Note: the default value varies by browser.
-   *
-   * If the height or width of this canvas element is 0, then 'data:' is returned,
-   * representing no data.
-   *
-   * If the type requested is not 'image/png', and the returned value is
-   * 'data:image/png', then the requested type is not supported.
-   *
-   * Example usage:
-   *
-   *     CanvasElement canvas = new CanvasElement();
-   *     var ctx = canvas.context2d
-   *     ..fillStyle = "rgb(200,0,0)"
-   *     ..fillRect(10, 10, 55, 50);
-   *     var dataUrl = canvas.toDataURL("image/jpeg", 0.95);
-   *     // The Data Uri would look similar to
-   *     // 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
-   *     // AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
-   *     // 9TXL0Y4OHwAAAABJRU5ErkJggg=='
-   *     //Create a new image element from the data URI.
-   *     var img = new ImageElement();
-   *     img.src = dataUrl;
-   *     document.body.children.add(img);
-   *
-   * See also:
-   *
-   * * [Data URI Scheme](http://en.wikipedia.org/wiki/Data_URI_scheme) from Wikipedia.
-   *
-   * * [HTMLCanvasElement](https://developer.mozilla.org/en-US/docs/DOM/HTMLCanvasElement) from MDN.
-   *
-   * * [toDataUrl](http://dev.w3.org/html5/spec/the-canvas-element.html#dom-canvas-todataurl) from W3C.
-   */
-  /// @domName HTMLCanvasElement.toDataURL; @docsEditable true
   @JSName('toDataURL')
+  @DocsEditable @DomName('HTMLCanvasElement.toDataURL')
   String toDataUrl(String type, [num quality]) native;
 
 
@@ -932,48 +862,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/**
- * An opaque canvas object representing a gradient.
- *
- * Created by calling [createLinearGradient] or [createRadialGradient] on a
- * [CanvasRenderingContext2D] object.
- *
- * Example usage:
- *
- *     var canvas = new CanvasElement(width: 600, height: 600);
- *     var ctx = canvas.context2d;
- *     ctx.clearRect(0, 0, 600, 600);
- *     ctx.save();
- *     // Create radial gradient.
- *     CanvasGradient gradient = ctx.createRadialGradient(0, 0, 0, 0, 0, 600);
- *     gradient.addColorStop(0, '#000');
- *     gradient.addColorStop(1, 'rgb(255, 255, 255)');
- *     // Assign gradients to fill.
- *     ctx.fillStyle = gradient;
- *     // Draw a rectangle with a gradient fill.
- *     ctx.fillRect(0, 0, 600, 600);
- *     ctx.save();
- *     document.body.children.add(canvas);
- *
- * See also:
- *
- * * [CanvasGradient](https://developer.mozilla.org/en-US/docs/DOM/CanvasGradient) from MDN.
- * * [CanvasGradient](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#canvasgradient) from whatwg.
- * * [CanvasGradient](http://www.w3.org/TR/2010/WD-2dcontext-20100304/#canvasgradient) from W3C.
- */
-/// @domName CanvasGradient; @docsEditable true
+
+@DocsEditable
+@DomName('CanvasGradient')
 class CanvasGradient native "*CanvasGradient" {
 
-  /**
-   * Adds a color stop to this gradient at the offset.
-   *
-   * The [offset] can range between 0.0 and 1.0.
-   *
-   * See also:
-   *
-   * * [Multiple Color Stops](https://developer.mozilla.org/en-US/docs/CSS/linear-gradient#Gradient_with_multiple_color_stops) from MDN.
-   */
-  /// @domName CanvasGradient.addColorStop; @docsEditable true
+  @DocsEditable @DomName('CanvasGradient.addColorStop')
   void addColorStop(num offset, String color) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -981,34 +875,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/**
- * An opaque object representing a pattern of image, canvas, or video.
- *
- * Created by calling [createPattern] on a [CanvasRenderingContext2D] object.
- *
- * Example usage:
- *
- *     var canvas = new CanvasElement(width: 600, height: 600);
- *     var ctx = canvas.context2d;
- *     var img = new ImageElement();
- *     // Image src needs to be loaded before pattern is applied.
- *     img.on.load.add((event) {
- *       // When the image is loaded, create a pattern
- *       // from the ImageElement.
- *       CanvasPattern pattern = ctx.createPattern(img, 'repeat');
- *       ctx.rect(0, 0, canvas.width, canvas.height);
- *       ctx.fillStyle = pattern;
- *       ctx.fill();
- *     });
- *     img.src = "images/foo.jpg";
- *     document.body.children.add(canvas);
- *
- * See also:
- * * [CanvasPattern](https://developer.mozilla.org/en-US/docs/DOM/CanvasPattern) from MDN.
- * * [CanvasPattern](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#canvaspattern) from whatwg.
- * * [CanvasPattern](http://www.w3.org/TR/2010/WD-2dcontext-20100304/#canvaspattern) from W3C.
- */
-/// @domName CanvasPattern; @docsEditable true
+
+@DocsEditable
+@DomName('CanvasPattern')
 class CanvasPattern native "*CanvasPattern" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1016,17 +885,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/**
- * A rendering context for a canvas element.
- *
- * This context is extended by [CanvasRenderingContext2D] and
- * [WebGLRenderingContext].
- */
-/// @domName CanvasRenderingContext; @docsEditable true
+
+@DocsEditable
+@DomName('CanvasRenderingContext')
 class CanvasRenderingContext native "*CanvasRenderingContext" {
 
-  /// Reference to the canvas element to which this context belongs.
-  /// @domName CanvasRenderingContext.canvas; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext.canvas')
   final CanvasElement canvas;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1034,93 +898,91 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CanvasRenderingContext2D
+@DocsEditable
+@DomName('CanvasRenderingContext2D')
 class CanvasRenderingContext2D extends CanvasRenderingContext native "*CanvasRenderingContext2D" {
 
-  /// @domName CanvasRenderingContext2D.fillStyle; @docsEditable true
-  @Creates('String|CanvasGradient|CanvasPattern') @Returns('String|CanvasGradient|CanvasPattern')
+  @DocsEditable @DomName('CanvasRenderingContext2D.fillStyle') @Creates('String|CanvasGradient|CanvasPattern') @Returns('String|CanvasGradient|CanvasPattern')
   dynamic fillStyle;
 
-  /// @domName CanvasRenderingContext2D.font; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.font')
   String font;
 
-  /// @domName CanvasRenderingContext2D.globalAlpha; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.globalAlpha')
   num globalAlpha;
 
-  /// @domName CanvasRenderingContext2D.globalCompositeOperation; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.globalCompositeOperation')
   String globalCompositeOperation;
 
-  /// @domName CanvasRenderingContext2D.lineCap; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.lineCap')
   String lineCap;
 
-  /// @domName CanvasRenderingContext2D.lineDashOffset; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.lineDashOffset')
   num lineDashOffset;
 
-  /// @domName CanvasRenderingContext2D.lineJoin; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.lineJoin')
   String lineJoin;
 
-  /// @domName CanvasRenderingContext2D.lineWidth; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.lineWidth')
   num lineWidth;
 
-  /// @domName CanvasRenderingContext2D.miterLimit; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.miterLimit')
   num miterLimit;
 
-  /// @domName CanvasRenderingContext2D.shadowBlur; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.shadowBlur')
   num shadowBlur;
 
-  /// @domName CanvasRenderingContext2D.shadowColor; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.shadowColor')
   String shadowColor;
 
-  /// @domName CanvasRenderingContext2D.shadowOffsetX; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.shadowOffsetX')
   num shadowOffsetX;
 
-  /// @domName CanvasRenderingContext2D.shadowOffsetY; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.shadowOffsetY')
   num shadowOffsetY;
 
-  /// @domName CanvasRenderingContext2D.strokeStyle; @docsEditable true
-  @Creates('String|CanvasGradient|CanvasPattern') @Returns('String|CanvasGradient|CanvasPattern')
+  @DocsEditable @DomName('CanvasRenderingContext2D.strokeStyle') @Creates('String|CanvasGradient|CanvasPattern') @Returns('String|CanvasGradient|CanvasPattern')
   dynamic strokeStyle;
 
-  /// @domName CanvasRenderingContext2D.textAlign; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.textAlign')
   String textAlign;
 
-  /// @domName CanvasRenderingContext2D.textBaseline; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.textBaseline')
   String textBaseline;
 
-  /// @domName CanvasRenderingContext2D.webkitBackingStorePixelRatio; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.webkitBackingStorePixelRatio')
   final num webkitBackingStorePixelRatio;
 
-  /// @domName CanvasRenderingContext2D.webkitImageSmoothingEnabled; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.webkitImageSmoothingEnabled')
   bool webkitImageSmoothingEnabled;
 
-  /// @domName CanvasRenderingContext2D.webkitLineDash; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.webkitLineDash')
   List webkitLineDash;
 
-  /// @domName CanvasRenderingContext2D.webkitLineDashOffset; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.webkitLineDashOffset')
   num webkitLineDashOffset;
 
-  /// @domName CanvasRenderingContext2D.arc; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.arc')
   void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native;
 
-  /// @domName CanvasRenderingContext2D.arcTo; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.arcTo')
   void arcTo(num x1, num y1, num x2, num y2, num radius) native;
 
-  /// @domName CanvasRenderingContext2D.beginPath; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.beginPath')
   void beginPath() native;
 
-  /// @domName CanvasRenderingContext2D.bezierCurveTo; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.bezierCurveTo')
   void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native;
 
-  /// @domName CanvasRenderingContext2D.clearRect; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.clearRect')
   void clearRect(num x, num y, num width, num height) native;
 
-  /// @domName CanvasRenderingContext2D.clip; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.clip')
   void clip() native;
 
-  /// @domName CanvasRenderingContext2D.closePath; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.closePath')
   void closePath() native;
 
-  /// @domName CanvasRenderingContext2D.createImageData; @docsEditable true
   ImageData createImageData(imagedata_OR_sw, [num sh]) {
     if ((imagedata_OR_sw is ImageData || imagedata_OR_sw == null) &&
         !?sh) {
@@ -1133,57 +995,55 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('createImageData')
-  @Creates('ImageData|=Object')
+  @DocsEditable @DomName('CanvasRenderingContext2D.createImageData') @Creates('ImageData|=Object')
   _createImageData_1(imagedata) native;
   @JSName('createImageData')
-  @Creates('ImageData|=Object')
+  @DocsEditable @DomName('CanvasRenderingContext2D.createImageData') @Creates('ImageData|=Object')
   _createImageData_2(num sw, sh) native;
 
-  /// @domName CanvasRenderingContext2D.createLinearGradient; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.createLinearGradient')
   CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native;
 
-  /// @domName CanvasRenderingContext2D.createPattern; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.createPattern')
   CanvasPattern createPattern(canvas_OR_image, String repetitionType) native;
 
-  /// @domName CanvasRenderingContext2D.createRadialGradient; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.createRadialGradient')
   CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) native;
 
-  /// @domName CanvasRenderingContext2D.drawImage; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.drawImage')
   void drawImage(canvas_OR_image_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) native;
 
-  /// @domName CanvasRenderingContext2D.fill; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.fill')
   void fill() native;
 
-  /// @domName CanvasRenderingContext2D.fillRect; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.fillRect')
   void fillRect(num x, num y, num width, num height) native;
 
-  /// @domName CanvasRenderingContext2D.fillText; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.fillText')
   void fillText(String text, num x, num y, [num maxWidth]) native;
 
-  /// @domName CanvasRenderingContext2D.getImageData; @docsEditable true
   ImageData getImageData(num sx, num sy, num sw, num sh) {
     return _convertNativeToDart_ImageData(_getImageData_1(sx, sy, sw, sh));
   }
   @JSName('getImageData')
-  @Creates('ImageData|=Object')
+  @DocsEditable @DomName('CanvasRenderingContext2D.getImageData') @Creates('ImageData|=Object')
   _getImageData_1(sx, sy, sw, sh) native;
 
-  /// @domName CanvasRenderingContext2D.getLineDash; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.getLineDash')
   List<num> getLineDash() native;
 
-  /// @domName CanvasRenderingContext2D.isPointInPath; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.isPointInPath')
   bool isPointInPath(num x, num y) native;
 
-  /// @domName CanvasRenderingContext2D.lineTo; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.lineTo')
   void lineTo(num x, num y) native;
 
-  /// @domName CanvasRenderingContext2D.measureText; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.measureText')
   TextMetrics measureText(String text) native;
 
-  /// @domName CanvasRenderingContext2D.moveTo; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.moveTo')
   void moveTo(num x, num y) native;
 
-  /// @domName CanvasRenderingContext2D.putImageData; @docsEditable true
   void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
     if (!?dirtyX &&
         !?dirtyY &&
@@ -1199,58 +1059,58 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('putImageData')
+  @DocsEditable @DomName('CanvasRenderingContext2D.putImageData')
   void _putImageData_1(imagedata, dx, dy) native;
   @JSName('putImageData')
+  @DocsEditable @DomName('CanvasRenderingContext2D.putImageData')
   void _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native;
 
-  /// @domName CanvasRenderingContext2D.quadraticCurveTo; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.quadraticCurveTo')
   void quadraticCurveTo(num cpx, num cpy, num x, num y) native;
 
-  /// @domName CanvasRenderingContext2D.rect; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.rect')
   void rect(num x, num y, num width, num height) native;
 
-  /// @domName CanvasRenderingContext2D.restore; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.restore')
   void restore() native;
 
-  /// @domName CanvasRenderingContext2D.rotate; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.rotate')
   void rotate(num angle) native;
 
-  /// @domName CanvasRenderingContext2D.save; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.save')
   void save() native;
 
-  /// @domName CanvasRenderingContext2D.scale; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.scale')
   void scale(num sx, num sy) native;
 
-  /// @domName CanvasRenderingContext2D.setLineDash; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.setLineDash')
   void setLineDash(List<num> dash) native;
 
-  /// @domName CanvasRenderingContext2D.setTransform; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.setTransform')
   void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) native;
 
-  /// @domName CanvasRenderingContext2D.stroke; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.stroke')
   void stroke() native;
 
-  /// @domName CanvasRenderingContext2D.strokeRect; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.strokeRect')
   void strokeRect(num x, num y, num width, num height, [num lineWidth]) native;
 
-  /// @domName CanvasRenderingContext2D.strokeText; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.strokeText')
   void strokeText(String text, num x, num y, [num maxWidth]) native;
 
-  /// @domName CanvasRenderingContext2D.transform; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.transform')
   void transform(num m11, num m12, num m21, num m22, num dx, num dy) native;
 
-  /// @domName CanvasRenderingContext2D.translate; @docsEditable true
+  @DocsEditable @DomName('CanvasRenderingContext2D.translate')
   void translate(num tx, num ty) native;
 
-  /// @domName CanvasRenderingContext2D.webkitGetImageDataHD; @docsEditable true
   ImageData webkitGetImageDataHD(num sx, num sy, num sw, num sh) {
     return _convertNativeToDart_ImageData(_webkitGetImageDataHD_1(sx, sy, sw, sh));
   }
   @JSName('webkitGetImageDataHD')
-  @Creates('ImageData|=Object')
+  @DocsEditable @DomName('CanvasRenderingContext2D.webkitGetImageDataHD') @Creates('ImageData|=Object')
   _webkitGetImageDataHD_1(sx, sy, sw, sh) native;
 
-  /// @domName CanvasRenderingContext2D.webkitPutImageDataHD; @docsEditable true
   void webkitPutImageDataHD(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
     if (!?dirtyX &&
         !?dirtyY &&
@@ -1266,8 +1126,10 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('webkitPutImageDataHD')
+  @DocsEditable @DomName('CanvasRenderingContext2D.webkitPutImageDataHD')
   void _webkitPutImageDataHD_1(imagedata, dx, dy) native;
   @JSName('webkitPutImageDataHD')
+  @DocsEditable @DomName('CanvasRenderingContext2D.webkitPutImageDataHD')
   void _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native;
 
 
@@ -1312,31 +1174,33 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CharacterData; @docsEditable true
+
+@DocsEditable
+@DomName('CharacterData')
 class CharacterData extends Node native "*CharacterData" {
 
-  /// @domName CharacterData.data; @docsEditable true
+  @DocsEditable @DomName('CharacterData.data')
   String data;
 
-  /// @domName CharacterData.length; @docsEditable true
+  @DocsEditable @DomName('CharacterData.length')
   final int length;
 
-  /// @domName CharacterData.appendData; @docsEditable true
+  @DocsEditable @DomName('CharacterData.appendData')
   void appendData(String data) native;
 
-  /// @domName CharacterData.deleteData; @docsEditable true
+  @DocsEditable @DomName('CharacterData.deleteData')
   void deleteData(int offset, int length) native;
 
-  /// @domName CharacterData.insertData; @docsEditable true
+  @DocsEditable @DomName('CharacterData.insertData')
   void insertData(int offset, String data) native;
 
-  /// @domName CharacterData.remove; @docsEditable true
+  @DocsEditable @DomName('CharacterData.remove')
   void remove() native;
 
-  /// @domName CharacterData.replaceData; @docsEditable true
+  @DocsEditable @DomName('CharacterData.replaceData')
   void replaceData(int offset, int length, String data) native;
 
-  /// @domName CharacterData.substringData; @docsEditable true
+  @DocsEditable @DomName('CharacterData.substringData')
   String substringData(int offset, int length) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1344,25 +1208,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ClientRect; @docsEditable true
+
+@DocsEditable
+@DomName('ClientRect')
 class ClientRect native "*ClientRect" {
 
-  /// @domName ClientRect.bottom; @docsEditable true
+  @DocsEditable @DomName('ClientRect.bottom')
   final num bottom;
 
-  /// @domName ClientRect.height; @docsEditable true
+  @DocsEditable @DomName('ClientRect.height')
   final num height;
 
-  /// @domName ClientRect.left; @docsEditable true
+  @DocsEditable @DomName('ClientRect.left')
   final num left;
 
-  /// @domName ClientRect.right; @docsEditable true
+  @DocsEditable @DomName('ClientRect.right')
   final num right;
 
-  /// @domName ClientRect.top; @docsEditable true
+  @DocsEditable @DomName('ClientRect.top')
   final num top;
 
-  /// @domName ClientRect.width; @docsEditable true
+  @DocsEditable @DomName('ClientRect.width')
   final num width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1370,35 +1236,37 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Clipboard; @docsEditable true
+
+@DocsEditable
+@DomName('Clipboard')
 class Clipboard native "*Clipboard" {
 
-  /// @domName Clipboard.dropEffect; @docsEditable true
+  @DocsEditable @DomName('Clipboard.dropEffect')
   String dropEffect;
 
-  /// @domName Clipboard.effectAllowed; @docsEditable true
+  @DocsEditable @DomName('Clipboard.effectAllowed')
   String effectAllowed;
 
-  /// @domName Clipboard.files; @docsEditable true
+  @DocsEditable @DomName('Clipboard.files')
   @Returns('FileList') @Creates('FileList')
   final List<File> files;
 
-  /// @domName Clipboard.items; @docsEditable true
+  @DocsEditable @DomName('Clipboard.items')
   final DataTransferItemList items;
 
-  /// @domName Clipboard.types; @docsEditable true
+  @DocsEditable @DomName('Clipboard.types')
   final List types;
 
-  /// @domName Clipboard.clearData; @docsEditable true
+  @DocsEditable @DomName('Clipboard.clearData')
   void clearData([String type]) native;
 
-  /// @domName Clipboard.getData; @docsEditable true
+  @DocsEditable @DomName('Clipboard.getData')
   String getData(String type) native;
 
-  /// @domName Clipboard.setData; @docsEditable true
+  @DocsEditable @DomName('Clipboard.setData')
   bool setData(String type, String data) native;
 
-  /// @domName Clipboard.setDragImage; @docsEditable true
+  @DocsEditable @DomName('Clipboard.setDragImage')
   void setDragImage(ImageElement image, int x, int y) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1406,16 +1274,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CloseEvent; @docsEditable true
+
+@DocsEditable
+@DomName('CloseEvent')
 class CloseEvent extends Event native "*CloseEvent" {
 
-  /// @domName CloseEvent.code; @docsEditable true
+  @DocsEditable @DomName('CloseEvent.code')
   final int code;
 
-  /// @domName CloseEvent.reason; @docsEditable true
+  @DocsEditable @DomName('CloseEvent.reason')
   final String reason;
 
-  /// @domName CloseEvent.wasClean; @docsEditable true
+  @DocsEditable @DomName('CloseEvent.wasClean')
   final bool wasClean;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1423,7 +1293,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Comment; @docsEditable true
+
+@DocsEditable
+@DomName('Comment')
 class Comment extends CharacterData native "*Comment" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1431,13 +1303,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CompositionEvent; @docsEditable true
+
+@DocsEditable
+@DomName('CompositionEvent')
 class CompositionEvent extends UIEvent native "*CompositionEvent" {
 
-  /// @domName CompositionEvent.data; @docsEditable true
+  @DocsEditable @DomName('CompositionEvent.data')
   final String data;
 
-  /// @domName CompositionEvent.initCompositionEvent; @docsEditable true
+  @DocsEditable @DomName('CompositionEvent.initCompositionEvent')
   void initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1445,98 +1319,99 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Console
+@DocsEditable
+@DomName('Console')
 class Console {
 
   static Console safeConsole = new Console();
 
   bool get _isConsoleDefined => JS('bool', "typeof console != 'undefined'");
 
-  /// @domName Console.memory; @docsEditable true
+  @DomName('Console.memory')
   MemoryInfo get memory => _isConsoleDefined ?
       JS('MemoryInfo', 'console.memory') : null;
 
-  /// @domName Console.profiles; @docsEditable true
+  @DomName('Console.profiles')
   List<ScriptProfile> get profiles => _isConsoleDefined ?
       JS('List<ScriptProfile>', 'console.profiles') : null;
 
-  /// @domName Console.assertCondition; @docsEditable true
+  @DomName('Console.assertCondition')
   void assertCondition(bool condition, Object arg) => _isConsoleDefined ?
       JS('void', 'console.assertCondition(#, #)', condition, arg) : null;
 
-  /// @domName Console.count; @docsEditable true
+  @DomName('Console.count')
   void count(Object arg) => _isConsoleDefined ?
       JS('void', 'console.count(#)', arg) : null;
 
-  /// @domName Console.debug; @docsEditable true
+  @DomName('Console.debug')
   void debug(Object arg) => _isConsoleDefined ?
       JS('void', 'console.debug(#)', arg) : null;
 
-  /// @domName Console.dir; @docsEditable true
+  @DomName('Console.dir')
   void dir(Object arg) => _isConsoleDefined ?
       JS('void', 'console.debug(#)', arg) : null;
 
-  /// @domName Console.dirxml; @docsEditable true
+  @DomName('Console.dirxml')
   void dirxml(Object arg) => _isConsoleDefined ?
       JS('void', 'console.dirxml(#)', arg) : null;
 
-  /// @domName Console.error; @docsEditable true
+  @DomName('Console.error')
   void error(Object arg) => _isConsoleDefined ?
       JS('void', 'console.error(#)', arg) : null;
 
-  /// @domName Console.group; @docsEditable true
+  @DomName('Console.group')
   void group(Object arg) => _isConsoleDefined ?
       JS('void', 'console.group(#)', arg) : null;
 
-  /// @domName Console.groupCollapsed; @docsEditable true
+  @DomName('Console.groupCollapsed')
   void groupCollapsed(Object arg) => _isConsoleDefined ?
       JS('void', 'console.groupCollapsed(#)', arg) : null;
 
-  /// @domName Console.groupEnd; @docsEditable true
+  @DomName('Console.groupEnd')
   void groupEnd() => _isConsoleDefined ?
       JS('void', 'console.groupEnd()') : null;
 
-  /// @domName Console.info; @docsEditable true
+  @DomName('Console.info')
   void info(Object arg) => _isConsoleDefined ?
       JS('void', 'console.info(#)', arg) : null;
 
-  /// @domName Console.log; @docsEditable true
+  @DomName('Console.log')
   void log(Object arg) => _isConsoleDefined ?
       JS('void', 'console.log(#)', arg) : null;
 
-  /// @domName Console.markTimeline; @docsEditable true
+  @DomName('Console.markTimeline')
   void markTimeline(Object arg) => _isConsoleDefined ?
       JS('void', 'console.markTimeline(#)', arg) : null;
 
-  /// @domName Console.profile; @docsEditable true
+  @DomName('Console.profile')
   void profile(String title) => _isConsoleDefined ?
       JS('void', 'console.profile(#)', title) : null;
 
-  /// @domName Console.profileEnd; @docsEditable true
+  @DomName('Console.profileEnd')
   void profileEnd(String title) => _isConsoleDefined ?
       JS('void', 'console.profileEnd(#)', title) : null;
 
-  /// @domName Console.time; @docsEditable true
+  @DomName('Console.time')
   void time(String title) => _isConsoleDefined ?
       JS('void', 'console.time(#)', title) : null;
 
-  /// @domName Console.timeEnd; @docsEditable true
+  @DomName('Console.timeEnd')
   void timeEnd(String title, Object arg) => _isConsoleDefined ?
       JS('void', 'console.timeEnd(#, #)', title, arg) : null;
 
-  /// @domName Console.timeStamp; @docsEditable true
+  @DomName('Console.timeStamp')
   void timeStamp(Object arg) => _isConsoleDefined ?
       JS('void', 'console.timeStamp(#)', arg) : null;
 
-  /// @domName Console.trace; @docsEditable true
+  @DomName('Console.trace')
   void trace(Object arg) => _isConsoleDefined ?
       JS('void', 'console.trace(#)', arg) : null;
 
-  /// @domName Console.warn; @docsEditable true
+  @DomName('Console.warn')
   void warn(Object arg) => _isConsoleDefined ?
       JS('void', 'console.warn(#)', arg) : null;
 
-  /// @domName Console.clear; @docsEditable true
+  @DocsEditable @DomName('Console.clear')
   void clear(Object arg) native;
 
 }
@@ -1545,24 +1420,26 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLContentElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLContentElement')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental()
 class ContentElement extends Element native "*HTMLContentElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory ContentElement() => document.$dom_createElement("content");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('content');
 
-  /// @domName HTMLContentElement.resetStyleInheritance; @docsEditable true
+  @DocsEditable @DomName('HTMLContentElement.resetStyleInheritance')
   bool resetStyleInheritance;
 
-  /// @domName HTMLContentElement.select; @docsEditable true
+  @DocsEditable @DomName('HTMLContentElement.select')
   String select;
 
-  /// @domName HTMLContentElement.getDistributedNodes; @docsEditable true
+  @DocsEditable @DomName('HTMLContentElement.getDistributedNodes')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> getDistributedNodes() native;
 }
@@ -1571,28 +1448,30 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Coordinates; @docsEditable true
+
+@DocsEditable
+@DomName('Coordinates')
 class Coordinates native "*Coordinates" {
 
-  /// @domName Coordinates.accuracy; @docsEditable true
+  @DocsEditable @DomName('Coordinates.accuracy')
   final num accuracy;
 
-  /// @domName Coordinates.altitude; @docsEditable true
+  @DocsEditable @DomName('Coordinates.altitude')
   final num altitude;
 
-  /// @domName Coordinates.altitudeAccuracy; @docsEditable true
+  @DocsEditable @DomName('Coordinates.altitudeAccuracy')
   final num altitudeAccuracy;
 
-  /// @domName Coordinates.heading; @docsEditable true
+  @DocsEditable @DomName('Coordinates.heading')
   final num heading;
 
-  /// @domName Coordinates.latitude; @docsEditable true
+  @DocsEditable @DomName('Coordinates.latitude')
   final num latitude;
 
-  /// @domName Coordinates.longitude; @docsEditable true
+  @DocsEditable @DomName('Coordinates.longitude')
   final num longitude;
 
-  /// @domName Coordinates.speed; @docsEditable true
+  @DocsEditable @DomName('Coordinates.speed')
   final num speed;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1600,16 +1479,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Counter; @docsEditable true
+
+@DocsEditable
+@DomName('Counter')
 class Counter native "*Counter" {
 
-  /// @domName Counter.identifier; @docsEditable true
+  @DocsEditable @DomName('Counter.identifier')
   final String identifier;
 
-  /// @domName Counter.listStyle; @docsEditable true
+  @DocsEditable @DomName('Counter.listStyle')
   final String listStyle;
 
-  /// @domName Counter.separator; @docsEditable true
+  @DocsEditable @DomName('Counter.separator')
   final String separator;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1617,21 +1498,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Crypto; @docsEditable true
+
+@DocsEditable
+@DomName('Crypto')
 class Crypto native "*Crypto" {
 
-  /// @domName Crypto.getRandomValues; @docsEditable true
-  void getRandomValues(ArrayBufferView array) native;
+  @DocsEditable @DomName('Crypto.getRandomValues')
+  ArrayBufferView getRandomValues(ArrayBufferView array) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSCharsetRule; @docsEditable true
+
+@DocsEditable
+@DomName('CSSCharsetRule')
 class CssCharsetRule extends CssRule native "*CSSCharsetRule" {
 
-  /// @domName CSSCharsetRule.encoding; @docsEditable true
+  @DocsEditable @DomName('CSSCharsetRule.encoding')
   String encoding;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1639,10 +1524,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSFontFaceRule; @docsEditable true
+
+@DocsEditable
+@DomName('CSSFontFaceRule')
 class CssFontFaceRule extends CssRule native "*CSSFontFaceRule" {
 
-  /// @domName CSSFontFaceRule.style; @docsEditable true
+  @DocsEditable @DomName('CSSFontFaceRule.style')
   final CssStyleDeclaration style;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1650,16 +1537,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSImportRule; @docsEditable true
+
+@DocsEditable
+@DomName('CSSImportRule')
 class CssImportRule extends CssRule native "*CSSImportRule" {
 
-  /// @domName CSSImportRule.href; @docsEditable true
+  @DocsEditable @DomName('CSSImportRule.href')
   final String href;
 
-  /// @domName CSSImportRule.media; @docsEditable true
+  @DocsEditable @DomName('CSSImportRule.media')
   final MediaList media;
 
-  /// @domName CSSImportRule.styleSheet; @docsEditable true
+  @DocsEditable @DomName('CSSImportRule.styleSheet')
   final CssStyleSheet styleSheet;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1667,13 +1556,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitCSSKeyframeRule; @docsEditable true
+
+@DocsEditable
+@DomName('WebKitCSSKeyframeRule')
 class CssKeyframeRule extends CssRule native "*WebKitCSSKeyframeRule" {
 
-  /// @domName WebKitCSSKeyframeRule.keyText; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSKeyframeRule.keyText')
   String keyText;
 
-  /// @domName WebKitCSSKeyframeRule.style; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSKeyframeRule.style')
   final CssStyleDeclaration style;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1681,23 +1572,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitCSSKeyframesRule; @docsEditable true
+
+@DocsEditable
+@DomName('WebKitCSSKeyframesRule')
 class CssKeyframesRule extends CssRule native "*WebKitCSSKeyframesRule" {
 
-  /// @domName WebKitCSSKeyframesRule.cssRules; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSKeyframesRule.cssRules')
   @Returns('_CssRuleList') @Creates('_CssRuleList')
   final List<CssRule> cssRules;
 
-  /// @domName WebKitCSSKeyframesRule.name; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSKeyframesRule.name')
   String name;
 
-  /// @domName WebKitCSSKeyframesRule.deleteRule; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSKeyframesRule.deleteRule')
   void deleteRule(String key) native;
 
-  /// @domName WebKitCSSKeyframesRule.findRule; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSKeyframesRule.findRule')
   CssKeyframeRule findRule(String key) native;
 
-  /// @domName WebKitCSSKeyframesRule.insertRule; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSKeyframesRule.insertRule')
   void insertRule(String rule) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1705,10 +1598,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitCSSMatrix; @docsEditable true
+
+@DocsEditable
+@DomName('WebKitCSSMatrix')
 class CssMatrix native "*WebKitCSSMatrix" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory CssMatrix([String cssValue]) {
     if (!?cssValue) {
       return CssMatrix._create();
@@ -1722,100 +1617,100 @@
     return JS('CssMatrix', 'new WebKitCSSMatrix(#)', cssValue);
   }
 
-  /// @domName WebKitCSSMatrix.a; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.a')
   num a;
 
-  /// @domName WebKitCSSMatrix.b; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.b')
   num b;
 
-  /// @domName WebKitCSSMatrix.c; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.c')
   num c;
 
-  /// @domName WebKitCSSMatrix.d; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.d')
   num d;
 
-  /// @domName WebKitCSSMatrix.e; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.e')
   num e;
 
-  /// @domName WebKitCSSMatrix.f; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.f')
   num f;
 
-  /// @domName WebKitCSSMatrix.m11; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.m11')
   num m11;
 
-  /// @domName WebKitCSSMatrix.m12; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.m12')
   num m12;
 
-  /// @domName WebKitCSSMatrix.m13; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.m13')
   num m13;
 
-  /// @domName WebKitCSSMatrix.m14; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.m14')
   num m14;
 
-  /// @domName WebKitCSSMatrix.m21; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.m21')
   num m21;
 
-  /// @domName WebKitCSSMatrix.m22; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.m22')
   num m22;
 
-  /// @domName WebKitCSSMatrix.m23; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.m23')
   num m23;
 
-  /// @domName WebKitCSSMatrix.m24; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.m24')
   num m24;
 
-  /// @domName WebKitCSSMatrix.m31; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.m31')
   num m31;
 
-  /// @domName WebKitCSSMatrix.m32; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.m32')
   num m32;
 
-  /// @domName WebKitCSSMatrix.m33; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.m33')
   num m33;
 
-  /// @domName WebKitCSSMatrix.m34; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.m34')
   num m34;
 
-  /// @domName WebKitCSSMatrix.m41; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.m41')
   num m41;
 
-  /// @domName WebKitCSSMatrix.m42; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.m42')
   num m42;
 
-  /// @domName WebKitCSSMatrix.m43; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.m43')
   num m43;
 
-  /// @domName WebKitCSSMatrix.m44; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.m44')
   num m44;
 
-  /// @domName WebKitCSSMatrix.inverse; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.inverse')
   CssMatrix inverse() native;
 
-  /// @domName WebKitCSSMatrix.multiply; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.multiply')
   CssMatrix multiply(CssMatrix secondMatrix) native;
 
-  /// @domName WebKitCSSMatrix.rotate; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.rotate')
   CssMatrix rotate(num rotX, num rotY, num rotZ) native;
 
-  /// @domName WebKitCSSMatrix.rotateAxisAngle; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.rotateAxisAngle')
   CssMatrix rotateAxisAngle(num x, num y, num z, num angle) native;
 
-  /// @domName WebKitCSSMatrix.scale; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.scale')
   CssMatrix scale(num scaleX, num scaleY, num scaleZ) native;
 
-  /// @domName WebKitCSSMatrix.setMatrixValue; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.setMatrixValue')
   void setMatrixValue(String string) native;
 
-  /// @domName WebKitCSSMatrix.skewX; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.skewX')
   CssMatrix skewX(num angle) native;
 
-  /// @domName WebKitCSSMatrix.skewY; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.skewY')
   CssMatrix skewY(num angle) native;
 
-  /// @domName WebKitCSSMatrix.toString; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.toString')
   String toString() native;
 
-  /// @domName WebKitCSSMatrix.translate; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSMatrix.translate')
   CssMatrix translate(num x, num y, num z) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1823,20 +1718,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSMediaRule; @docsEditable true
+
+@DocsEditable
+@DomName('CSSMediaRule')
 class CssMediaRule extends CssRule native "*CSSMediaRule" {
 
-  /// @domName CSSMediaRule.cssRules; @docsEditable true
+  @DocsEditable @DomName('CSSMediaRule.cssRules')
   @Returns('_CssRuleList') @Creates('_CssRuleList')
   final List<CssRule> cssRules;
 
-  /// @domName CSSMediaRule.media; @docsEditable true
+  @DocsEditable @DomName('CSSMediaRule.media')
   final MediaList media;
 
-  /// @domName CSSMediaRule.deleteRule; @docsEditable true
+  @DocsEditable @DomName('CSSMediaRule.deleteRule')
   void deleteRule(int index) native;
 
-  /// @domName CSSMediaRule.insertRule; @docsEditable true
+  @DocsEditable @DomName('CSSMediaRule.insertRule')
   int insertRule(String rule, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1844,13 +1741,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSPageRule; @docsEditable true
+
+@DocsEditable
+@DomName('CSSPageRule')
 class CssPageRule extends CssRule native "*CSSPageRule" {
 
-  /// @domName CSSPageRule.selectorText; @docsEditable true
+  @DocsEditable @DomName('CSSPageRule.selectorText')
   String selectorText;
 
-  /// @domName CSSPageRule.style; @docsEditable true
+  @DocsEditable @DomName('CSSPageRule.style')
   final CssStyleDeclaration style;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1858,7 +1757,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSPrimitiveValue; @docsEditable true
+
+@DocsEditable
+@DomName('CSSPrimitiveValue')
 class CssPrimitiveValue extends CssValue native "*CSSPrimitiveValue" {
 
   static const int CSS_ATTR = 22;
@@ -1919,29 +1820,29 @@
 
   static const int CSS_VW = 26;
 
-  /// @domName CSSPrimitiveValue.primitiveType; @docsEditable true
+  @DocsEditable @DomName('CSSPrimitiveValue.primitiveType')
   final int primitiveType;
 
-  /// @domName CSSPrimitiveValue.getCounterValue; @docsEditable true
+  @DocsEditable @DomName('CSSPrimitiveValue.getCounterValue')
   Counter getCounterValue() native;
 
-  /// @domName CSSPrimitiveValue.getFloatValue; @docsEditable true
+  @DocsEditable @DomName('CSSPrimitiveValue.getFloatValue')
   num getFloatValue(int unitType) native;
 
-  /// @domName CSSPrimitiveValue.getRGBColorValue; @docsEditable true
   @JSName('getRGBColorValue')
+  @DocsEditable @DomName('CSSPrimitiveValue.getRGBColorValue')
   RgbColor getRgbColorValue() native;
 
-  /// @domName CSSPrimitiveValue.getRectValue; @docsEditable true
+  @DocsEditable @DomName('CSSPrimitiveValue.getRectValue')
   Rect getRectValue() native;
 
-  /// @domName CSSPrimitiveValue.getStringValue; @docsEditable true
+  @DocsEditable @DomName('CSSPrimitiveValue.getStringValue')
   String getStringValue() native;
 
-  /// @domName CSSPrimitiveValue.setFloatValue; @docsEditable true
+  @DocsEditable @DomName('CSSPrimitiveValue.setFloatValue')
   void setFloatValue(int unitType, num floatValue) native;
 
-  /// @domName CSSPrimitiveValue.setStringValue; @docsEditable true
+  @DocsEditable @DomName('CSSPrimitiveValue.setStringValue')
   void setStringValue(int stringType, String stringValue) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1949,7 +1850,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSRule; @docsEditable true
+
+@DocsEditable
+@DomName('CSSRule')
 class CssRule native "*CSSRule" {
 
   static const int CHARSET_RULE = 2;
@@ -1970,16 +1873,16 @@
 
   static const int WEBKIT_KEYFRAME_RULE = 8;
 
-  /// @domName CSSRule.cssText; @docsEditable true
+  @DocsEditable @DomName('CSSRule.cssText')
   String cssText;
 
-  /// @domName CSSRule.parentRule; @docsEditable true
+  @DocsEditable @DomName('CSSRule.parentRule')
   final CssRule parentRule;
 
-  /// @domName CSSRule.parentStyleSheet; @docsEditable true
+  @DocsEditable @DomName('CSSRule.parentStyleSheet')
   final CssStyleSheet parentStyleSheet;
 
-  /// @domName CSSRule.type; @docsEditable true
+  @DocsEditable @DomName('CSSRule.type')
   final int type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2004,43 +1907,44 @@
   return _cachedBrowserPrefix;
 }
 
-/// @domName CSSStyleDeclaration
+@DocsEditable
+@DomName('CSSStyleDeclaration')
 class CssStyleDeclaration native "*CSSStyleDeclaration" {
   factory CssStyleDeclaration() => _CssStyleDeclarationFactoryProvider.createCssStyleDeclaration();
   factory CssStyleDeclaration.css(String css) =>
       _CssStyleDeclarationFactoryProvider.createCssStyleDeclaration_css(css);
 
 
-  /// @domName CSSStyleDeclaration.cssText; @docsEditable true
+  @DocsEditable @DomName('CSSStyleDeclaration.cssText')
   String cssText;
 
-  /// @domName CSSStyleDeclaration.length; @docsEditable true
+  @DocsEditable @DomName('CSSStyleDeclaration.length')
   final int length;
 
-  /// @domName CSSStyleDeclaration.parentRule; @docsEditable true
+  @DocsEditable @DomName('CSSStyleDeclaration.parentRule')
   final CssRule parentRule;
 
-  /// @domName CSSStyleDeclaration.getPropertyCSSValue; @docsEditable true
   @JSName('getPropertyCSSValue')
+  @DocsEditable @DomName('CSSStyleDeclaration.getPropertyCSSValue')
   CssValue getPropertyCssValue(String propertyName) native;
 
-  /// @domName CSSStyleDeclaration.getPropertyPriority; @docsEditable true
+  @DocsEditable @DomName('CSSStyleDeclaration.getPropertyPriority')
   String getPropertyPriority(String propertyName) native;
 
-  /// @domName CSSStyleDeclaration.getPropertyShorthand; @docsEditable true
+  @DocsEditable @DomName('CSSStyleDeclaration.getPropertyShorthand')
   String getPropertyShorthand(String propertyName) native;
 
-  /// @domName CSSStyleDeclaration._getPropertyValue; @docsEditable true
   @JSName('getPropertyValue')
+  @DocsEditable @DomName('CSSStyleDeclaration.getPropertyValue')
   String _getPropertyValue(String propertyName) native;
 
-  /// @domName CSSStyleDeclaration.isPropertyImplicit; @docsEditable true
+  @DocsEditable @DomName('CSSStyleDeclaration.isPropertyImplicit')
   bool isPropertyImplicit(String propertyName) native;
 
-  /// @domName CSSStyleDeclaration.item; @docsEditable true
+  @DocsEditable @DomName('CSSStyleDeclaration.item')
   String item(int index) native;
 
-  /// @domName CSSStyleDeclaration.removeProperty; @docsEditable true
+  @DocsEditable @DomName('CSSStyleDeclaration.removeProperty')
   String removeProperty(String propertyName) native;
 
 
@@ -5213,13 +5117,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSStyleRule; @docsEditable true
+
+@DocsEditable
+@DomName('CSSStyleRule')
 class CssStyleRule extends CssRule native "*CSSStyleRule" {
 
-  /// @domName CSSStyleRule.selectorText; @docsEditable true
+  @DocsEditable @DomName('CSSStyleRule.selectorText')
   String selectorText;
 
-  /// @domName CSSStyleRule.style; @docsEditable true
+  @DocsEditable @DomName('CSSStyleRule.style')
   final CssStyleDeclaration style;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5227,30 +5133,32 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSStyleSheet; @docsEditable true
+
+@DocsEditable
+@DomName('CSSStyleSheet')
 class CssStyleSheet extends StyleSheet native "*CSSStyleSheet" {
 
-  /// @domName CSSStyleSheet.cssRules; @docsEditable true
+  @DocsEditable @DomName('CSSStyleSheet.cssRules')
   @Returns('_CssRuleList') @Creates('_CssRuleList')
   final List<CssRule> cssRules;
 
-  /// @domName CSSStyleSheet.ownerRule; @docsEditable true
+  @DocsEditable @DomName('CSSStyleSheet.ownerRule')
   final CssRule ownerRule;
 
-  /// @domName CSSStyleSheet.rules; @docsEditable true
+  @DocsEditable @DomName('CSSStyleSheet.rules')
   @Returns('_CssRuleList') @Creates('_CssRuleList')
   final List<CssRule> rules;
 
-  /// @domName CSSStyleSheet.addRule; @docsEditable true
+  @DocsEditable @DomName('CSSStyleSheet.addRule')
   int addRule(String selector, String style, [int index]) native;
 
-  /// @domName CSSStyleSheet.deleteRule; @docsEditable true
+  @DocsEditable @DomName('CSSStyleSheet.deleteRule')
   void deleteRule(int index) native;
 
-  /// @domName CSSStyleSheet.insertRule; @docsEditable true
+  @DocsEditable @DomName('CSSStyleSheet.insertRule')
   int insertRule(String rule, int index) native;
 
-  /// @domName CSSStyleSheet.removeRule; @docsEditable true
+  @DocsEditable @DomName('CSSStyleSheet.removeRule')
   void removeRule(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5258,7 +5166,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitCSSTransformValue; @docsEditable true
+
+@DocsEditable
+@DomName('WebKitCSSTransformValue')
 class CssTransformValue extends _CssValueList native "*WebKitCSSTransformValue" {
 
   static const int CSS_MATRIX = 11;
@@ -5303,7 +5213,7 @@
 
   static const int CSS_TRANSLATEZ = 12;
 
-  /// @domName WebKitCSSTransformValue.operationType; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSTransformValue.operationType')
   final int operationType;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5311,7 +5221,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSUnknownRule; @docsEditable true
+
+@DocsEditable
+@DomName('CSSUnknownRule')
 class CssUnknownRule extends CssRule native "*CSSUnknownRule" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5319,7 +5231,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSValue; @docsEditable true
+
+@DocsEditable
+@DomName('CSSValue')
 class CssValue native "*CSSValue" {
 
   static const int CSS_CUSTOM = 3;
@@ -5330,10 +5244,10 @@
 
   static const int CSS_VALUE_LIST = 2;
 
-  /// @domName CSSValue.cssText; @docsEditable true
+  @DocsEditable @DomName('CSSValue.cssText')
   String cssText;
 
-  /// @domName CSSValue.cssValueType; @docsEditable true
+  @DocsEditable @DomName('CSSValue.cssValueType')
   final int cssValueType;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5343,17 +5257,18 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CustomEvent
+@DocsEditable
+@DomName('CustomEvent')
 class CustomEvent extends Event native "*CustomEvent" {
   factory CustomEvent(String type, [bool canBubble = true, bool cancelable = true,
       Object detail]) => _CustomEventFactoryProvider.createCustomEvent(
       type, canBubble, cancelable, detail);
 
-  /// @domName CustomEvent.detail; @docsEditable true
+  @DocsEditable @DomName('CustomEvent.detail')
   final Object detail;
 
-  /// @domName CustomEvent.initCustomEvent; @docsEditable true
   @JSName('initCustomEvent')
+  @DocsEditable @DomName('CustomEvent.initCustomEvent')
   void $dom_initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) native;
 
 }
@@ -5362,10 +5277,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLDListElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLDListElement')
 class DListElement extends Element native "*HTMLDListElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory DListElement() => document.$dom_createElement("dl");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5373,20 +5290,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLDataListElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLDataListElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
 class DataListElement extends Element native "*HTMLDataListElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory DataListElement() => document.$dom_createElement("datalist");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('datalist');
 
-  /// @domName HTMLDataListElement.options; @docsEditable true
+  @DocsEditable @DomName('HTMLDataListElement.options')
   final HtmlCollection options;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5394,22 +5313,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DataTransferItem; @docsEditable true
+
+@DocsEditable
+@DomName('DataTransferItem')
 class DataTransferItem native "*DataTransferItem" {
 
-  /// @domName DataTransferItem.kind; @docsEditable true
+  @DocsEditable @DomName('DataTransferItem.kind')
   final String kind;
 
-  /// @domName DataTransferItem.type; @docsEditable true
+  @DocsEditable @DomName('DataTransferItem.type')
   final String type;
 
-  /// @domName DataTransferItem.getAsFile; @docsEditable true
+  @DocsEditable @DomName('DataTransferItem.getAsFile')
   Blob getAsFile() native;
 
-  /// @domName DataTransferItem.getAsString; @docsEditable true
+  @DocsEditable @DomName('DataTransferItem.getAsString')
   void getAsString([StringCallback callback]) native;
 
-  /// @domName DataTransferItem.webkitGetAsEntry; @docsEditable true
+  @DocsEditable @DomName('DataTransferItem.webkitGetAsEntry')
   Entry webkitGetAsEntry() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5417,19 +5338,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DataTransferItemList; @docsEditable true
+
+@DocsEditable
+@DomName('DataTransferItemList')
 class DataTransferItemList native "*DataTransferItemList" {
 
-  /// @domName DataTransferItemList.length; @docsEditable true
+  @DocsEditable @DomName('DataTransferItemList.length')
   final int length;
 
-  /// @domName DataTransferItemList.add; @docsEditable true
+  @DocsEditable @DomName('DataTransferItemList.add')
   void add(data_OR_file, [String type]) native;
 
-  /// @domName DataTransferItemList.clear; @docsEditable true
+  @DocsEditable @DomName('DataTransferItemList.clear')
   void clear() native;
 
-  /// @domName DataTransferItemList.item; @docsEditable true
+  @DocsEditable @DomName('DataTransferItemList.item')
   DataTransferItem item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5437,10 +5360,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DataView; @docsEditable true
+
+@DocsEditable
+@DomName('DataView')
 class DataView extends ArrayBufferView native "*DataView" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory DataView(ArrayBuffer buffer, [int byteOffset, int byteLength]) {
     if (!?byteOffset) {
       return DataView._create(buffer);
@@ -5460,52 +5385,52 @@
     return JS('DataView', 'new DataView(#,#,#)', buffer, byteOffset, byteLength);
   }
 
-  /// @domName DataView.getFloat32; @docsEditable true
+  @DocsEditable @DomName('DataView.getFloat32')
   num getFloat32(int byteOffset, {bool littleEndian}) native;
 
-  /// @domName DataView.getFloat64; @docsEditable true
+  @DocsEditable @DomName('DataView.getFloat64')
   num getFloat64(int byteOffset, {bool littleEndian}) native;
 
-  /// @domName DataView.getInt16; @docsEditable true
+  @DocsEditable @DomName('DataView.getInt16')
   int getInt16(int byteOffset, {bool littleEndian}) native;
 
-  /// @domName DataView.getInt32; @docsEditable true
+  @DocsEditable @DomName('DataView.getInt32')
   int getInt32(int byteOffset, {bool littleEndian}) native;
 
-  /// @domName DataView.getInt8; @docsEditable true
+  @DocsEditable @DomName('DataView.getInt8')
   int getInt8(int byteOffset) native;
 
-  /// @domName DataView.getUint16; @docsEditable true
+  @DocsEditable @DomName('DataView.getUint16')
   int getUint16(int byteOffset, {bool littleEndian}) native;
 
-  /// @domName DataView.getUint32; @docsEditable true
+  @DocsEditable @DomName('DataView.getUint32')
   int getUint32(int byteOffset, {bool littleEndian}) native;
 
-  /// @domName DataView.getUint8; @docsEditable true
+  @DocsEditable @DomName('DataView.getUint8')
   int getUint8(int byteOffset) native;
 
-  /// @domName DataView.setFloat32; @docsEditable true
+  @DocsEditable @DomName('DataView.setFloat32')
   void setFloat32(int byteOffset, num value, {bool littleEndian}) native;
 
-  /// @domName DataView.setFloat64; @docsEditable true
+  @DocsEditable @DomName('DataView.setFloat64')
   void setFloat64(int byteOffset, num value, {bool littleEndian}) native;
 
-  /// @domName DataView.setInt16; @docsEditable true
+  @DocsEditable @DomName('DataView.setInt16')
   void setInt16(int byteOffset, int value, {bool littleEndian}) native;
 
-  /// @domName DataView.setInt32; @docsEditable true
+  @DocsEditable @DomName('DataView.setInt32')
   void setInt32(int byteOffset, int value, {bool littleEndian}) native;
 
-  /// @domName DataView.setInt8; @docsEditable true
+  @DocsEditable @DomName('DataView.setInt8')
   void setInt8(int byteOffset, int value) native;
 
-  /// @domName DataView.setUint16; @docsEditable true
+  @DocsEditable @DomName('DataView.setUint16')
   void setUint16(int byteOffset, int value, {bool littleEndian}) native;
 
-  /// @domName DataView.setUint32; @docsEditable true
+  @DocsEditable @DomName('DataView.setUint32')
   void setUint32(int byteOffset, int value, {bool littleEndian}) native;
 
-  /// @domName DataView.setUint8; @docsEditable true
+  @DocsEditable @DomName('DataView.setUint8')
   void setUint8(int byteOffset, int value) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5513,19 +5438,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Database; @docsEditable true
+
+@DocsEditable
+@DomName('Database')
 class Database native "*Database" {
 
-  /// @domName Database.version; @docsEditable true
+  @DocsEditable @DomName('Database.version')
   final String version;
 
-  /// @domName Database.changeVersion; @docsEditable true
+  @DocsEditable @DomName('Database.changeVersion')
   void changeVersion(String oldVersion, String newVersion, [SqlTransactionCallback callback, SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native;
 
-  /// @domName Database.readTransaction; @docsEditable true
+  @DocsEditable @DomName('Database.readTransaction')
   void readTransaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native;
 
-  /// @domName Database.transaction; @docsEditable true
+  @DocsEditable @DomName('Database.transaction')
   void transaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5541,22 +5468,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DatabaseSync; @docsEditable true
+
+@DocsEditable
+@DomName('DatabaseSync')
 class DatabaseSync native "*DatabaseSync" {
 
-  /// @domName DatabaseSync.lastErrorMessage; @docsEditable true
+  @DocsEditable @DomName('DatabaseSync.lastErrorMessage')
   final String lastErrorMessage;
 
-  /// @domName DatabaseSync.version; @docsEditable true
+  @DocsEditable @DomName('DatabaseSync.version')
   final String version;
 
-  /// @domName DatabaseSync.changeVersion; @docsEditable true
+  @DocsEditable @DomName('DatabaseSync.changeVersion')
   void changeVersion(String oldVersion, String newVersion, [SqlTransactionSyncCallback callback]) native;
 
-  /// @domName DatabaseSync.readTransaction; @docsEditable true
+  @DocsEditable @DomName('DatabaseSync.readTransaction')
   void readTransaction(SqlTransactionSyncCallback callback) native;
 
-  /// @domName DatabaseSync.transaction; @docsEditable true
+  @DocsEditable @DomName('DatabaseSync.transaction')
   void transaction(SqlTransactionSyncCallback callback) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5564,16 +5493,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DedicatedWorkerContext; @docsEditable true
+
+@DocsEditable
+@DomName('DedicatedWorkerContext')
 class DedicatedWorkerContext extends WorkerContext native "*DedicatedWorkerContext" {
 
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   DedicatedWorkerContextEvents get on =>
     new DedicatedWorkerContextEvents(this);
 
-  /// @domName DedicatedWorkerContext.postMessage; @docsEditable true
   void postMessage(/*any*/ message, [List messagePorts]) {
     if (?messagePorts) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
@@ -5585,19 +5516,21 @@
     return;
   }
   @JSName('postMessage')
+  @DocsEditable @DomName('DedicatedWorkerContext.postMessage')
   void _postMessage_1(message, List messagePorts) native;
   @JSName('postMessage')
+  @DocsEditable @DomName('DedicatedWorkerContext.postMessage')
   void _postMessage_2(message) native;
 
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class DedicatedWorkerContextEvents extends WorkerContextEvents {
-  /// @docsEditable true
+  @DocsEditable
   DedicatedWorkerContextEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get message => this['message'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5605,19 +5538,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLDetailsElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLDetailsElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental()
 class DetailsElement extends Element native "*HTMLDetailsElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory DetailsElement() => document.$dom_createElement("details");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('details');
 
-  /// @domName HTMLDetailsElement.open; @docsEditable true
+  @DocsEditable @DomName('HTMLDetailsElement.open')
   bool open;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5625,10 +5560,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DeviceMotionEvent; @docsEditable true
+
+@DocsEditable
+@DomName('DeviceMotionEvent')
 class DeviceMotionEvent extends Event native "*DeviceMotionEvent" {
 
-  /// @domName DeviceMotionEvent.interval; @docsEditable true
+  @DocsEditable @DomName('DeviceMotionEvent.interval')
   final num interval;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5636,22 +5573,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DeviceOrientationEvent; @docsEditable true
+
+@DocsEditable
+@DomName('DeviceOrientationEvent')
 class DeviceOrientationEvent extends Event native "*DeviceOrientationEvent" {
 
-  /// @domName DeviceOrientationEvent.absolute; @docsEditable true
+  @DocsEditable @DomName('DeviceOrientationEvent.absolute')
   final bool absolute;
 
-  /// @domName DeviceOrientationEvent.alpha; @docsEditable true
+  @DocsEditable @DomName('DeviceOrientationEvent.alpha')
   final num alpha;
 
-  /// @domName DeviceOrientationEvent.beta; @docsEditable true
+  @DocsEditable @DomName('DeviceOrientationEvent.beta')
   final num beta;
 
-  /// @domName DeviceOrientationEvent.gamma; @docsEditable true
+  @DocsEditable @DomName('DeviceOrientationEvent.gamma')
   final num gamma;
 
-  /// @domName DeviceOrientationEvent.initDeviceOrientationEvent; @docsEditable true
+  @DocsEditable @DomName('DeviceOrientationEvent.initDeviceOrientationEvent')
   void initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5659,24 +5598,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLDirectoryElement; @docsEditable true
-class DirectoryElement extends Element native "*HTMLDirectoryElement" {
 
-  /// @domName HTMLDirectoryElement.compact; @docsEditable true
-  bool compact;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName DirectoryEntry; @docsEditable true
+@DocsEditable
+@DomName('DirectoryEntry')
 class DirectoryEntry extends Entry native "*DirectoryEntry" {
 
-  /// @domName DirectoryEntry.createReader; @docsEditable true
+  @DocsEditable @DomName('DirectoryEntry.createReader')
   DirectoryReader createReader() native;
 
-  /// @domName DirectoryEntry.getDirectory; @docsEditable true
   void getDirectory(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback}) {
     if (?errorCallback) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -5697,15 +5626,18 @@
     return;
   }
   @JSName('getDirectory')
+  @DocsEditable @DomName('DirectoryEntry.getDirectory')
   void _getDirectory_1(path, options, EntryCallback successCallback, ErrorCallback errorCallback) native;
   @JSName('getDirectory')
+  @DocsEditable @DomName('DirectoryEntry.getDirectory')
   void _getDirectory_2(path, options, EntryCallback successCallback) native;
   @JSName('getDirectory')
+  @DocsEditable @DomName('DirectoryEntry.getDirectory')
   void _getDirectory_3(path, options) native;
   @JSName('getDirectory')
+  @DocsEditable @DomName('DirectoryEntry.getDirectory')
   void _getDirectory_4(path) native;
 
-  /// @domName DirectoryEntry.getFile; @docsEditable true
   void getFile(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback}) {
     if (?errorCallback) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -5726,15 +5658,19 @@
     return;
   }
   @JSName('getFile')
+  @DocsEditable @DomName('DirectoryEntry.getFile')
   void _getFile_1(path, options, EntryCallback successCallback, ErrorCallback errorCallback) native;
   @JSName('getFile')
+  @DocsEditable @DomName('DirectoryEntry.getFile')
   void _getFile_2(path, options, EntryCallback successCallback) native;
   @JSName('getFile')
+  @DocsEditable @DomName('DirectoryEntry.getFile')
   void _getFile_3(path, options) native;
   @JSName('getFile')
+  @DocsEditable @DomName('DirectoryEntry.getFile')
   void _getFile_4(path) native;
 
-  /// @domName DirectoryEntry.removeRecursively; @docsEditable true
+  @DocsEditable @DomName('DirectoryEntry.removeRecursively')
   void removeRecursively(VoidCallback successCallback, [ErrorCallback errorCallback]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5742,29 +5678,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DirectoryEntrySync; @docsEditable true
+
+@DocsEditable
+@DomName('DirectoryEntrySync')
 class DirectoryEntrySync extends EntrySync native "*DirectoryEntrySync" {
 
-  /// @domName DirectoryEntrySync.createReader; @docsEditable true
+  @DocsEditable @DomName('DirectoryEntrySync.createReader')
   DirectoryReaderSync createReader() native;
 
-  /// @domName DirectoryEntrySync.getDirectory; @docsEditable true
   DirectoryEntrySync getDirectory(String path, Map flags) {
     var flags_1 = convertDartToNative_Dictionary(flags);
     return _getDirectory_1(path, flags_1);
   }
   @JSName('getDirectory')
+  @DocsEditable @DomName('DirectoryEntrySync.getDirectory')
   DirectoryEntrySync _getDirectory_1(path, flags) native;
 
-  /// @domName DirectoryEntrySync.getFile; @docsEditable true
   FileEntrySync getFile(String path, Map flags) {
     var flags_1 = convertDartToNative_Dictionary(flags);
     return _getFile_1(path, flags_1);
   }
   @JSName('getFile')
+  @DocsEditable @DomName('DirectoryEntrySync.getFile')
   FileEntrySync _getFile_1(path, flags) native;
 
-  /// @domName DirectoryEntrySync.removeRecursively; @docsEditable true
+  @DocsEditable @DomName('DirectoryEntrySync.removeRecursively')
   void removeRecursively() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5772,10 +5710,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DirectoryReader; @docsEditable true
+
+@DocsEditable
+@DomName('DirectoryReader')
 class DirectoryReader native "*DirectoryReader" {
 
-  /// @domName DirectoryReader.readEntries; @docsEditable true
+  @DocsEditable @DomName('DirectoryReader.readEntries')
   void readEntries(EntriesCallback successCallback, [ErrorCallback errorCallback]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5783,10 +5723,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DirectoryReaderSync; @docsEditable true
+
+@DocsEditable
+@DomName('DirectoryReaderSync')
 class DirectoryReaderSync native "*DirectoryReaderSync" {
 
-  /// @domName DirectoryReaderSync.readEntries; @docsEditable true
+  @DocsEditable @DomName('DirectoryReaderSync.readEntries')
   @Returns('_EntryArraySync') @Creates('_EntryArraySync')
   List<EntrySync> readEntries() native;
 }
@@ -5795,31 +5737,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/**
- * Represents an HTML <div> element.
- *
- * The [DivElement] is a generic container for content and does not have any
- * special significance. It is functionally similar to [SpanElement].
- *
- * The [DivElement] is a block-level element, as opposed to [SpanElement],
- * which is an inline-level element.
- *
- * Example usage:
- *
- *     DivElement div = new DivElement();
- *     div.text = 'Here's my new DivElem
- *     document.body.elements.add(elem);
- *
- * See also:
- *
- * * [HTML <div> element](http://www.w3.org/TR/html-markup/div.html) from W3C.
- * * [Block-level element](http://www.w3.org/TR/CSS2/visuren.html#block-boxes) from W3C.
- * * [Inline-level element](http://www.w3.org/TR/CSS2/visuren.html#inline-boxes) from W3C.
- */
-/// @domName HTMLDivElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLDivElement')
 class DivElement extends Element native "*HTMLDivElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory DivElement() => document.$dom_createElement("div");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5827,7 +5750,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Document
+@DocsEditable
+@DomName('Document')
 /**
  * The base class for all documents.
  *
@@ -5841,413 +5765,301 @@
 {
 
 
-  static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
-
-  static const EventStreamProvider<Event> beforeCopyEvent = const EventStreamProvider<Event>('beforecopy');
-
-  static const EventStreamProvider<Event> beforeCutEvent = const EventStreamProvider<Event>('beforecut');
-
-  static const EventStreamProvider<Event> beforePasteEvent = const EventStreamProvider<Event>('beforepaste');
-
-  static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
-
-  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
-
-  static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
-
-  static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
-
-  static const EventStreamProvider<Event> copyEvent = const EventStreamProvider<Event>('copy');
-
-  static const EventStreamProvider<Event> cutEvent = const EventStreamProvider<Event>('cut');
-
-  static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
-
-  static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
-
-  static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
-
-  static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
-
-  static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
-
-  static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
-
-  static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
-
-  static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
-
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
-
-  static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
-
-  static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
-
-  static const EventStreamProvider<Event> invalidEvent = const EventStreamProvider<Event>('invalid');
-
-  static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
-
-  static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
-
-  static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
-
-  static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
-
-  static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
-
-  static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
-
-  static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
-
-  static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
-
-  static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
-
-  static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
-
-  static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
-
   static const EventStreamProvider<Event> readyStateChangeEvent = const EventStreamProvider<Event>('readystatechange');
 
-  static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
-
-  static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
-
-  static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
-
-  static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
-
   static const EventStreamProvider<Event> selectionChangeEvent = const EventStreamProvider<Event>('selectionchange');
 
-  static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
-
-  static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
-
-  static const EventStreamProvider<TouchEvent> touchCancelEvent = const EventStreamProvider<TouchEvent>('touchcancel');
-
-  static const EventStreamProvider<TouchEvent> touchEndEvent = const EventStreamProvider<TouchEvent>('touchend');
-
-  static const EventStreamProvider<TouchEvent> touchMoveEvent = const EventStreamProvider<TouchEvent>('touchmove');
-
-  static const EventStreamProvider<TouchEvent> touchStartEvent = const EventStreamProvider<TouchEvent>('touchstart');
-
-  static const EventStreamProvider<Event> fullscreenChangeEvent = const EventStreamProvider<Event>('webkitfullscreenchange');
-
-  static const EventStreamProvider<Event> fullscreenErrorEvent = const EventStreamProvider<Event>('webkitfullscreenerror');
-
   static const EventStreamProvider<Event> pointerLockChangeEvent = const EventStreamProvider<Event>('webkitpointerlockchange');
 
   static const EventStreamProvider<Event> pointerLockErrorEvent = const EventStreamProvider<Event>('webkitpointerlockerror');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   DocumentEvents get on =>
     new DocumentEvents(this);
 
-  /// Moved to [HtmlDocument].
-  /// @domName Document.body; @docsEditable true
   @JSName('body')
+  @DocsEditable @DomName('Document.body')
   Element $dom_body;
 
-  /// @domName Document.charset; @docsEditable true
+  @DocsEditable @DomName('Document.charset')
   String charset;
 
-  /// @domName Document.cookie; @docsEditable true
+  @DocsEditable @DomName('Document.cookie')
   String cookie;
 
-  /// @domName Document.defaultView; @docsEditable true
   WindowBase get window => _convertNativeToDart_Window(this._window);
   @JSName('defaultView')
-  @Creates('Window|=Object') @Returns('Window|=Object')
+  @DocsEditable @DomName('Document.window') @Creates('Window|=Object') @Returns('Window|=Object')
   final dynamic _window;
 
-  /// @domName Document.documentElement; @docsEditable true
+  @DocsEditable @DomName('Document.documentElement')
   final Element documentElement;
 
-  /// @domName Document.domain; @docsEditable true
+  @DocsEditable @DomName('Document.domain')
   final String domain;
 
-  /// Moved to [HtmlDocument].
-  /// @domName Document.head; @docsEditable true
   @JSName('head')
+  @DocsEditable @DomName('Document.head')
   final HeadElement $dom_head;
 
-  /// @domName Document.implementation; @docsEditable true
+  @DocsEditable @DomName('Document.implementation')
   final DomImplementation implementation;
 
-  /// Moved to [HtmlDocument].
-  /// @domName Document.lastModified; @docsEditable true
   @JSName('lastModified')
+  @DocsEditable @DomName('Document.lastModified')
   final String $dom_lastModified;
 
-  /// @domName Document.preferredStylesheetSet; @docsEditable true
   @JSName('preferredStylesheetSet')
+  @DocsEditable @DomName('Document.preferredStylesheetSet')
   final String $dom_preferredStylesheetSet;
 
-  /// @domName Document.readyState; @docsEditable true
+  @DocsEditable @DomName('Document.readyState')
   final String readyState;
 
-  /// Moved to [HtmlDocument].
-  /// @domName Document.referrer; @docsEditable true
   @JSName('referrer')
+  @DocsEditable @DomName('Document.referrer')
   final String $dom_referrer;
 
-  /// @domName Document.selectedStylesheetSet; @docsEditable true
   @JSName('selectedStylesheetSet')
+  @DocsEditable @DomName('Document.selectedStylesheetSet')
   String $dom_selectedStylesheetSet;
 
-  /// Moved to [HtmlDocument].
-  /// @domName Document.styleSheets; @docsEditable true
   @JSName('styleSheets')
+  @DocsEditable @DomName('Document.styleSheets')
   @Returns('_StyleSheetList') @Creates('_StyleSheetList')
   final List<StyleSheet> $dom_styleSheets;
 
-  /// Moved to [HtmlDocument].
-  /// @domName Document.title; @docsEditable true
   @JSName('title')
+  @DocsEditable @DomName('Document.title')
   String $dom_title;
 
-  /// Moved to [HtmlDocument].
-  /// @domName Document.webkitFullscreenElement; @docsEditable true
   @JSName('webkitFullscreenElement')
+  @DocsEditable @DomName('Document.webkitFullscreenElement')
   final Element $dom_webkitFullscreenElement;
 
-  /// Moved to [HtmlDocument].
-  /// @domName Document.webkitFullscreenEnabled; @docsEditable true
   @JSName('webkitFullscreenEnabled')
+  @DocsEditable @DomName('Document.webkitFullscreenEnabled')
   final bool $dom_webkitFullscreenEnabled;
 
-  /// Moved to [HtmlDocument].
-  /// @domName Document.webkitHidden; @docsEditable true
   @JSName('webkitHidden')
+  @DocsEditable @DomName('Document.webkitHidden')
   final bool $dom_webkitHidden;
 
-  /// Moved to [HtmlDocument].
-  /// @domName Document.webkitIsFullScreen; @docsEditable true
   @JSName('webkitIsFullScreen')
+  @DocsEditable @DomName('Document.webkitIsFullScreen')
   final bool $dom_webkitIsFullScreen;
 
-  /// Moved to [HtmlDocument].
-  /// @domName Document.webkitPointerLockElement; @docsEditable true
   @JSName('webkitPointerLockElement')
+  @DocsEditable @DomName('Document.webkitPointerLockElement')
   final Element $dom_webkitPointerLockElement;
 
-  /// Moved to [HtmlDocument].
-  /// @domName Document.webkitVisibilityState; @docsEditable true
   @JSName('webkitVisibilityState')
+  @DocsEditable @DomName('Document.webkitVisibilityState')
   final String $dom_webkitVisibilityState;
 
-  /// Use the [Range] constructor instead.
-  /// @domName Document.caretRangeFromPoint; @docsEditable true
   @JSName('caretRangeFromPoint')
+  @DocsEditable @DomName('Document.caretRangeFromPoint')
   Range $dom_caretRangeFromPoint(int x, int y) native;
 
-  /// @domName Document.createCDATASection; @docsEditable true
   @JSName('createCDATASection')
+  @DocsEditable @DomName('Document.createCDATASection')
   CDataSection createCDataSection(String data) native;
 
-  /// @domName Document.createDocumentFragment; @docsEditable true
+  @DocsEditable @DomName('Document.createDocumentFragment')
   DocumentFragment createDocumentFragment() native;
 
-  /// Deprecated: use new Element.tag(tagName) instead.
-  /// @domName Document.createElement; @docsEditable true
   @JSName('createElement')
+  @DocsEditable @DomName('Document.createElement')
   Element $dom_createElement(String tagName) native;
 
-  /// @domName Document.createElementNS; @docsEditable true
   @JSName('createElementNS')
+  @DocsEditable @DomName('Document.createElementNS')
   Element $dom_createElementNS(String namespaceURI, String qualifiedName) native;
 
-  /// @domName Document.createEvent; @docsEditable true
   @JSName('createEvent')
+  @DocsEditable @DomName('Document.createEvent')
   Event $dom_createEvent(String eventType) native;
 
-  /// @domName Document.createRange; @docsEditable true
   @JSName('createRange')
+  @DocsEditable @DomName('Document.createRange')
   Range $dom_createRange() native;
 
-  /// @domName Document.createTextNode; @docsEditable true
   @JSName('createTextNode')
+  @DocsEditable @DomName('Document.createTextNode')
   Text $dom_createTextNode(String data) native;
 
-  /// @domName Document.createTouch; @docsEditable true
   Touch $dom_createTouch(Window window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) {
     var target_1 = _convertDartToNative_EventTarget(target);
     return _$dom_createTouch_1(window, target_1, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
   }
   @JSName('createTouch')
+  @DocsEditable @DomName('Document.createTouch')
   Touch _$dom_createTouch_1(Window window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native;
 
-  /// Use the [TouchList] constructor isntead.
-  /// @domName Document.createTouchList; @docsEditable true
   @JSName('createTouchList')
+  @DocsEditable @DomName('Document.createTouchList')
   TouchList $dom_createTouchList() native;
 
-  /// Moved to [HtmlDocument].
-  /// @domName Document.elementFromPoint; @docsEditable true
   @JSName('elementFromPoint')
+  @DocsEditable @DomName('Document.elementFromPoint')
   Element $dom_elementFromPoint(int x, int y) native;
 
-  /// @domName Document.execCommand; @docsEditable true
+  @DocsEditable @DomName('Document.execCommand')
   bool execCommand(String command, bool userInterface, String value) native;
 
-  /// @domName Document.getCSSCanvasContext; @docsEditable true
   @JSName('getCSSCanvasContext')
+  @DocsEditable @DomName('Document.getCSSCanvasContext')
   CanvasRenderingContext $dom_getCssCanvasContext(String contextId, String name, int width, int height) native;
 
-  /// Deprecated: use query("#$elementId") instead.
-  /// @domName Document.getElementById; @docsEditable true
   @JSName('getElementById')
+  @DocsEditable @DomName('Document.getElementById')
   Element $dom_getElementById(String elementId) native;
 
-  /// @domName Document.getElementsByClassName; @docsEditable true
   @JSName('getElementsByClassName')
+  @DocsEditable @DomName('Document.getElementsByClassName')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> $dom_getElementsByClassName(String tagname) native;
 
-  /// @domName Document.getElementsByName; @docsEditable true
   @JSName('getElementsByName')
+  @DocsEditable @DomName('Document.getElementsByName')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> $dom_getElementsByName(String elementName) native;
 
-  /// @domName Document.getElementsByTagName; @docsEditable true
   @JSName('getElementsByTagName')
+  @DocsEditable @DomName('Document.getElementsByTagName')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> $dom_getElementsByTagName(String tagname) native;
 
-  /// @domName Document.queryCommandEnabled; @docsEditable true
+  @DocsEditable @DomName('Document.queryCommandEnabled')
   bool queryCommandEnabled(String command) native;
 
-  /// @domName Document.queryCommandIndeterm; @docsEditable true
+  @DocsEditable @DomName('Document.queryCommandIndeterm')
   bool queryCommandIndeterm(String command) native;
 
-  /// @domName Document.queryCommandState; @docsEditable true
+  @DocsEditable @DomName('Document.queryCommandState')
   bool queryCommandState(String command) native;
 
-  /// @domName Document.queryCommandSupported; @docsEditable true
+  @DocsEditable @DomName('Document.queryCommandSupported')
   bool queryCommandSupported(String command) native;
 
-  /// @domName Document.queryCommandValue; @docsEditable true
+  @DocsEditable @DomName('Document.queryCommandValue')
   String queryCommandValue(String command) native;
 
-  /// Deprecated: renamed to the shorter name [query].
-  /// @domName Document.querySelector; @docsEditable true
   @JSName('querySelector')
+  @DocsEditable @DomName('Document.querySelector')
   Element $dom_querySelector(String selectors) native;
 
-  /// Deprecated: use query("#$elementId") instead.
-  /// @domName Document.querySelectorAll; @docsEditable true
   @JSName('querySelectorAll')
+  @DocsEditable @DomName('Document.querySelectorAll')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> $dom_querySelectorAll(String selectors) native;
 
-  /// Moved to [HtmlDocument].
-  /// @domName Document.webkitCancelFullScreen; @docsEditable true
   @JSName('webkitCancelFullScreen')
+  @DocsEditable @DomName('Document.webkitCancelFullScreen')
   void $dom_webkitCancelFullScreen() native;
 
-  /// Moved to [HtmlDocument].
-  /// @domName Document.webkitExitFullscreen; @docsEditable true
   @JSName('webkitExitFullscreen')
+  @DocsEditable @DomName('Document.webkitExitFullscreen')
   void $dom_webkitExitFullscreen() native;
 
-  /// Moved to [HtmlDocument].
-  /// @domName Document.webkitExitPointerLock; @docsEditable true
   @JSName('webkitExitPointerLock')
+  @DocsEditable @DomName('Document.webkitExitPointerLock')
   void $dom_webkitExitPointerLock() native;
 
-  Stream<Event> get onAbort => abortEvent.forTarget(this);
+  Stream<Event> get onAbort => Element.abortEvent.forTarget(this);
 
-  Stream<Event> get onBeforeCopy => beforeCopyEvent.forTarget(this);
+  Stream<Event> get onBeforeCopy => Element.beforeCopyEvent.forTarget(this);
 
-  Stream<Event> get onBeforeCut => beforeCutEvent.forTarget(this);
+  Stream<Event> get onBeforeCut => Element.beforeCutEvent.forTarget(this);
 
-  Stream<Event> get onBeforePaste => beforePasteEvent.forTarget(this);
+  Stream<Event> get onBeforePaste => Element.beforePasteEvent.forTarget(this);
 
-  Stream<Event> get onBlur => blurEvent.forTarget(this);
+  Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
-  Stream<Event> get onChange => changeEvent.forTarget(this);
+  Stream<Event> get onChange => Element.changeEvent.forTarget(this);
 
-  Stream<MouseEvent> get onClick => clickEvent.forTarget(this);
+  Stream<MouseEvent> get onClick => Element.clickEvent.forTarget(this);
 
-  Stream<MouseEvent> get onContextMenu => contextMenuEvent.forTarget(this);
+  Stream<MouseEvent> get onContextMenu => Element.contextMenuEvent.forTarget(this);
 
-  Stream<Event> get onCopy => copyEvent.forTarget(this);
+  Stream<Event> get onCopy => Element.copyEvent.forTarget(this);
 
-  Stream<Event> get onCut => cutEvent.forTarget(this);
+  Stream<Event> get onCut => Element.cutEvent.forTarget(this);
 
-  Stream<Event> get onDoubleClick => doubleClickEvent.forTarget(this);
+  Stream<Event> get onDoubleClick => Element.doubleClickEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDrag => dragEvent.forTarget(this);
+  Stream<MouseEvent> get onDrag => Element.dragEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragEnd => dragEndEvent.forTarget(this);
+  Stream<MouseEvent> get onDragEnd => Element.dragEndEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragEnter => dragEnterEvent.forTarget(this);
+  Stream<MouseEvent> get onDragEnter => Element.dragEnterEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragLeave => dragLeaveEvent.forTarget(this);
+  Stream<MouseEvent> get onDragLeave => Element.dragLeaveEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragOver => dragOverEvent.forTarget(this);
+  Stream<MouseEvent> get onDragOver => Element.dragOverEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragStart => dragStartEvent.forTarget(this);
+  Stream<MouseEvent> get onDragStart => Element.dragStartEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDrop => dropEvent.forTarget(this);
+  Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
-  Stream<Event> get onError => errorEvent.forTarget(this);
+  Stream<Event> get onError => Element.errorEvent.forTarget(this);
 
-  Stream<Event> get onFocus => focusEvent.forTarget(this);
+  Stream<Event> get onFocus => Element.focusEvent.forTarget(this);
 
-  Stream<Event> get onInput => inputEvent.forTarget(this);
+  Stream<Event> get onInput => Element.inputEvent.forTarget(this);
 
-  Stream<Event> get onInvalid => invalidEvent.forTarget(this);
+  Stream<Event> get onInvalid => Element.invalidEvent.forTarget(this);
 
-  Stream<KeyboardEvent> get onKeyDown => keyDownEvent.forTarget(this);
+  Stream<KeyboardEvent> get onKeyDown => Element.keyDownEvent.forTarget(this);
 
-  Stream<KeyboardEvent> get onKeyPress => keyPressEvent.forTarget(this);
+  Stream<KeyboardEvent> get onKeyPress => Element.keyPressEvent.forTarget(this);
 
-  Stream<KeyboardEvent> get onKeyUp => keyUpEvent.forTarget(this);
+  Stream<KeyboardEvent> get onKeyUp => Element.keyUpEvent.forTarget(this);
 
-  Stream<Event> get onLoad => loadEvent.forTarget(this);
+  Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseDown => mouseDownEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseMove => mouseMoveEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseOut => mouseOutEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseOut => Element.mouseOutEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseOver => mouseOverEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseOver => Element.mouseOverEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseUp => mouseUpEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseUp => Element.mouseUpEvent.forTarget(this);
 
-  Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
+  Stream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent.forTarget(this);
 
-  Stream<Event> get onPaste => pasteEvent.forTarget(this);
+  Stream<Event> get onPaste => Element.pasteEvent.forTarget(this);
 
   Stream<Event> get onReadyStateChange => readyStateChangeEvent.forTarget(this);
 
-  Stream<Event> get onReset => resetEvent.forTarget(this);
+  Stream<Event> get onReset => Element.resetEvent.forTarget(this);
 
-  Stream<Event> get onScroll => scrollEvent.forTarget(this);
+  Stream<Event> get onScroll => Element.scrollEvent.forTarget(this);
 
-  Stream<Event> get onSearch => searchEvent.forTarget(this);
+  Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
-  Stream<Event> get onSelect => selectEvent.forTarget(this);
+  Stream<Event> get onSelect => Element.selectEvent.forTarget(this);
 
   Stream<Event> get onSelectionChange => selectionChangeEvent.forTarget(this);
 
-  Stream<Event> get onSelectStart => selectStartEvent.forTarget(this);
+  Stream<Event> get onSelectStart => Element.selectStartEvent.forTarget(this);
 
-  Stream<Event> get onSubmit => submitEvent.forTarget(this);
+  Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
-  Stream<TouchEvent> get onTouchCancel => touchCancelEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
 
-  Stream<TouchEvent> get onTouchEnd => touchEndEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
-  Stream<TouchEvent> get onTouchMove => touchMoveEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
-  Stream<TouchEvent> get onTouchStart => touchStartEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
-  Stream<Event> get onFullscreenChange => fullscreenChangeEvent.forTarget(this);
+  Stream<Event> get onFullscreenChange => Element.fullscreenChangeEvent.forTarget(this);
 
-  Stream<Event> get onFullscreenError => fullscreenErrorEvent.forTarget(this);
+  Stream<Event> get onFullscreenError => Element.fullscreenErrorEvent.forTarget(this);
 
   Stream<Event> get onPointerLockChange => pointerLockChangeEvent.forTarget(this);
 
@@ -6316,21 +6128,21 @@
   }
 }
 
-/// @docsEditable true
+@DocsEditable
 class DocumentEvents extends ElementEvents {
-  /// @docsEditable true
+  @DocsEditable
   DocumentEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get readyStateChange => this['readystatechange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get selectionChange => this['selectionchange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get pointerLockChange => this['webkitpointerlockchange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get pointerLockError => this['webkitpointerlockerror'];
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
@@ -6353,7 +6165,8 @@
   bool get frozen => true;
 }
 
-/// @domName DocumentFragment
+@DocsEditable
+@DomName('DocumentFragment')
 class DocumentFragment extends Node native "*DocumentFragment" {
   factory DocumentFragment() => _DocumentFragmentFactoryProvider.createDocumentFragment();
 
@@ -6601,16 +6414,17 @@
   }
 
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   ElementEvents get on =>
     new ElementEvents(this);
 
-  /// @domName DocumentFragment.querySelector; @docsEditable true
   @JSName('querySelector')
+  @DocsEditable @DomName('DocumentFragment.querySelector')
   Element $dom_querySelector(String selectors) native;
 
-  /// @domName DocumentFragment.querySelectorAll; @docsEditable true
   @JSName('querySelectorAll')
+  @DocsEditable @DomName('DocumentFragment.querySelectorAll')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> $dom_querySelectorAll(String selectors) native;
 
@@ -6620,134 +6434,97 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DocumentType; @docsEditable true
+
+@DocsEditable
+@DomName('DocumentType')
 class DocumentType extends Node native "*DocumentType" {
-
-  /// @domName DocumentType.entities; @docsEditable true
-  final NamedNodeMap entities;
-
-  /// @domName DocumentType.internalSubset; @docsEditable true
-  final String internalSubset;
-
-  /// @domName DocumentType.name; @docsEditable true
-  final String name;
-
-  /// @domName DocumentType.notations; @docsEditable true
-  final NamedNodeMap notations;
-
-  /// @domName DocumentType.publicId; @docsEditable true
-  final String publicId;
-
-  /// @domName DocumentType.systemId; @docsEditable true
-  final String systemId;
-
-  /// @domName DocumentType.remove; @docsEditable true
-  void remove() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMError; @docsEditable true
+
+@DocsEditable
+@DomName('DOMError')
 class DomError native "*DOMError" {
 
-  /// @domName DOMError.name; @docsEditable true
+  @DocsEditable @DomName('DOMError.name')
   final String name;
 }
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMException; @docsEditable true
+/// @domName DOMException
 class DomException native "*DOMException" {
 
-  static const int ABORT_ERR = 20;
+  static const String INDEX_SIZE = 'IndexSizeError';
+  static const String HIERARCHY_REQUEST = 'HierarchyRequestError';
+  static const String WRONG_DOCUMENT = 'WrongDocumentError';
+  static const String INVALID_CHARACTER = 'InvalidCharacterError';
+  static const String NO_MODIFICATION_ALLOWED = 'NoModificationAllowedError';
+  static const String NOT_FOUND = 'NotFoundError';
+  static const String NOT_SUPPORTED = 'NotSupportedError';
+  static const String INVALID_STATE = 'InvalidStateError';
+  static const String SYNTAX = 'SyntaxError';
+  static const String INVALID_MODIFICATION = 'InvalidModificationError';
+  static const String NAMESPACE = 'NamespaceError';
+  static const String INVALID_ACCESS = 'InvalidAccessError';
+  static const String TYPE_MISMATCH = 'TypeMismatchError';
+  static const String SECURITY = 'SecurityError';
+  static const String NETWORK = 'NetworkError';
+  static const String ABORT = 'AbortError';
+  static const String URL_MISMATCH = 'URLMismatchError';
+  static const String QUOTA_EXCEEDED = 'QuotaExceededError';
+  static const String TIMEOUT = 'TimeoutError';
+  static const String INVALID_NODE_TYPE = 'InvalidNodeTypeError';
+  static const String DATA_CLONE = 'DataCloneError';
 
-  static const int DATA_CLONE_ERR = 25;
+  String get name {
+    var errorName = JS('String', '#.name', this);
+    // Although Safari nightly has updated the name to SecurityError, Safari 5
+    // and 6 still return SECURITY_ERR.
+    if (_Device.isWebKit && errorName == 'SECURITY_ERR') return 'SecurityError';
+    // Chrome release still uses old string, remove this line when Chrome stable
+    // also prints out SyntaxError.
+    if (_Device.isWebKit && errorName == 'SYNTAX_ERR') return 'SyntaxError';
+    return errorName;
+  }
 
-  static const int DOMSTRING_SIZE_ERR = 2;
-
-  static const int HIERARCHY_REQUEST_ERR = 3;
-
-  static const int INDEX_SIZE_ERR = 1;
-
-  static const int INUSE_ATTRIBUTE_ERR = 10;
-
-  static const int INVALID_ACCESS_ERR = 15;
-
-  static const int INVALID_CHARACTER_ERR = 5;
-
-  static const int INVALID_MODIFICATION_ERR = 13;
-
-  static const int INVALID_NODE_TYPE_ERR = 24;
-
-  static const int INVALID_STATE_ERR = 11;
-
-  static const int NAMESPACE_ERR = 14;
-
-  static const int NETWORK_ERR = 19;
-
-  static const int NOT_FOUND_ERR = 8;
-
-  static const int NOT_SUPPORTED_ERR = 9;
-
-  static const int NO_DATA_ALLOWED_ERR = 6;
-
-  static const int NO_MODIFICATION_ALLOWED_ERR = 7;
-
-  static const int QUOTA_EXCEEDED_ERR = 22;
-
-  static const int SECURITY_ERR = 18;
-
-  static const int SYNTAX_ERR = 12;
-
-  static const int TIMEOUT_ERR = 23;
-
-  static const int TYPE_MISMATCH_ERR = 17;
-
-  static const int URL_MISMATCH_ERR = 21;
-
-  static const int VALIDATION_ERR = 16;
-
-  static const int WRONG_DOCUMENT_ERR = 4;
-
-  /// @domName DOMException.code; @docsEditable true
-  final int code;
-
-  /// @domName DOMException.message; @docsEditable true
+  @DocsEditable @DomName('DOMCoreException.message')
   final String message;
 
-  /// @domName DOMException.name; @docsEditable true
-  final String name;
-
-  /// @domName DOMException.toString; @docsEditable true
+  @DocsEditable @DomName('DOMCoreException.toString')
   String toString() native;
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMImplementation; @docsEditable true
+
+@DocsEditable
+@DomName('DOMImplementation')
 class DomImplementation native "*DOMImplementation" {
 
-  /// @domName DOMImplementation.createCSSStyleSheet; @docsEditable true
   @JSName('createCSSStyleSheet')
+  @DocsEditable @DomName('DOMImplementation.createCSSStyleSheet')
   CssStyleSheet createCssStyleSheet(String title, String media) native;
 
-  /// @domName DOMImplementation.createDocument; @docsEditable true
+  @DocsEditable @DomName('DOMImplementation.createDocument')
   Document createDocument(String namespaceURI, String qualifiedName, DocumentType doctype) native;
 
-  /// @domName DOMImplementation.createDocumentType; @docsEditable true
+  @DocsEditable @DomName('DOMImplementation.createDocumentType')
   DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) native;
 
-  /// @domName DOMImplementation.createHTMLDocument; @docsEditable true
   @JSName('createHTMLDocument')
+  @DocsEditable @DomName('DOMImplementation.createHTMLDocument')
   HtmlDocument createHtmlDocument(String title) native;
 
-  /// @domName DOMImplementation.hasFeature; @docsEditable true
+  @DocsEditable @DomName('DOMImplementation.hasFeature')
   bool hasFeature(String feature, String version) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6755,19 +6532,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MimeType; @docsEditable true
+
+@DocsEditable
+@DomName('MimeType')
 class DomMimeType native "*MimeType" {
 
-  /// @domName MimeType.description; @docsEditable true
+  @DocsEditable @DomName('DOMMimeType.description')
   final String description;
 
-  /// @domName MimeType.enabledPlugin; @docsEditable true
+  @DocsEditable @DomName('DOMMimeType.enabledPlugin')
   final DomPlugin enabledPlugin;
 
-  /// @domName MimeType.suffixes; @docsEditable true
+  @DocsEditable @DomName('DOMMimeType.suffixes')
   final String suffixes;
 
-  /// @domName MimeType.type; @docsEditable true
+  @DocsEditable @DomName('DOMMimeType.type')
   final String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6775,10 +6554,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MimeTypeArray; @docsEditable true
+
+@DocsEditable
+@DomName('MimeTypeArray')
 class DomMimeTypeArray implements JavaScriptIndexingBehavior, List<DomMimeType> native "*MimeTypeArray" {
 
-  /// @domName MimeTypeArray.length; @docsEditable true
+  @DocsEditable @DomName('DOMMimeTypeArray.length')
   int get length => JS("int", "#.length", this);
 
   DomMimeType operator[](int index) => JS("DomMimeType", "#[#]", this, index);
@@ -6799,50 +6580,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, DomMimeType)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(DomMimeType element) => Collections.contains(this, element);
+  bool contains(DomMimeType element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(DomMimeType element)) => Collections.forEach(this, f);
+  void forEach(void f(DomMimeType element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(DomMimeType element)) => new MappedList<DomMimeType, dynamic>(this, f);
+  List mappedBy(f(DomMimeType element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<DomMimeType> where(bool f(DomMimeType element)) => new WhereIterable<DomMimeType>(this, f);
+  Iterable<DomMimeType> where(bool f(DomMimeType element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(DomMimeType element)) => Collections.every(this, f);
+  bool every(bool f(DomMimeType element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(DomMimeType element)) => Collections.any(this, f);
+  bool any(bool f(DomMimeType element)) => IterableMixinWorkaround.any(this, f);
 
   List<DomMimeType> toList() => new List<DomMimeType>.from(this);
   Set<DomMimeType> toSet() => new Set<DomMimeType>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<DomMimeType> take(int n) => new ListView<DomMimeType>(this, 0, n);
+  List<DomMimeType> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<DomMimeType> takeWhile(bool test(DomMimeType value)) {
-    return new TakeWhileIterable<DomMimeType>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<DomMimeType> skip(int n) => new ListView<DomMimeType>(this, n, null);
+  List<DomMimeType> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<DomMimeType> skipWhile(bool test(DomMimeType value)) {
-    return new SkipWhileIterable<DomMimeType>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   DomMimeType firstMatching(bool test(DomMimeType value), { DomMimeType orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   DomMimeType lastMatching(bool test(DomMimeType value), {DomMimeType orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   DomMimeType singleMatching(bool test(DomMimeType value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   DomMimeType elementAt(int index) {
@@ -6900,16 +6681,36 @@
     throw new StateError("More than one element");
   }
 
-  DomMimeType min([int compare(DomMimeType a, DomMimeType b)]) => Collections.min(this, compare);
+  DomMimeType min([int compare(DomMimeType a, DomMimeType b)]) => IterableMixinWorkaround.min(this, compare);
 
-  DomMimeType max([int compare(DomMimeType a, DomMimeType b)]) => Collections.max(this, compare);
+  DomMimeType max([int compare(DomMimeType a, DomMimeType b)]) => IterableMixinWorkaround.max(this, compare);
 
   DomMimeType removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   DomMimeType removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(DomMimeType element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(DomMimeType element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<DomMimeType> from, [int startFrom]) {
@@ -6929,10 +6730,10 @@
 
   // -- end List<DomMimeType> mixins.
 
-  /// @domName MimeTypeArray.item; @docsEditable true
+  @DocsEditable @DomName('DOMMimeTypeArray.item')
   DomMimeType item(int index) native;
 
-  /// @domName MimeTypeArray.namedItem; @docsEditable true
+  @DocsEditable @DomName('DOMMimeTypeArray.namedItem')
   DomMimeType namedItem(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6940,14 +6741,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMParser; @docsEditable true
+
+@DocsEditable
+@DomName('DOMParser')
 class DomParser native "*DOMParser" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory DomParser() => DomParser._create();
   static DomParser _create() => JS('DomParser', 'new DOMParser()');
 
-  /// @domName DOMParser.parseFromString; @docsEditable true
+  @DocsEditable @DomName('DOMParser.parseFromString')
   Document parseFromString(String str, String contentType) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6955,25 +6758,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Plugin; @docsEditable true
+
+@DocsEditable
+@DomName('Plugin')
 class DomPlugin native "*Plugin" {
 
-  /// @domName Plugin.description; @docsEditable true
+  @DocsEditable @DomName('DOMPlugin.description')
   final String description;
 
-  /// @domName Plugin.filename; @docsEditable true
+  @DocsEditable @DomName('DOMPlugin.filename')
   final String filename;
 
-  /// @domName Plugin.length; @docsEditable true
+  @DocsEditable @DomName('DOMPlugin.length')
   final int length;
 
-  /// @domName Plugin.name; @docsEditable true
+  @DocsEditable @DomName('DOMPlugin.name')
   final String name;
 
-  /// @domName Plugin.item; @docsEditable true
+  @DocsEditable @DomName('DOMPlugin.item')
   DomMimeType item(int index) native;
 
-  /// @domName Plugin.namedItem; @docsEditable true
+  @DocsEditable @DomName('DOMPlugin.namedItem')
   DomMimeType namedItem(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6981,10 +6786,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PluginArray; @docsEditable true
+
+@DocsEditable
+@DomName('PluginArray')
 class DomPluginArray implements JavaScriptIndexingBehavior, List<DomPlugin> native "*PluginArray" {
 
-  /// @domName PluginArray.length; @docsEditable true
+  @DocsEditable @DomName('DOMPluginArray.length')
   int get length => JS("int", "#.length", this);
 
   DomPlugin operator[](int index) => JS("DomPlugin", "#[#]", this, index);
@@ -7005,50 +6812,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, DomPlugin)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(DomPlugin element) => Collections.contains(this, element);
+  bool contains(DomPlugin element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(DomPlugin element)) => Collections.forEach(this, f);
+  void forEach(void f(DomPlugin element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(DomPlugin element)) => new MappedList<DomPlugin, dynamic>(this, f);
+  List mappedBy(f(DomPlugin element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<DomPlugin> where(bool f(DomPlugin element)) => new WhereIterable<DomPlugin>(this, f);
+  Iterable<DomPlugin> where(bool f(DomPlugin element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(DomPlugin element)) => Collections.every(this, f);
+  bool every(bool f(DomPlugin element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(DomPlugin element)) => Collections.any(this, f);
+  bool any(bool f(DomPlugin element)) => IterableMixinWorkaround.any(this, f);
 
   List<DomPlugin> toList() => new List<DomPlugin>.from(this);
   Set<DomPlugin> toSet() => new Set<DomPlugin>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<DomPlugin> take(int n) => new ListView<DomPlugin>(this, 0, n);
+  List<DomPlugin> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<DomPlugin> takeWhile(bool test(DomPlugin value)) {
-    return new TakeWhileIterable<DomPlugin>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<DomPlugin> skip(int n) => new ListView<DomPlugin>(this, n, null);
+  List<DomPlugin> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<DomPlugin> skipWhile(bool test(DomPlugin value)) {
-    return new SkipWhileIterable<DomPlugin>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   DomPlugin firstMatching(bool test(DomPlugin value), { DomPlugin orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   DomPlugin lastMatching(bool test(DomPlugin value), {DomPlugin orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   DomPlugin singleMatching(bool test(DomPlugin value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   DomPlugin elementAt(int index) {
@@ -7106,16 +6913,36 @@
     throw new StateError("More than one element");
   }
 
-  DomPlugin min([int compare(DomPlugin a, DomPlugin b)]) => Collections.min(this, compare);
+  DomPlugin min([int compare(DomPlugin a, DomPlugin b)]) => IterableMixinWorkaround.min(this, compare);
 
-  DomPlugin max([int compare(DomPlugin a, DomPlugin b)]) => Collections.max(this, compare);
+  DomPlugin max([int compare(DomPlugin a, DomPlugin b)]) => IterableMixinWorkaround.max(this, compare);
 
   DomPlugin removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   DomPlugin removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(DomPlugin element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(DomPlugin element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<DomPlugin> from, [int startFrom]) {
@@ -7135,13 +6962,13 @@
 
   // -- end List<DomPlugin> mixins.
 
-  /// @domName PluginArray.item; @docsEditable true
+  @DocsEditable @DomName('DOMPluginArray.item')
   DomPlugin item(int index) native;
 
-  /// @domName PluginArray.namedItem; @docsEditable true
+  @DocsEditable @DomName('DOMPluginArray.namedItem')
   DomPlugin namedItem(String name) native;
 
-  /// @domName PluginArray.refresh; @docsEditable true
+  @DocsEditable @DomName('DOMPluginArray.refresh')
   void refresh(bool reload) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7149,85 +6976,87 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Selection; @docsEditable true
+
+@DocsEditable
+@DomName('Selection')
 class DomSelection native "*Selection" {
 
-  /// @domName Selection.anchorNode; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.anchorNode')
   final Node anchorNode;
 
-  /// @domName Selection.anchorOffset; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.anchorOffset')
   final int anchorOffset;
 
-  /// @domName Selection.baseNode; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.baseNode')
   final Node baseNode;
 
-  /// @domName Selection.baseOffset; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.baseOffset')
   final int baseOffset;
 
-  /// @domName Selection.extentNode; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.extentNode')
   final Node extentNode;
 
-  /// @domName Selection.extentOffset; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.extentOffset')
   final int extentOffset;
 
-  /// @domName Selection.focusNode; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.focusNode')
   final Node focusNode;
 
-  /// @domName Selection.focusOffset; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.focusOffset')
   final int focusOffset;
 
-  /// @domName Selection.isCollapsed; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.isCollapsed')
   final bool isCollapsed;
 
-  /// @domName Selection.rangeCount; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.rangeCount')
   final int rangeCount;
 
-  /// @domName Selection.type; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.type')
   final String type;
 
-  /// @domName Selection.addRange; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.addRange')
   void addRange(Range range) native;
 
-  /// @domName Selection.collapse; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.collapse')
   void collapse(Node node, int index) native;
 
-  /// @domName Selection.collapseToEnd; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.collapseToEnd')
   void collapseToEnd() native;
 
-  /// @domName Selection.collapseToStart; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.collapseToStart')
   void collapseToStart() native;
 
-  /// @domName Selection.containsNode; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.containsNode')
   bool containsNode(Node node, bool allowPartial) native;
 
-  /// @domName Selection.deleteFromDocument; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.deleteFromDocument')
   void deleteFromDocument() native;
 
-  /// @domName Selection.empty; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.empty')
   void empty() native;
 
-  /// @domName Selection.extend; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.extend')
   void extend(Node node, int offset) native;
 
-  /// @domName Selection.getRangeAt; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.getRangeAt')
   Range getRangeAt(int index) native;
 
-  /// @domName Selection.modify; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.modify')
   void modify(String alter, String direction, String granularity) native;
 
-  /// @domName Selection.removeAllRanges; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.removeAllRanges')
   void removeAllRanges() native;
 
-  /// @domName Selection.selectAllChildren; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.selectAllChildren')
   void selectAllChildren(Node node) native;
 
-  /// @domName Selection.setBaseAndExtent; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.setBaseAndExtent')
   void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) native;
 
-  /// @domName Selection.setPosition; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.setPosition')
   void setPosition(Node node, int offset) native;
 
-  /// @domName Selection.toString; @docsEditable true
+  @DocsEditable @DomName('DOMSelection.toString')
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7235,10 +7064,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMSettableTokenList; @docsEditable true
+
+@DocsEditable
+@DomName('DOMSettableTokenList')
 class DomSettableTokenList extends DomTokenList native "*DOMSettableTokenList" {
 
-  /// @domName DOMSettableTokenList.value; @docsEditable true
+  @DocsEditable @DomName('DOMSettableTokenList.value')
   String value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7246,10 +7077,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMStringList; @docsEditable true
+
+@DocsEditable
+@DomName('DOMStringList')
 class DomStringList implements JavaScriptIndexingBehavior, List<String> native "*DOMStringList" {
 
-  /// @domName DOMStringList.length; @docsEditable true
+  @DocsEditable @DomName('DOMStringList.length')
   int get length => JS("int", "#.length", this);
 
   String operator[](int index) => JS("String", "#[#]", this, index);
@@ -7270,50 +7103,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, String)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
   // contains() defined by IDL.
 
-  void forEach(void f(String element)) => Collections.forEach(this, f);
+  void forEach(void f(String element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(String element)) => new MappedList<String, dynamic>(this, f);
+  List mappedBy(f(String element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<String> where(bool f(String element)) => new WhereIterable<String>(this, f);
+  Iterable<String> where(bool f(String element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(String element)) => Collections.every(this, f);
+  bool every(bool f(String element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(String element)) => Collections.any(this, f);
+  bool any(bool f(String element)) => IterableMixinWorkaround.any(this, f);
 
   List<String> toList() => new List<String>.from(this);
   Set<String> toSet() => new Set<String>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<String> take(int n) => new ListView<String>(this, 0, n);
+  List<String> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<String> takeWhile(bool test(String value)) {
-    return new TakeWhileIterable<String>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<String> skip(int n) => new ListView<String>(this, n, null);
+  List<String> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<String> skipWhile(bool test(String value)) {
-    return new SkipWhileIterable<String>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   String firstMatching(bool test(String value), { String orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   String lastMatching(bool test(String value), {String orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   String singleMatching(bool test(String value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   String elementAt(int index) {
@@ -7371,16 +7204,36 @@
     throw new StateError("More than one element");
   }
 
-  String min([int compare(String a, String b)]) => Collections.min(this, compare);
+  String min([int compare(String a, String b)]) => IterableMixinWorkaround.min(this, compare);
 
-  String max([int compare(String a, String b)]) => Collections.max(this, compare);
+  String max([int compare(String a, String b)]) => IterableMixinWorkaround.max(this, compare);
 
   String removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   String removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(String element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(String element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<String> from, [int startFrom]) {
@@ -7400,10 +7253,10 @@
 
   // -- end List<String> mixins.
 
-  /// @domName DOMStringList.contains; @docsEditable true
+  @DocsEditable @DomName('DOMStringList.contains')
   bool contains(String string) native;
 
-  /// @domName DOMStringList.item; @docsEditable true
+  @DocsEditable @DomName('DOMStringList.item')
   String item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7411,7 +7264,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMStringMap
+@DocsEditable
+@DomName('DOMStringMap')
 abstract class DomStringMap {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7419,22 +7273,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMTokenList; @docsEditable true
+
+@DocsEditable
+@DomName('DOMTokenList')
 class DomTokenList native "*DOMTokenList" {
 
-  /// @domName DOMTokenList.length; @docsEditable true
+  @DocsEditable @DomName('DOMTokenList.length')
   final int length;
 
-  /// @domName DOMTokenList.contains; @docsEditable true
+  @DocsEditable @DomName('DOMTokenList.contains')
   bool contains(String token) native;
 
-  /// @domName DOMTokenList.item; @docsEditable true
+  @DocsEditable @DomName('DOMTokenList.item')
   String item(int index) native;
 
-  /// @domName DOMTokenList.toString; @docsEditable true
+  @DocsEditable @DomName('DOMTokenList.toString')
   String toString() native;
 
-  /// @domName DOMTokenList.toggle; @docsEditable true
+  @DocsEditable @DomName('DOMTokenList.toggle')
   bool toggle(String token, [bool force]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7496,46 +7352,47 @@
   }
 
   String join([String separator]) {
-    return Collections.joinList(this, separator);
+    return IterableMixinWorkaround.joinList(this, separator);
   }
 
   List mappedBy(f(Element element)) {
-    return new MappedList<Element, dynamic>(this, f);
+    return IterableMixinWorkaround.mappedByList(this, f);
   }
 
-  Iterable<Element> where(bool f(Element element))
-      => new WhereIterable(this, f);
+  Iterable<Element> where(bool f(Element element)) {
+    return IterableMixinWorkaround.where(this, f);
+  }
 
   bool get isEmpty {
     return _element.$dom_firstElementChild == null;
   }
 
   List<Element> take(int n) {
-    return new ListView<Element>(this, 0, n);
+    return IterableMixinWorkaround.takeList(this, n);
   }
 
   Iterable<Element> takeWhile(bool test(Element value)) {
-    return new TakeWhileIterable<Element>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
   List<Element> skip(int n) {
-    return new ListView<Element>(this, n, null);
+    return IterableMixinWorkaround.skipList(this, n);
   }
 
   Iterable<Element> skipWhile(bool test(Element value)) {
-    return new SkipWhileIterable<Element>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Element firstMatching(bool test(Element value), {Element orElse()}) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Element lastMatching(bool test(Element value), {Element orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Element singleMatching(bool test(Element value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Element elementAt(int index) {
@@ -7554,10 +7411,10 @@
     _element.$dom_replaceChild(value, _childElements[index]);
   }
 
-   void set length(int newLength) {
-     // TODO(jacobr): remove children when length is reduced.
-     throw new UnsupportedError('');
-   }
+  void set length(int newLength) {
+    // TODO(jacobr): remove children when length is reduced.
+    throw new UnsupportedError('');
+  }
 
   Element add(Element value) {
     _element.$dom_appendChild(value);
@@ -7580,13 +7437,38 @@
 
   dynamic reduce(dynamic initialValue,
       dynamic combine(dynamic previousValue, Element element)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
   void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
     throw new UnimplementedError();
   }
 
+  void remove(Object object) {
+    if (object is Element) {
+      Element element = object;
+      if (identical(element.parentNode, this)) {
+        _element.$dom_removeChild(element);
+      }
+    }
+  }
+
+  void removeAll(Iterable elements) {
+    Collections.removeAll(this, elements);
+  }
+
+  void retainAll(Iterable elements) {
+    Collections.retainAll(this, elements);
+  }
+
+  void removeMatching(bool test(Element element)) {
+    Collections.removeMatching(this, test);
+  }
+
+  void retainMatching(bool test(Element element)) {
+    Collections.retainMatching(this, test);
+  }
+
   void removeRange(int start, int rangeLength) {
     throw new UnimplementedError();
   }
@@ -7648,11 +7530,11 @@
   }
 
   Element min([int compare(Element a, Element b)]) {
-    return Collections.min(this, compare);
+    return IterableMixinWorkaround.min(this, compare);
   }
 
   Element max([int compare(Element a, Element b)]) {
-    return Collections.max(this, compare);
+    return IterableMixinWorkaround.max(this, compare);
   }
 }
 
@@ -7679,15 +7561,16 @@
   }
 
   String join([String separator]) {
-    return Collections.joinList(this, separator);
+    return IterableMixinWorkaround.joinList(this, separator);
   }
 
   List mappedBy(f(Element element)) {
-    return new MappedList<Element, dynamic>(this, f);
+    return IterableMixinWorkaround.mappedByList(this, f);
   }
 
-  Iterable<Element> where(bool f(Element element))
-      => new WhereIterable(this, f);
+  Iterable<Element> where(bool f(Element element)) {
+    return IterableMixinWorkaround.where(this, f);
+  }
 
   bool every(bool f(Element element)) {
     for(Element element in this) {
@@ -7711,31 +7594,31 @@
   Set<Element> toSet() => new Set<Element>.from(this);
 
   List<Element> take(int n) {
-    return new ListView<Element>(this, 0, n);
+    return IterableMixinWorkaround.takeList(this, n);
   }
 
   Iterable<Element> takeWhile(bool test(Element value)) {
-    return new TakeWhileIterable<Element>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
   List<Element> skip(int n) {
-    return new ListView<Element>(this, n, null);
+    return IterableMixinWorkaround.skipList(this, n);
   }
 
   Iterable<Element> skipWhile(bool test(Element value)) {
-    return new SkipWhileIterable<Element>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Element firstMatching(bool test(Element value), {Element orElse()}) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Element lastMatching(bool test(Element value), {Element orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Element singleMatching(bool test(Element value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Element elementAt(int index) {
@@ -7776,7 +7659,7 @@
 
   dynamic reduce(dynamic initialValue,
       dynamic combine(dynamic previousValue, Element element)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
   void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
@@ -7812,6 +7695,26 @@
     throw new UnsupportedError('');
   }
 
+  void remove(Object element) {
+    throw new UnsupportedError('');
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError('');
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError('');
+  }
+
+  void removeMatching(bool test(Element element)) {
+    throw new UnsupportedError('');
+  }
+
+  void retainMatching(bool test(Element element)) {
+    throw new UnsupportedError('');
+  }
+
   Element get first => _nodeList.first;
 
   Element get last => _nodeList.last;
@@ -7819,11 +7722,11 @@
   Element get single => _nodeList.single;
 
   Element min([int compare(Element a, Element b)]) {
-    return Collections.min(this, compare);
+    return IterableMixinWorkaround.min(this, compare);
   }
 
   Element max([int compare(Element a, Element b)]) {
-    return Collections.max(this, compare);
+    return IterableMixinWorkaround.max(this, compare);
   }
 }
 
@@ -8162,6 +8065,23 @@
   @Creates('Null')  // Set from Dart code; does not instantiate a native type.
   var xtag;
 
+  static const EventStreamProvider<WheelEvent> mouseWheelEvent =
+      const _CustomEventStreamProvider<WheelEvent>(
+        Element._determineMouseWheelEventType);
+
+  static String _determineMouseWheelEventType(EventTarget e) {
+    if (JS('bool', '#.onwheel !== undefined', e)) {
+      // W3C spec, and should be IE9+, but IE has a bug exposing onwheel.
+      return 'wheel';
+    } else if (JS('bool', '#.onmousewheel !== undefined', e)) {
+      // Chrome & IE
+      return 'mousewheel';
+    } else {
+      // Firefox
+      return 'DOMMouseScroll';
+    }
+  }
+
   /**
    * Creates a text node and inserts it into the DOM at the specified location.
    *
@@ -8369,225 +8289,225 @@
 
   static const EventStreamProvider<Event> fullscreenErrorEvent = const EventStreamProvider<Event>('webkitfullscreenerror');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   ElementEvents get on =>
     new ElementEvents(this);
 
-  /// @domName HTMLElement.children; @docsEditable true
   @JSName('children')
+  @DocsEditable @DomName('Element.children')
   final HtmlCollection $dom_children;
 
-  /// @domName HTMLElement.contentEditable; @docsEditable true
+  @DocsEditable @DomName('Element.contentEditable')
   String contentEditable;
 
-  /// @domName HTMLElement.dir; @docsEditable true
+  @DocsEditable @DomName('Element.dir')
   String dir;
 
-  /// @domName HTMLElement.draggable; @docsEditable true
+  @DocsEditable @DomName('Element.draggable')
   bool draggable;
 
-  /// @domName HTMLElement.hidden; @docsEditable true
+  @DocsEditable @DomName('Element.hidden')
   bool hidden;
 
-  /// @domName HTMLElement.id; @docsEditable true
+  @DocsEditable @DomName('Element.id')
   String id;
 
-  /// @domName HTMLElement.innerHTML; @docsEditable true
   @JSName('innerHTML')
+  @DocsEditable @DomName('Element.innerHTML')
   String innerHtml;
 
-  /// @domName HTMLElement.isContentEditable; @docsEditable true
+  @DocsEditable @DomName('Element.isContentEditable')
   final bool isContentEditable;
 
-  /// @domName HTMLElement.lang; @docsEditable true
+  @DocsEditable @DomName('Element.lang')
   String lang;
 
-  /// @domName HTMLElement.outerHTML; @docsEditable true
   @JSName('outerHTML')
+  @DocsEditable @DomName('Element.outerHTML')
   final String outerHtml;
 
-  /// @domName HTMLElement.spellcheck; @docsEditable true
+  @DocsEditable @DomName('Element.spellcheck')
   bool spellcheck;
 
-  /// @domName HTMLElement.tabIndex; @docsEditable true
+  @DocsEditable @DomName('Element.tabIndex')
   int tabIndex;
 
-  /// @domName HTMLElement.title; @docsEditable true
+  @DocsEditable @DomName('Element.title')
   String title;
 
-  /// @domName HTMLElement.translate; @docsEditable true
+  @DocsEditable @DomName('Element.translate')
   bool translate;
 
-  /// @domName HTMLElement.webkitdropzone; @docsEditable true
+  @DocsEditable @DomName('Element.webkitdropzone')
   String webkitdropzone;
 
-  /// @domName HTMLElement.click; @docsEditable true
+  @DocsEditable @DomName('Element.click')
   void click() native;
 
   static const int ALLOW_KEYBOARD_INPUT = 1;
 
-  /// @domName Element.childElementCount; @docsEditable true
   @JSName('childElementCount')
+  @DocsEditable @DomName('Element.childElementCount')
   final int $dom_childElementCount;
 
-  /// @domName Element.className; @docsEditable true
   @JSName('className')
+  @DocsEditable @DomName('Element.className')
   String $dom_className;
 
-  /// @domName Element.clientHeight; @docsEditable true
+  @DocsEditable @DomName('Element.clientHeight')
   final int clientHeight;
 
-  /// @domName Element.clientLeft; @docsEditable true
+  @DocsEditable @DomName('Element.clientLeft')
   final int clientLeft;
 
-  /// @domName Element.clientTop; @docsEditable true
+  @DocsEditable @DomName('Element.clientTop')
   final int clientTop;
 
-  /// @domName Element.clientWidth; @docsEditable true
+  @DocsEditable @DomName('Element.clientWidth')
   final int clientWidth;
 
-  /// @domName Element.dataset; @docsEditable true
+  @DocsEditable @DomName('Element.dataset')
   final Map<String, String> dataset;
 
-  /// @domName Element.firstElementChild; @docsEditable true
   @JSName('firstElementChild')
+  @DocsEditable @DomName('Element.firstElementChild')
   final Element $dom_firstElementChild;
 
-  /// @domName Element.lastElementChild; @docsEditable true
   @JSName('lastElementChild')
+  @DocsEditable @DomName('Element.lastElementChild')
   final Element $dom_lastElementChild;
 
-  /// @domName Element.nextElementSibling; @docsEditable true
+  @DocsEditable @DomName('Element.nextElementSibling')
   final Element nextElementSibling;
 
-  /// @domName Element.offsetHeight; @docsEditable true
+  @DocsEditable @DomName('Element.offsetHeight')
   final int offsetHeight;
 
-  /// @domName Element.offsetLeft; @docsEditable true
+  @DocsEditable @DomName('Element.offsetLeft')
   final int offsetLeft;
 
-  /// @domName Element.offsetParent; @docsEditable true
+  @DocsEditable @DomName('Element.offsetParent')
   final Element offsetParent;
 
-  /// @domName Element.offsetTop; @docsEditable true
+  @DocsEditable @DomName('Element.offsetTop')
   final int offsetTop;
 
-  /// @domName Element.offsetWidth; @docsEditable true
+  @DocsEditable @DomName('Element.offsetWidth')
   final int offsetWidth;
 
-  /// @domName Element.previousElementSibling; @docsEditable true
+  @DocsEditable @DomName('Element.previousElementSibling')
   final Element previousElementSibling;
 
-  /// @domName Element.scrollHeight; @docsEditable true
+  @DocsEditable @DomName('Element.scrollHeight')
   final int scrollHeight;
 
-  /// @domName Element.scrollLeft; @docsEditable true
+  @DocsEditable @DomName('Element.scrollLeft')
   int scrollLeft;
 
-  /// @domName Element.scrollTop; @docsEditable true
+  @DocsEditable @DomName('Element.scrollTop')
   int scrollTop;
 
-  /// @domName Element.scrollWidth; @docsEditable true
+  @DocsEditable @DomName('Element.scrollWidth')
   final int scrollWidth;
 
-  /// @domName Element.style; @docsEditable true
+  @DocsEditable @DomName('Element.style')
   final CssStyleDeclaration style;
 
-  /// @domName Element.tagName; @docsEditable true
+  @DocsEditable @DomName('Element.tagName')
   final String tagName;
 
-  /// @domName Element.webkitPseudo; @docsEditable true
+  @DocsEditable @DomName('Element.webkitPseudo')
   String webkitPseudo;
 
-  /// @domName Element.webkitShadowRoot; @docsEditable true
+  @DocsEditable @DomName('Element.webkitShadowRoot')
   final ShadowRoot webkitShadowRoot;
 
-  /// @domName Element.blur; @docsEditable true
+  @DocsEditable @DomName('Element.blur')
   void blur() native;
 
-  /// @domName Element.focus; @docsEditable true
+  @DocsEditable @DomName('Element.focus')
   void focus() native;
 
-  /// @domName Element.getAttribute; @docsEditable true
   @JSName('getAttribute')
+  @DocsEditable @DomName('Element.getAttribute')
   String $dom_getAttribute(String name) native;
 
-  /// @domName Element.getAttributeNS; @docsEditable true
   @JSName('getAttributeNS')
+  @DocsEditable @DomName('Element.getAttributeNS')
   String $dom_getAttributeNS(String namespaceURI, String localName) native;
 
-  /// @domName Element.getBoundingClientRect; @docsEditable true
+  @DocsEditable @DomName('Element.getBoundingClientRect')
   ClientRect getBoundingClientRect() native;
 
-  /// @domName Element.getClientRects; @docsEditable true
+  @DocsEditable @DomName('Element.getClientRects')
   @Returns('_ClientRectList') @Creates('_ClientRectList')
   List<ClientRect> getClientRects() native;
 
-  /// @domName Element.getElementsByClassName; @docsEditable true
   @JSName('getElementsByClassName')
+  @DocsEditable @DomName('Element.getElementsByClassName')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> $dom_getElementsByClassName(String name) native;
 
-  /// @domName Element.getElementsByTagName; @docsEditable true
   @JSName('getElementsByTagName')
+  @DocsEditable @DomName('Element.getElementsByTagName')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> $dom_getElementsByTagName(String name) native;
 
-  /// @domName Element.hasAttribute; @docsEditable true
   @JSName('hasAttribute')
+  @DocsEditable @DomName('Element.hasAttribute')
   bool $dom_hasAttribute(String name) native;
 
-  /// @domName Element.hasAttributeNS; @docsEditable true
   @JSName('hasAttributeNS')
+  @DocsEditable @DomName('Element.hasAttributeNS')
   bool $dom_hasAttributeNS(String namespaceURI, String localName) native;
 
-  /// @domName Element.querySelector; @docsEditable true
   @JSName('querySelector')
+  @DocsEditable @DomName('Element.querySelector')
   Element $dom_querySelector(String selectors) native;
 
-  /// @domName Element.querySelectorAll; @docsEditable true
   @JSName('querySelectorAll')
+  @DocsEditable @DomName('Element.querySelectorAll')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> $dom_querySelectorAll(String selectors) native;
 
-  /// @domName Element.removeAttribute; @docsEditable true
   @JSName('removeAttribute')
+  @DocsEditable @DomName('Element.removeAttribute')
   void $dom_removeAttribute(String name) native;
 
-  /// @domName Element.removeAttributeNS; @docsEditable true
   @JSName('removeAttributeNS')
+  @DocsEditable @DomName('Element.removeAttributeNS')
   void $dom_removeAttributeNS(String namespaceURI, String localName) native;
 
-  /// @domName Element.scrollByLines; @docsEditable true
+  @DocsEditable @DomName('Element.scrollByLines')
   void scrollByLines(int lines) native;
 
-  /// @domName Element.scrollByPages; @docsEditable true
+  @DocsEditable @DomName('Element.scrollByPages')
   void scrollByPages(int pages) native;
 
-  /// @domName Element.scrollIntoViewIfNeeded; @docsEditable true
   @JSName('scrollIntoViewIfNeeded')
+  @DocsEditable @DomName('Element.scrollIntoViewIfNeeded')
   void scrollIntoView([bool centerIfNeeded]) native;
 
-  /// @domName Element.setAttribute; @docsEditable true
   @JSName('setAttribute')
+  @DocsEditable @DomName('Element.setAttribute')
   void $dom_setAttribute(String name, String value) native;
 
-  /// @domName Element.setAttributeNS; @docsEditable true
   @JSName('setAttributeNS')
+  @DocsEditable @DomName('Element.setAttributeNS')
   void $dom_setAttributeNS(String namespaceURI, String qualifiedName, String value) native;
 
-  /// @domName Element.webkitCreateShadowRoot; @docsEditable true
   @JSName('webkitCreateShadowRoot')
-  @SupportedBrowser(SupportedBrowser.CHROME, '25') @Experimental()
+  @DocsEditable @DomName('Element.webkitCreateShadowRoot') @SupportedBrowser(SupportedBrowser.CHROME, '25') @Experimental()
   ShadowRoot createShadowRoot() native;
 
-  /// @domName Element.webkitRequestFullScreen; @docsEditable true
+  @DocsEditable @DomName('Element.webkitRequestFullScreen')
   void webkitRequestFullScreen(int flags) native;
 
-  /// @domName Element.webkitRequestFullscreen; @docsEditable true
+  @DocsEditable @DomName('Element.webkitRequestFullscreen')
   void webkitRequestFullscreen() native;
 
-  /// @domName Element.webkitRequestPointerLock; @docsEditable true
+  @DocsEditable @DomName('Element.webkitRequestPointerLock')
   void webkitRequestPointerLock() native;
 
   Stream<Event> get onAbort => abortEvent.forTarget(this);
@@ -8652,6 +8572,8 @@
 
   Stream<MouseEvent> get onMouseUp => mouseUpEvent.forTarget(this);
 
+  Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
+
   Stream<Event> get onPaste => pasteEvent.forTarget(this);
 
   Stream<Event> get onReset => resetEvent.forTarget(this);
@@ -8688,11 +8610,12 @@
 
 final _START_TAG_REGEXP = new RegExp('<(\\w+)');
 class _ElementFactoryProvider {
-  static final _CUSTOM_PARENT_TAG_MAP = const {
+  static const _CUSTOM_PARENT_TAG_MAP = const {
     'body' : 'html',
     'head' : 'html',
     'caption' : 'table',
     'td': 'tr',
+    'th': 'tr',
     'colgroup': 'table',
     'col' : 'colgroup',
     'tr' : 'tbody',
@@ -8702,7 +8625,20 @@
     'track' : 'audio',
   };
 
-  /** @domName Document.createElement */
+  // TODO(jmesserly): const set would be better
+  static const _TABLE_TAGS = const {
+    'caption': null,
+    'col': null,
+    'colgroup': null,
+    'tbody': null,
+    'td': null,
+    'tfoot': null,
+    'th': null,
+    'thead': null,
+    'tr': null,
+  };
+
+  @DomName('Document.createElement')
   static Element createElement_html(String html) {
     // TODO(jacobr): this method can be made more robust and performant.
     // 1) Cache the dummy parent elements required to use innerHTML rather than
@@ -8715,30 +8651,90 @@
     final match = _START_TAG_REGEXP.firstMatch(html);
     if (match != null) {
       tag = match.group(1).toLowerCase();
-      if (_CUSTOM_PARENT_TAG_MAP.containsKey(tag)) {
-        parentTag = _CUSTOM_PARENT_TAG_MAP[tag];
+      if (_Device.isIE && _TABLE_TAGS.containsKey(tag)) {
+        return _createTableForIE(html, tag);
       }
+      parentTag = _CUSTOM_PARENT_TAG_MAP[tag];
+      if (parentTag == null) parentTag = 'div';
     }
-    final Element temp = new Element.tag(parentTag);
+
+    final temp = new Element.tag(parentTag);
     temp.innerHtml = html;
 
     Element element;
     if (temp.children.length == 1) {
       element = temp.children[0];
     } else if (parentTag == 'html' && temp.children.length == 2) {
-      // Work around for edge case in WebKit and possibly other browsers where
-      // both body and head elements are created even though the inner html
-      // only contains a head or body element.
+      // In html5 the root <html> tag will always have a <body> and a <head>,
+      // even though the inner html only contains one of them.
       element = temp.children[tag == 'head' ? 0 : 1];
     } else {
-      throw new ArgumentError('HTML had ${temp.children.length} '
-          'top level elements but 1 expected');
+      _singleNode(temp.children);
     }
     element.remove();
     return element;
   }
 
-  /** @domName Document.createElement */
+  /**
+   * IE table elements don't support innerHTML (even in standards mode).
+   * Instead we use a div and inject the table element in the innerHtml string.
+   * This technique works on other browsers too, but it's probably slower,
+   * so we only use it when running on IE.
+   *
+   * See also innerHTML:
+   * <http://msdn.microsoft.com/en-us/library/ie/ms533897(v=vs.85).aspx>
+   * and Building Tables Dynamically:
+   * <http://msdn.microsoft.com/en-us/library/ie/ms532998(v=vs.85).aspx>.
+   */
+  static Element _createTableForIE(String html, String tag) {
+    var div = new Element.tag('div');
+    div.innerHtml = '<table>$html</table>';
+    var table = _singleNode(div.children);
+    Element element;
+    switch (tag) {
+      case 'td':
+      case 'th':
+        element = _singleNode(_singleNode(table.rows).cells);
+        break;
+      case 'tr':
+        element = _singleNode(table.rows);
+        break;
+      case 'tbody':
+        element = _singleNode(table.tBodies);
+        break;
+      case 'thead':
+        element = table.tHead;
+        break;
+      case 'tfoot':
+        element = table.tFoot;
+        break;
+      case 'caption':
+        element = table.caption;
+        break;
+      case 'colgroup':
+        element = _getColgroup(table);
+        break;
+      case 'col':
+        element = _singleNode(_getColgroup(table).children);
+        break;
+    }
+    element.remove();
+    return element;
+  }
+
+  static TableColElement _getColgroup(TableElement table) {
+    // TODO(jmesserly): is there a better way to do this?
+    return _singleNode(table.children.where((n) => n.tagName == 'COLGROUP')
+        .toList());
+  }
+
+  static Node _singleNode(List<Node> list) {
+    if (list.length == 1) return list[0];
+    throw new ArgumentError('HTML had ${list.length} '
+        'top level elements but 1 expected');
+  }
+
+  @DomName('Document.createElement')
   // Optimization to improve performance until the dart2js compiler inlines this
   // method.
   static dynamic createElement_tag(String tag) =>
@@ -8752,145 +8748,145 @@
 class ElementEvents extends Events {
   ElementEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get beforeCopy => this['beforecopy'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get beforeCut => this['beforecut'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get beforePaste => this['beforepaste'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get blur => this['blur'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get change => this['change'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get click => this['click'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get contextMenu => this['contextmenu'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get copy => this['copy'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get cut => this['cut'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get doubleClick => this['dblclick'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get drag => this['drag'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragEnd => this['dragend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragEnter => this['dragenter'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragLeave => this['dragleave'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragOver => this['dragover'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragStart => this['dragstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get drop => this['drop'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get focus => this['focus'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get input => this['input'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get invalid => this['invalid'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyDown => this['keydown'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyPress => this['keypress'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyUp => this['keyup'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get load => this['load'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseDown => this['mousedown'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseMove => this['mousemove'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseOut => this['mouseout'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseOver => this['mouseover'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseUp => this['mouseup'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get paste => this['paste'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get reset => this['reset'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get scroll => this['scroll'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get search => this['search'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get select => this['select'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get selectStart => this['selectstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get submit => this['submit'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchCancel => this['touchcancel'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchEnd => this['touchend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchEnter => this['touchenter'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchLeave => this['touchleave'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchMove => this['touchmove'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchStart => this['touchstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get transitionEnd => this['webkitTransitionEnd'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get fullscreenChange => this['webkitfullscreenchange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get fullscreenError => this['webkitfullscreenerror'];
 
   EventListenerList get mouseWheel {
@@ -8911,7 +8907,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ElementTraversal
+@DocsEditable
+@DomName('ElementTraversal')
 abstract class ElementTraversal {
 
   int $dom_childElementCount;
@@ -8929,34 +8926,36 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLEmbedElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLEmbedElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 class EmbedElement extends Element native "*HTMLEmbedElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory EmbedElement() => document.$dom_createElement("embed");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('embed');
 
-  /// @domName HTMLEmbedElement.align; @docsEditable true
+  @DocsEditable @DomName('HTMLEmbedElement.align')
   String align;
 
-  /// @domName HTMLEmbedElement.height; @docsEditable true
+  @DocsEditable @DomName('HTMLEmbedElement.height')
   String height;
 
-  /// @domName HTMLEmbedElement.name; @docsEditable true
+  @DocsEditable @DomName('HTMLEmbedElement.name')
   String name;
 
-  /// @domName HTMLEmbedElement.src; @docsEditable true
+  @DocsEditable @DomName('HTMLEmbedElement.src')
   String src;
 
-  /// @domName HTMLEmbedElement.type; @docsEditable true
+  @DocsEditable @DomName('HTMLEmbedElement.type')
   String type;
 
-  /// @domName HTMLEmbedElement.width; @docsEditable true
+  @DocsEditable @DomName('HTMLEmbedElement.width')
   String width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8964,7 +8963,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName EntityReference; @docsEditable true
+
+@DocsEditable
+@DomName('EntityReference')
 class EntityReference extends Node native "*EntityReference" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8980,41 +8981,43 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Entry; @docsEditable true
+
+@DocsEditable
+@DomName('Entry')
 class Entry native "*Entry" {
 
-  /// @domName Entry.filesystem; @docsEditable true
+  @DocsEditable @DomName('Entry.filesystem')
   final FileSystem filesystem;
 
-  /// @domName Entry.fullPath; @docsEditable true
+  @DocsEditable @DomName('Entry.fullPath')
   final String fullPath;
 
-  /// @domName Entry.isDirectory; @docsEditable true
+  @DocsEditable @DomName('Entry.isDirectory')
   final bool isDirectory;
 
-  /// @domName Entry.isFile; @docsEditable true
+  @DocsEditable @DomName('Entry.isFile')
   final bool isFile;
 
-  /// @domName Entry.name; @docsEditable true
+  @DocsEditable @DomName('Entry.name')
   final String name;
 
-  /// @domName Entry.copyTo; @docsEditable true
+  @DocsEditable @DomName('Entry.copyTo')
   void copyTo(DirectoryEntry parent, [String name, EntryCallback successCallback, ErrorCallback errorCallback]) native;
 
-  /// @domName Entry.getMetadata; @docsEditable true
+  @DocsEditable @DomName('Entry.getMetadata')
   void getMetadata(MetadataCallback successCallback, [ErrorCallback errorCallback]) native;
 
-  /// @domName Entry.getParent; @docsEditable true
+  @DocsEditable @DomName('Entry.getParent')
   void getParent([EntryCallback successCallback, ErrorCallback errorCallback]) native;
 
-  /// @domName Entry.moveTo; @docsEditable true
+  @DocsEditable @DomName('Entry.moveTo')
   void moveTo(DirectoryEntry parent, [String name, EntryCallback successCallback, ErrorCallback errorCallback]) native;
 
-  /// @domName Entry.remove; @docsEditable true
+  @DocsEditable @DomName('Entry.remove')
   void remove(VoidCallback successCallback, [ErrorCallback errorCallback]) native;
 
-  /// @domName Entry.toURL; @docsEditable true
   @JSName('toURL')
+  @DocsEditable @DomName('Entry.toURL')
   String toUrl() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9030,41 +9033,43 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName EntrySync; @docsEditable true
+
+@DocsEditable
+@DomName('EntrySync')
 class EntrySync native "*EntrySync" {
 
-  /// @domName EntrySync.filesystem; @docsEditable true
+  @DocsEditable @DomName('EntrySync.filesystem')
   final FileSystemSync filesystem;
 
-  /// @domName EntrySync.fullPath; @docsEditable true
+  @DocsEditable @DomName('EntrySync.fullPath')
   final String fullPath;
 
-  /// @domName EntrySync.isDirectory; @docsEditable true
+  @DocsEditable @DomName('EntrySync.isDirectory')
   final bool isDirectory;
 
-  /// @domName EntrySync.isFile; @docsEditable true
+  @DocsEditable @DomName('EntrySync.isFile')
   final bool isFile;
 
-  /// @domName EntrySync.name; @docsEditable true
+  @DocsEditable @DomName('EntrySync.name')
   final String name;
 
-  /// @domName EntrySync.copyTo; @docsEditable true
+  @DocsEditable @DomName('EntrySync.copyTo')
   EntrySync copyTo(DirectoryEntrySync parent, String name) native;
 
-  /// @domName EntrySync.getMetadata; @docsEditable true
+  @DocsEditable @DomName('EntrySync.getMetadata')
   Metadata getMetadata() native;
 
-  /// @domName EntrySync.getParent; @docsEditable true
+  @DocsEditable @DomName('EntrySync.getParent')
   EntrySync getParent() native;
 
-  /// @domName EntrySync.moveTo; @docsEditable true
+  @DocsEditable @DomName('EntrySync.moveTo')
   EntrySync moveTo(DirectoryEntrySync parent, String name) native;
 
-  /// @domName EntrySync.remove; @docsEditable true
+  @DocsEditable @DomName('EntrySync.remove')
   void remove() native;
 
-  /// @domName EntrySync.toURL; @docsEditable true
   @JSName('toURL')
+  @DocsEditable @DomName('EntrySync.toURL')
   String toUrl() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9080,16 +9085,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ErrorEvent; @docsEditable true
+
+@DocsEditable
+@DomName('ErrorEvent')
 class ErrorEvent extends Event native "*ErrorEvent" {
 
-  /// @domName ErrorEvent.filename; @docsEditable true
+  @DocsEditable @DomName('ErrorEvent.filename')
   final String filename;
 
-  /// @domName ErrorEvent.lineno; @docsEditable true
+  @DocsEditable @DomName('ErrorEvent.lineno')
   final int lineno;
 
-  /// @domName ErrorEvent.message; @docsEditable true
+  @DocsEditable @DomName('ErrorEvent.message')
   final String message;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9099,7 +9106,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Event
+@DocsEditable
+@DomName('Event')
 class Event native "*Event" {
   // In JS, canBubble and cancelable are technically required parameters to
   // init*Event. In practice, though, if they aren't provided they simply
@@ -9150,56 +9158,54 @@
 
   static const int SELECT = 16384;
 
-  /// @domName Event.bubbles; @docsEditable true
+  @DocsEditable @DomName('Event.bubbles')
   final bool bubbles;
 
-  /// @domName Event.cancelBubble; @docsEditable true
+  @DocsEditable @DomName('Event.cancelBubble')
   bool cancelBubble;
 
-  /// @domName Event.cancelable; @docsEditable true
+  @DocsEditable @DomName('Event.cancelable')
   final bool cancelable;
 
-  /// @domName Event.clipboardData; @docsEditable true
+  @DocsEditable @DomName('Event.clipboardData')
   final Clipboard clipboardData;
 
-  /// @domName Event.currentTarget; @docsEditable true
   EventTarget get currentTarget => _convertNativeToDart_EventTarget(this._currentTarget);
   @JSName('currentTarget')
-  @Creates('Null') @Returns('EventTarget|=Object')
+  @DocsEditable @DomName('Event.currentTarget') @Creates('Null') @Returns('EventTarget|=Object')
   final dynamic _currentTarget;
 
-  /// @domName Event.defaultPrevented; @docsEditable true
+  @DocsEditable @DomName('Event.defaultPrevented')
   final bool defaultPrevented;
 
-  /// @domName Event.eventPhase; @docsEditable true
+  @DocsEditable @DomName('Event.eventPhase')
   final int eventPhase;
 
-  /// @domName Event.returnValue; @docsEditable true
+  @DocsEditable @DomName('Event.returnValue')
   bool returnValue;
 
-  /// @domName Event.target; @docsEditable true
   EventTarget get target => _convertNativeToDart_EventTarget(this._target);
   @JSName('target')
-  @Creates('Node') @Returns('EventTarget|=Object')
+  @DocsEditable @DomName('Event.target') @Creates('Node') @Returns('EventTarget|=Object')
   final dynamic _target;
 
-  /// @domName Event.timeStamp; @docsEditable true
+  @DocsEditable @DomName('Event.timeStamp')
   final int timeStamp;
 
-  /// @domName Event.type; @docsEditable true
+  @DocsEditable @DomName('Event.type')
   final String type;
 
-  /// @domName Event.initEvent; @docsEditable true
   @JSName('initEvent')
+  @DocsEditable @DomName('Event.initEvent')
   void $dom_initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) native;
 
-  /// @domName Event.preventDefault; @docsEditable true
+  @DocsEditable @DomName('Event.preventDefault')
   void preventDefault() native;
 
-  /// @domName Event.stopImmediatePropagation; @docsEditable true
+  @DocsEditable @DomName('Event.stopImmediatePropagation')
   void stopImmediatePropagation() native;
 
-  /// @domName Event.stopPropagation; @docsEditable true
+  @DocsEditable @DomName('Event.stopPropagation')
   void stopPropagation() native;
 
 }
@@ -9208,23 +9214,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName EventException; @docsEditable true
+
+@DocsEditable
+@DomName('EventException')
 class EventException native "*EventException" {
 
   static const int DISPATCH_REQUEST_ERR = 1;
 
   static const int UNSPECIFIED_EVENT_TYPE_ERR = 0;
 
-  /// @domName EventException.code; @docsEditable true
+  @DocsEditable @DomName('EventException.code')
   final int code;
 
-  /// @domName EventException.message; @docsEditable true
+  @DocsEditable @DomName('EventException.message')
   final String message;
 
-  /// @domName EventException.name; @docsEditable true
+  @DocsEditable @DomName('EventException.name')
   final String name;
 
-  /// @domName EventException.toString; @docsEditable true
+  @DocsEditable @DomName('EventException.toString')
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9232,7 +9240,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName EventSource; @docsEditable true
+
+@DocsEditable
+@DomName('EventSource')
 class EventSource extends EventTarget native "*EventSource" {
 
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
@@ -9241,11 +9251,22 @@
 
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
 
-  ///@docsEditable true
-  factory EventSource(String scriptUrl) => EventSource._create(scriptUrl);
-  static EventSource _create(String scriptUrl) => JS('EventSource', 'new EventSource(#)', scriptUrl);
+  @DocsEditable
+  factory EventSource(String url, [Map eventSourceInit]) {
+    if (!?eventSourceInit) {
+      return EventSource._create(url);
+    }
+    return EventSource._create(url, eventSourceInit);
+  }
+  static EventSource _create(String url, [Map eventSourceInit]) {
+    if (!?eventSourceInit) {
+      return JS('EventSource', 'new EventSource(#)', url);
+    }
+    return JS('EventSource', 'new EventSource(#,#)', url, eventSourceInit);
+  }
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   EventSourceEvents get on =>
     new EventSourceEvents(this);
 
@@ -9255,25 +9276,28 @@
 
   static const int OPEN = 1;
 
-  /// @domName EventSource.readyState; @docsEditable true
+  @DocsEditable @DomName('EventSource.readyState')
   final int readyState;
 
-  /// @domName EventSource.url; @docsEditable true
+  @DocsEditable @DomName('EventSource.url')
   final String url;
 
-  /// @domName EventSource.addEventListener; @docsEditable true
+  @DocsEditable @DomName('EventSource.withCredentials')
+  final bool withCredentials;
+
   @JSName('addEventListener')
+  @DocsEditable @DomName('EventSource.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName EventSource.close; @docsEditable true
+  @DocsEditable @DomName('EventSource.close')
   void close() native;
 
-  /// @domName EventSource.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('EventSource.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName EventSource.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('EventSource.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   Stream<Event> get onError => errorEvent.forTarget(this);
@@ -9283,18 +9307,18 @@
   Stream<Event> get onOpen => openEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class EventSourceEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   EventSourceEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get message => this['message'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get open => this['open'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9308,7 +9332,7 @@
  * Events can either be accessed by string name (using the indexed getter) or by
  * getters exposed by subclasses. Use the getters exposed by subclasses when
  * possible for better compile-time type checks.
- *
+ * 
  * Using an indexed getter:
  *     events['mouseover'].add((e) => print("Mouse over!"));
  *
@@ -9363,7 +9387,8 @@
   }
 }
 
-/// @domName EventTarget
+@DocsEditable
+@DomName('EventTarget')
 /**
  * Base class for all browser objects that support events.
  *
@@ -9371,22 +9396,22 @@
  * [$dom_addEventListener], [$dom_dispatchEvent], and
  * [$dom_removeEventListener]) for compile-time type checks and a more concise
  * API.
- */
+ */ 
 class EventTarget native "*EventTarget" {
 
-  /** @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent */
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   Events get on => new Events(this);
 
-  /// @domName EventTarget.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('EventTarget.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName EventTarget.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('EventTarget.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native;
 
-  /// @domName EventTarget.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('EventTarget.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
 }
@@ -9395,7 +9420,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName EXTTextureFilterAnisotropic; @docsEditable true
+
+@DocsEditable
+@DomName('EXTTextureFilterAnisotropic')
 class ExtTextureFilterAnisotropic native "*EXTTextureFilterAnisotropic" {
 
   static const int MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;
@@ -9407,40 +9434,42 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLFieldSetElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLFieldSetElement')
 class FieldSetElement extends Element native "*HTMLFieldSetElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory FieldSetElement() => document.$dom_createElement("fieldset");
 
-  /// @domName HTMLFieldSetElement.disabled; @docsEditable true
+  @DocsEditable @DomName('HTMLFieldSetElement.disabled')
   bool disabled;
 
-  /// @domName HTMLFieldSetElement.elements; @docsEditable true
+  @DocsEditable @DomName('HTMLFieldSetElement.elements')
   final HtmlCollection elements;
 
-  /// @domName HTMLFieldSetElement.form; @docsEditable true
+  @DocsEditable @DomName('HTMLFieldSetElement.form')
   final FormElement form;
 
-  /// @domName HTMLFieldSetElement.name; @docsEditable true
+  @DocsEditable @DomName('HTMLFieldSetElement.name')
   String name;
 
-  /// @domName HTMLFieldSetElement.type; @docsEditable true
+  @DocsEditable @DomName('HTMLFieldSetElement.type')
   final String type;
 
-  /// @domName HTMLFieldSetElement.validationMessage; @docsEditable true
+  @DocsEditable @DomName('HTMLFieldSetElement.validationMessage')
   final String validationMessage;
 
-  /// @domName HTMLFieldSetElement.validity; @docsEditable true
+  @DocsEditable @DomName('HTMLFieldSetElement.validity')
   final ValidityState validity;
 
-  /// @domName HTMLFieldSetElement.willValidate; @docsEditable true
+  @DocsEditable @DomName('HTMLFieldSetElement.willValidate')
   final bool willValidate;
 
-  /// @domName HTMLFieldSetElement.checkValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLFieldSetElement.checkValidity')
   bool checkValidity() native;
 
-  /// @domName HTMLFieldSetElement.setCustomValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLFieldSetElement.setCustomValidity')
   void setCustomValidity(String error) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9448,16 +9477,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName File; @docsEditable true
+
+@DocsEditable
+@DomName('File')
 class File extends Blob native "*File" {
 
-  /// @domName File.lastModifiedDate; @docsEditable true
+  @DocsEditable @DomName('File.lastModifiedDate')
   final Date lastModifiedDate;
 
-  /// @domName File.name; @docsEditable true
+  @DocsEditable @DomName('File.name')
   final String name;
 
-  /// @domName File.webkitRelativePath; @docsEditable true
+  @DocsEditable @DomName('File.webkitRelativePath')
   final String webkitRelativePath;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9473,13 +9504,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileEntry; @docsEditable true
+
+@DocsEditable
+@DomName('FileEntry')
 class FileEntry extends Entry native "*FileEntry" {
 
-  /// @domName FileEntry.createWriter; @docsEditable true
+  @DocsEditable @DomName('FileEntry.createWriter')
   void createWriter(FileWriterCallback successCallback, [ErrorCallback errorCallback]) native;
 
-  /// @domName FileEntry.file; @docsEditable true
+  @DocsEditable @DomName('FileEntry.file')
   void file(FileCallback successCallback, [ErrorCallback errorCallback]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9487,13 +9520,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileEntrySync; @docsEditable true
+
+@DocsEditable
+@DomName('FileEntrySync')
 class FileEntrySync extends EntrySync native "*FileEntrySync" {
 
-  /// @domName FileEntrySync.createWriter; @docsEditable true
+  @DocsEditable @DomName('FileEntrySync.createWriter')
   FileWriterSync createWriter() native;
 
-  /// @domName FileEntrySync.file; @docsEditable true
+  @DocsEditable @DomName('FileEntrySync.file')
   File file() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9501,7 +9536,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileError; @docsEditable true
+
+@DocsEditable
+@DomName('FileError')
 class FileError native "*FileError" {
 
   static const int ABORT_ERR = 3;
@@ -9528,7 +9565,7 @@
 
   static const int TYPE_MISMATCH_ERR = 11;
 
-  /// @domName FileError.code; @docsEditable true
+  @DocsEditable @DomName('FileError.code')
   final int code;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9536,7 +9573,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileException; @docsEditable true
+
+@DocsEditable
+@DomName('FileException')
 class FileException native "*FileException" {
 
   static const int ABORT_ERR = 3;
@@ -9563,16 +9602,16 @@
 
   static const int TYPE_MISMATCH_ERR = 11;
 
-  /// @domName FileException.code; @docsEditable true
+  @DocsEditable @DomName('FileException.code')
   final int code;
 
-  /// @domName FileException.message; @docsEditable true
+  @DocsEditable @DomName('FileException.message')
   final String message;
 
-  /// @domName FileException.name; @docsEditable true
+  @DocsEditable @DomName('FileException.name')
   final String name;
 
-  /// @domName FileException.toString; @docsEditable true
+  @DocsEditable @DomName('FileException.toString')
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9580,10 +9619,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileList; @docsEditable true
+
+@DocsEditable
+@DomName('FileList')
 class FileList implements JavaScriptIndexingBehavior, List<File> native "*FileList" {
 
-  /// @domName FileList.length; @docsEditable true
+  @DocsEditable @DomName('FileList.length')
   int get length => JS("int", "#.length", this);
 
   File operator[](int index) => JS("File", "#[#]", this, index);
@@ -9604,50 +9645,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, File)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(File element) => Collections.contains(this, element);
+  bool contains(File element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(File element)) => Collections.forEach(this, f);
+  void forEach(void f(File element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(File element)) => new MappedList<File, dynamic>(this, f);
+  List mappedBy(f(File element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<File> where(bool f(File element)) => new WhereIterable<File>(this, f);
+  Iterable<File> where(bool f(File element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(File element)) => Collections.every(this, f);
+  bool every(bool f(File element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(File element)) => Collections.any(this, f);
+  bool any(bool f(File element)) => IterableMixinWorkaround.any(this, f);
 
   List<File> toList() => new List<File>.from(this);
   Set<File> toSet() => new Set<File>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<File> take(int n) => new ListView<File>(this, 0, n);
+  List<File> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<File> takeWhile(bool test(File value)) {
-    return new TakeWhileIterable<File>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<File> skip(int n) => new ListView<File>(this, n, null);
+  List<File> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<File> skipWhile(bool test(File value)) {
-    return new SkipWhileIterable<File>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   File firstMatching(bool test(File value), { File orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   File lastMatching(bool test(File value), {File orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   File singleMatching(bool test(File value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   File elementAt(int index) {
@@ -9705,16 +9746,36 @@
     throw new StateError("More than one element");
   }
 
-  File min([int compare(File a, File b)]) => Collections.min(this, compare);
+  File min([int compare(File a, File b)]) => IterableMixinWorkaround.min(this, compare);
 
-  File max([int compare(File a, File b)]) => Collections.max(this, compare);
+  File max([int compare(File a, File b)]) => IterableMixinWorkaround.max(this, compare);
 
   File removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   File removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(File element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(File element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<File> from, [int startFrom]) {
@@ -9734,7 +9795,7 @@
 
   // -- end List<File> mixins.
 
-  /// @domName FileList.item; @docsEditable true
+  @DocsEditable @DomName('FileList.item')
   File item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9742,7 +9803,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileReader; @docsEditable true
+
+@DocsEditable
+@DomName('FileReader')
 class FileReader extends EventTarget native "*FileReader" {
 
   static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
@@ -9757,11 +9820,12 @@
 
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
-  ///@docsEditable true
+  @DocsEditable
   factory FileReader() => FileReader._create();
   static FileReader _create() => JS('FileReader', 'new FileReader()');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   FileReaderEvents get on =>
     new FileReaderEvents(this);
 
@@ -9771,42 +9835,41 @@
 
   static const int LOADING = 1;
 
-  /// @domName FileReader.error; @docsEditable true
+  @DocsEditable @DomName('FileReader.error')
   final FileError error;
 
-  /// @domName FileReader.readyState; @docsEditable true
+  @DocsEditable @DomName('FileReader.readyState')
   final int readyState;
 
-  /// @domName FileReader.result; @docsEditable true
-  @Creates('String|ArrayBuffer|Null')
+  @DocsEditable @DomName('FileReader.result') @Creates('String|ArrayBuffer|Null')
   final Object result;
 
-  /// @domName FileReader.abort; @docsEditable true
+  @DocsEditable @DomName('FileReader.abort')
   void abort() native;
 
-  /// @domName FileReader.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('FileReader.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName FileReader.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('FileReader.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName FileReader.readAsArrayBuffer; @docsEditable true
+  @DocsEditable @DomName('FileReader.readAsArrayBuffer')
   void readAsArrayBuffer(Blob blob) native;
 
-  /// @domName FileReader.readAsBinaryString; @docsEditable true
+  @DocsEditable @DomName('FileReader.readAsBinaryString')
   void readAsBinaryString(Blob blob) native;
 
-  /// @domName FileReader.readAsDataURL; @docsEditable true
   @JSName('readAsDataURL')
+  @DocsEditable @DomName('FileReader.readAsDataURL')
   void readAsDataUrl(Blob blob) native;
 
-  /// @domName FileReader.readAsText; @docsEditable true
+  @DocsEditable @DomName('FileReader.readAsText')
   void readAsText(Blob blob, [String encoding]) native;
 
-  /// @domName FileReader.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('FileReader.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
@@ -9822,27 +9885,27 @@
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class FileReaderEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   FileReaderEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get load => this['load'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadEnd => this['loadend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadStart => this['loadstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get progress => this['progress'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9850,24 +9913,26 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileReaderSync; @docsEditable true
+
+@DocsEditable
+@DomName('FileReaderSync')
 class FileReaderSync native "*FileReaderSync" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory FileReaderSync() => FileReaderSync._create();
   static FileReaderSync _create() => JS('FileReaderSync', 'new FileReaderSync()');
 
-  /// @domName FileReaderSync.readAsArrayBuffer; @docsEditable true
+  @DocsEditable @DomName('FileReaderSync.readAsArrayBuffer')
   ArrayBuffer readAsArrayBuffer(Blob blob) native;
 
-  /// @domName FileReaderSync.readAsBinaryString; @docsEditable true
+  @DocsEditable @DomName('FileReaderSync.readAsBinaryString')
   String readAsBinaryString(Blob blob) native;
 
-  /// @domName FileReaderSync.readAsDataURL; @docsEditable true
   @JSName('readAsDataURL')
+  @DocsEditable @DomName('FileReaderSync.readAsDataURL')
   String readAsDataUrl(Blob blob) native;
 
-  /// @domName FileReaderSync.readAsText; @docsEditable true
+  @DocsEditable @DomName('FileReaderSync.readAsText')
   String readAsText(Blob blob, [String encoding]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9875,16 +9940,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMFileSystem; @docsEditable true
+
+@DocsEditable
+@DomName('DOMFileSystem')
 class FileSystem native "*DOMFileSystem" {
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.webkitRequestFileSystem)');
 
-  /// @domName DOMFileSystem.name; @docsEditable true
+  @DocsEditable @DomName('DOMFileSystem.name')
   final String name;
 
-  /// @domName DOMFileSystem.root; @docsEditable true
+  @DocsEditable @DomName('DOMFileSystem.root')
   final DirectoryEntry root;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9900,13 +9967,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMFileSystemSync; @docsEditable true
+
+@DocsEditable
+@DomName('DOMFileSystemSync')
 class FileSystemSync native "*DOMFileSystemSync" {
 
-  /// @domName DOMFileSystemSync.name; @docsEditable true
+  @DocsEditable @DomName('DOMFileSystemSync.name')
   final String name;
 
-  /// @domName DOMFileSystemSync.root; @docsEditable true
+  @DocsEditable @DomName('DOMFileSystemSync.root')
   final DirectoryEntrySync root;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9914,7 +9983,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileWriter; @docsEditable true
+
+@DocsEditable
+@DomName('FileWriter')
 class FileWriter extends EventTarget native "*FileWriter" {
 
   static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
@@ -9929,7 +10000,8 @@
 
   static const EventStreamProvider<ProgressEvent> writeStartEvent = const EventStreamProvider<ProgressEvent>('writestart');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   FileWriterEvents get on =>
     new FileWriterEvents(this);
 
@@ -9939,40 +10011,40 @@
 
   static const int WRITING = 1;
 
-  /// @domName FileWriter.error; @docsEditable true
+  @DocsEditable @DomName('FileWriter.error')
   final FileError error;
 
-  /// @domName FileWriter.length; @docsEditable true
+  @DocsEditable @DomName('FileWriter.length')
   final int length;
 
-  /// @domName FileWriter.position; @docsEditable true
+  @DocsEditable @DomName('FileWriter.position')
   final int position;
 
-  /// @domName FileWriter.readyState; @docsEditable true
+  @DocsEditable @DomName('FileWriter.readyState')
   final int readyState;
 
-  /// @domName FileWriter.abort; @docsEditable true
+  @DocsEditable @DomName('FileWriter.abort')
   void abort() native;
 
-  /// @domName FileWriter.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('FileWriter.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName FileWriter.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('FileWriter.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName FileWriter.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('FileWriter.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName FileWriter.seek; @docsEditable true
+  @DocsEditable @DomName('FileWriter.seek')
   void seek(int position) native;
 
-  /// @domName FileWriter.truncate; @docsEditable true
+  @DocsEditable @DomName('FileWriter.truncate')
   void truncate(int size) native;
 
-  /// @domName FileWriter.write; @docsEditable true
+  @DocsEditable @DomName('FileWriter.write')
   void write(Blob data) native;
 
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
@@ -9988,27 +10060,27 @@
   Stream<ProgressEvent> get onWriteStart => writeStartEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class FileWriterEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   FileWriterEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get progress => this['progress'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get write => this['write'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get writeEnd => this['writeend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get writeStart => this['writestart'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10024,22 +10096,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileWriterSync; @docsEditable true
+
+@DocsEditable
+@DomName('FileWriterSync')
 class FileWriterSync native "*FileWriterSync" {
 
-  /// @domName FileWriterSync.length; @docsEditable true
+  @DocsEditable @DomName('FileWriterSync.length')
   final int length;
 
-  /// @domName FileWriterSync.position; @docsEditable true
+  @DocsEditable @DomName('FileWriterSync.position')
   final int position;
 
-  /// @domName FileWriterSync.seek; @docsEditable true
+  @DocsEditable @DomName('FileWriterSync.seek')
   void seek(int position) native;
 
-  /// @domName FileWriterSync.truncate; @docsEditable true
+  @DocsEditable @DomName('FileWriterSync.truncate')
   void truncate(int size) native;
 
-  /// @domName FileWriterSync.write; @docsEditable true
+  @DocsEditable @DomName('FileWriterSync.write')
   void write(Blob data) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10047,7 +10121,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Float32Array; @docsEditable true
+
+@DocsEditable
+@DomName('Float32Array')
 class Float32Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<num> native "*Float32Array" {
 
   factory Float32Array(int length) =>
@@ -10056,12 +10132,12 @@
   factory Float32Array.fromList(List<num> list) =>
     _TypedArrayFactoryProvider.createFloat32Array_fromList(list);
 
-  factory Float32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) =>
+  factory Float32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createFloat32Array_fromBuffer(buffer, byteOffset, length);
 
   static const int BYTES_PER_ELEMENT = 4;
 
-  /// @domName Float32Array.length; @docsEditable true
+  @DocsEditable @DomName('Float32Array.length')
   int get length => JS("int", "#.length", this);
 
   num operator[](int index) => JS("num", "#[#]", this, index);
@@ -10079,50 +10155,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, num)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(num element) => Collections.contains(this, element);
+  bool contains(num element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(num element)) => Collections.forEach(this, f);
+  void forEach(void f(num element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(num element)) => new MappedList<num, dynamic>(this, f);
+  List mappedBy(f(num element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<num> where(bool f(num element)) => new WhereIterable<num>(this, f);
+  Iterable<num> where(bool f(num element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(num element)) => Collections.every(this, f);
+  bool every(bool f(num element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(num element)) => Collections.any(this, f);
+  bool any(bool f(num element)) => IterableMixinWorkaround.any(this, f);
 
   List<num> toList() => new List<num>.from(this);
   Set<num> toSet() => new Set<num>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<num> take(int n) => new ListView<num>(this, 0, n);
+  List<num> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<num> takeWhile(bool test(num value)) {
-    return new TakeWhileIterable<num>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<num> skip(int n) => new ListView<num>(this, n, null);
+  List<num> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<num> skipWhile(bool test(num value)) {
-    return new SkipWhileIterable<num>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   num firstMatching(bool test(num value), { num orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   num lastMatching(bool test(num value), {num orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   num singleMatching(bool test(num value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   num elementAt(int index) {
@@ -10180,16 +10256,36 @@
     throw new StateError("More than one element");
   }
 
-  num min([int compare(num a, num b)]) => Collections.min(this, compare);
+  num min([int compare(num a, num b)]) => IterableMixinWorkaround.min(this, compare);
 
-  num max([int compare(num a, num b)]) => Collections.max(this, compare);
+  num max([int compare(num a, num b)]) => IterableMixinWorkaround.max(this, compare);
 
   num removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   num removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(num element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(num element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<num> from, [int startFrom]) {
@@ -10209,11 +10305,11 @@
 
   // -- end List<num> mixins.
 
-  /// @domName Float32Array.setElements; @docsEditable true
   @JSName('set')
+  @DocsEditable @DomName('Float32Array.set')
   void setElements(Object array, [int offset]) native;
 
-  /// @domName Float32Array.subarray; @docsEditable true
+  @DocsEditable @DomName('Float32Array.subarray')
   Float32Array subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10221,7 +10317,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Float64Array; @docsEditable true
+
+@DocsEditable
+@DomName('Float64Array')
 class Float64Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<num> native "*Float64Array" {
 
   factory Float64Array(int length) =>
@@ -10230,12 +10328,12 @@
   factory Float64Array.fromList(List<num> list) =>
     _TypedArrayFactoryProvider.createFloat64Array_fromList(list);
 
-  factory Float64Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) =>
+  factory Float64Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createFloat64Array_fromBuffer(buffer, byteOffset, length);
 
   static const int BYTES_PER_ELEMENT = 8;
 
-  /// @domName Float64Array.length; @docsEditable true
+  @DocsEditable @DomName('Float64Array.length')
   int get length => JS("int", "#.length", this);
 
   num operator[](int index) => JS("num", "#[#]", this, index);
@@ -10253,50 +10351,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, num)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(num element) => Collections.contains(this, element);
+  bool contains(num element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(num element)) => Collections.forEach(this, f);
+  void forEach(void f(num element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(num element)) => new MappedList<num, dynamic>(this, f);
+  List mappedBy(f(num element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<num> where(bool f(num element)) => new WhereIterable<num>(this, f);
+  Iterable<num> where(bool f(num element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(num element)) => Collections.every(this, f);
+  bool every(bool f(num element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(num element)) => Collections.any(this, f);
+  bool any(bool f(num element)) => IterableMixinWorkaround.any(this, f);
 
   List<num> toList() => new List<num>.from(this);
   Set<num> toSet() => new Set<num>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<num> take(int n) => new ListView<num>(this, 0, n);
+  List<num> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<num> takeWhile(bool test(num value)) {
-    return new TakeWhileIterable<num>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<num> skip(int n) => new ListView<num>(this, n, null);
+  List<num> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<num> skipWhile(bool test(num value)) {
-    return new SkipWhileIterable<num>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   num firstMatching(bool test(num value), { num orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   num lastMatching(bool test(num value), {num orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   num singleMatching(bool test(num value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   num elementAt(int index) {
@@ -10354,16 +10452,36 @@
     throw new StateError("More than one element");
   }
 
-  num min([int compare(num a, num b)]) => Collections.min(this, compare);
+  num min([int compare(num a, num b)]) => IterableMixinWorkaround.min(this, compare);
 
-  num max([int compare(num a, num b)]) => Collections.max(this, compare);
+  num max([int compare(num a, num b)]) => IterableMixinWorkaround.max(this, compare);
 
   num removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   num removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(num element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(num element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<num> from, [int startFrom]) {
@@ -10383,11 +10501,11 @@
 
   // -- end List<num> mixins.
 
-  /// @domName Float64Array.setElements; @docsEditable true
   @JSName('set')
+  @DocsEditable @DomName('Float64Array.set')
   void setElements(Object array, [int offset]) native;
 
-  /// @domName Float64Array.subarray; @docsEditable true
+  @DocsEditable @DomName('Float64Array.subarray')
   Float64Array subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10395,27 +10513,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLFontElement; @docsEditable true
-class FontElement extends Element native "*HTMLFontElement" {
 
-  /// @domName HTMLFontElement.color; @docsEditable true
-  String color;
-
-  /// @domName HTMLFontElement.face; @docsEditable true
-  String face;
-
-  /// @domName HTMLFontElement.size; @docsEditable true
-  String size;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName FormData; @docsEditable true
+@DocsEditable
+@DomName('FormData')
 class FormData native "*FormData" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory FormData([FormElement form]) {
     if (!?form) {
       return FormData._create();
@@ -10429,7 +10532,7 @@
     return JS('FormData', 'new FormData(#)', form);
   }
 
-  /// @domName DOMFormData.append; @docsEditable true
+  @DocsEditable @DomName('DOMFormData.append')
   void append(String name, value, [String filename]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10437,49 +10540,51 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLFormElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLFormElement')
 class FormElement extends Element native "*HTMLFormElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory FormElement() => document.$dom_createElement("form");
 
-  /// @domName HTMLFormElement.acceptCharset; @docsEditable true
+  @DocsEditable @DomName('HTMLFormElement.acceptCharset')
   String acceptCharset;
 
-  /// @domName HTMLFormElement.action; @docsEditable true
+  @DocsEditable @DomName('HTMLFormElement.action')
   String action;
 
-  /// @domName HTMLFormElement.autocomplete; @docsEditable true
+  @DocsEditable @DomName('HTMLFormElement.autocomplete')
   String autocomplete;
 
-  /// @domName HTMLFormElement.encoding; @docsEditable true
+  @DocsEditable @DomName('HTMLFormElement.encoding')
   String encoding;
 
-  /// @domName HTMLFormElement.enctype; @docsEditable true
+  @DocsEditable @DomName('HTMLFormElement.enctype')
   String enctype;
 
-  /// @domName HTMLFormElement.length; @docsEditable true
+  @DocsEditable @DomName('HTMLFormElement.length')
   final int length;
 
-  /// @domName HTMLFormElement.method; @docsEditable true
+  @DocsEditable @DomName('HTMLFormElement.method')
   String method;
 
-  /// @domName HTMLFormElement.name; @docsEditable true
+  @DocsEditable @DomName('HTMLFormElement.name')
   String name;
 
-  /// @domName HTMLFormElement.noValidate; @docsEditable true
+  @DocsEditable @DomName('HTMLFormElement.noValidate')
   bool noValidate;
 
-  /// @domName HTMLFormElement.target; @docsEditable true
+  @DocsEditable @DomName('HTMLFormElement.target')
   String target;
 
-  /// @domName HTMLFormElement.checkValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLFormElement.checkValidity')
   bool checkValidity() native;
 
-  /// @domName HTMLFormElement.reset; @docsEditable true
+  @DocsEditable @DomName('HTMLFormElement.reset')
   void reset() native;
 
-  /// @domName HTMLFormElement.submit; @docsEditable true
+  @DocsEditable @DomName('HTMLFormElement.submit')
   void submit() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10487,184 +10592,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLFrameElement; @docsEditable true
-class FrameElement extends Element native "*HTMLFrameElement" {
 
-  /// @domName HTMLFrameElement.contentWindow; @docsEditable true
-  WindowBase get contentWindow => _convertNativeToDart_Window(this._contentWindow);
-  @JSName('contentWindow')
-  @Creates('Window|=Object') @Returns('Window|=Object')
-  final dynamic _contentWindow;
-
-  /// @domName HTMLFrameElement.frameBorder; @docsEditable true
-  String frameBorder;
-
-  /// @domName HTMLFrameElement.height; @docsEditable true
-  final int height;
-
-  /// @domName HTMLFrameElement.location; @docsEditable true
-  String location;
-
-  /// @domName HTMLFrameElement.longDesc; @docsEditable true
-  String longDesc;
-
-  /// @domName HTMLFrameElement.marginHeight; @docsEditable true
-  String marginHeight;
-
-  /// @domName HTMLFrameElement.marginWidth; @docsEditable true
-  String marginWidth;
-
-  /// @domName HTMLFrameElement.name; @docsEditable true
-  String name;
-
-  /// @domName HTMLFrameElement.noResize; @docsEditable true
-  bool noResize;
-
-  /// @domName HTMLFrameElement.scrolling; @docsEditable true
-  String scrolling;
-
-  /// @domName HTMLFrameElement.src; @docsEditable true
-  String src;
-
-  /// @domName HTMLFrameElement.width; @docsEditable true
-  final int width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName HTMLFrameSetElement; @docsEditable true
-class FrameSetElement extends Element native "*HTMLFrameSetElement" {
-
-  static const EventStreamProvider<Event> beforeUnloadEvent = const EventStreamProvider<Event>('beforeunload');
-
-  static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
-
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
-
-  static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
-
-  static const EventStreamProvider<HashChangeEvent> hashChangeEvent = const EventStreamProvider<HashChangeEvent>('hashchange');
-
-  static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
-
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
-
-  static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');
-
-  static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');
-
-  static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
-
-  static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
-
-  static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');
-
-  static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
-
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
-  FrameSetElementEvents get on =>
-    new FrameSetElementEvents(this);
-
-  /// @domName HTMLFrameSetElement.cols; @docsEditable true
-  String cols;
-
-  /// @domName HTMLFrameSetElement.rows; @docsEditable true
-  String rows;
-
-  Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
-
-  Stream<Event> get onBlur => blurEvent.forTarget(this);
-
-  Stream<Event> get onError => errorEvent.forTarget(this);
-
-  Stream<Event> get onFocus => focusEvent.forTarget(this);
-
-  Stream<HashChangeEvent> get onHashChange => hashChangeEvent.forTarget(this);
-
-  Stream<Event> get onLoad => loadEvent.forTarget(this);
-
-  Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
-
-  Stream<Event> get onOffline => offlineEvent.forTarget(this);
-
-  Stream<Event> get onOnline => onlineEvent.forTarget(this);
-
-  Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);
-
-  Stream<Event> get onResize => resizeEvent.forTarget(this);
-
-  Stream<StorageEvent> get onStorage => storageEvent.forTarget(this);
-
-  Stream<Event> get onUnload => unloadEvent.forTarget(this);
-}
-
-/// @docsEditable true
-class FrameSetElementEvents extends ElementEvents {
-  /// @docsEditable true
-  FrameSetElementEvents(EventTarget _ptr) : super(_ptr);
-
-  /// @docsEditable true
-  EventListenerList get beforeUnload => this['beforeunload'];
-
-  /// @docsEditable true
-  EventListenerList get blur => this['blur'];
-
-  /// @docsEditable true
-  EventListenerList get error => this['error'];
-
-  /// @docsEditable true
-  EventListenerList get focus => this['focus'];
-
-  /// @docsEditable true
-  EventListenerList get hashChange => this['hashchange'];
-
-  /// @docsEditable true
-  EventListenerList get load => this['load'];
-
-  /// @docsEditable true
-  EventListenerList get message => this['message'];
-
-  /// @docsEditable true
-  EventListenerList get offline => this['offline'];
-
-  /// @docsEditable true
-  EventListenerList get online => this['online'];
-
-  /// @docsEditable true
-  EventListenerList get popState => this['popstate'];
-
-  /// @docsEditable true
-  EventListenerList get resize => this['resize'];
-
-  /// @docsEditable true
-  EventListenerList get storage => this['storage'];
-
-  /// @docsEditable true
-  EventListenerList get unload => this['unload'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName Gamepad; @docsEditable true
+@DocsEditable
+@DomName('Gamepad')
 class Gamepad native "*Gamepad" {
 
-  /// @domName Gamepad.axes; @docsEditable true
+  @DocsEditable @DomName('Gamepad.axes')
   final List<num> axes;
 
-  /// @domName Gamepad.buttons; @docsEditable true
+  @DocsEditable @DomName('Gamepad.buttons')
   final List<num> buttons;
 
-  /// @domName Gamepad.id; @docsEditable true
+  @DocsEditable @DomName('Gamepad.id')
   final String id;
 
-  /// @domName Gamepad.index; @docsEditable true
+  @DocsEditable @DomName('Gamepad.index')
   final int index;
 
-  /// @domName Gamepad.timestamp; @docsEditable true
+  @DocsEditable @DomName('Gamepad.timestamp')
   final int timestamp;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10672,16 +10617,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Geolocation; @docsEditable true
+
+@DocsEditable
+@DomName('Geolocation')
 class Geolocation native "*Geolocation" {
 
-  /// @domName Geolocation.clearWatch; @docsEditable true
+  @DocsEditable @DomName('Geolocation.clearWatch')
   void clearWatch(int watchId) native;
 
-  /// @domName Geolocation.getCurrentPosition; @docsEditable true
+  @DocsEditable @DomName('Geolocation.getCurrentPosition')
   void getCurrentPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]) native;
 
-  /// @domName Geolocation.watchPosition; @docsEditable true
+  @DocsEditable @DomName('Geolocation.watchPosition')
   int watchPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10689,13 +10636,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Geoposition; @docsEditable true
+
+@DocsEditable
+@DomName('Geoposition')
 class Geoposition native "*Geoposition" {
 
-  /// @domName Geoposition.coords; @docsEditable true
+  @DocsEditable @DomName('Geoposition.coords')
   final Coordinates coords;
 
-  /// @domName Geoposition.timestamp; @docsEditable true
+  @DocsEditable @DomName('Geoposition.timestamp')
   final int timestamp;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10703,10 +10652,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLHRElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLHRElement')
 class HRElement extends Element native "*HTMLHRElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory HRElement() => document.$dom_createElement("hr");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10714,18 +10665,20 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HashChangeEvent; @docsEditable true
+
+@DocsEditable
+@DomName('HashChangeEvent')
 class HashChangeEvent extends Event native "*HashChangeEvent" {
 
-  /// @domName HashChangeEvent.newURL; @docsEditable true
   @JSName('newURL')
+  @DocsEditable @DomName('HashChangeEvent.newURL')
   final String newUrl;
 
-  /// @domName HashChangeEvent.oldURL; @docsEditable true
   @JSName('oldURL')
+  @DocsEditable @DomName('HashChangeEvent.oldURL')
   final String oldUrl;
 
-  /// @domName HashChangeEvent.initHashChangeEvent; @docsEditable true
+  @DocsEditable @DomName('HashChangeEvent.initHashChangeEvent')
   void initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10733,10 +10686,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLHeadElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLHeadElement')
 class HeadElement extends Element native "*HTMLHeadElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory HeadElement() => document.$dom_createElement("head");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10744,25 +10699,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLHeadingElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLHeadingElement')
 class HeadingElement extends Element native "*HTMLHeadingElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory HeadingElement.h1() => document.$dom_createElement("h1");
 
-  ///@docsEditable true
+  @DocsEditable
   factory HeadingElement.h2() => document.$dom_createElement("h2");
 
-  ///@docsEditable true
+  @DocsEditable
   factory HeadingElement.h3() => document.$dom_createElement("h3");
 
-  ///@docsEditable true
+  @DocsEditable
   factory HeadingElement.h4() => document.$dom_createElement("h4");
 
-  ///@docsEditable true
+  @DocsEditable
   factory HeadingElement.h5() => document.$dom_createElement("h5");
 
-  ///@docsEditable true
+  @DocsEditable
   factory HeadingElement.h6() => document.$dom_createElement("h6");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10770,7 +10727,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName History; @docsEditable true
+
+@DocsEditable
+@DomName('History')
 class History implements HistoryBase native "*History" {
 
   /**
@@ -10784,30 +10743,27 @@
    */
   static bool get supportsState => JS('bool', '!!window.history.pushState');
 
-  /// @domName History.length; @docsEditable true
+  @DocsEditable @DomName('History.length')
   final int length;
 
-  /// @domName History.state; @docsEditable true
   dynamic get state => _convertNativeToDart_SerializedScriptValue(this._state);
   @JSName('state')
-  @annotation_Creates_SerializedScriptValue @annotation_Returns_SerializedScriptValue
+  @DocsEditable @DomName('History.state') @annotation_Creates_SerializedScriptValue @annotation_Returns_SerializedScriptValue
   final dynamic _state;
 
-  /// @domName History.back; @docsEditable true
+  @DocsEditable @DomName('History.back')
   void back() native;
 
-  /// @domName History.forward; @docsEditable true
+  @DocsEditable @DomName('History.forward')
   void forward() native;
 
-  /// @domName History.go; @docsEditable true
+  @DocsEditable @DomName('History.go')
   void go(int distance) native;
 
-  /// @domName History.pushState; @docsEditable true
-  @SupportedBrowser(SupportedBrowser.CHROME) @SupportedBrowser(SupportedBrowser.FIREFOX) @SupportedBrowser(SupportedBrowser.IE, '10') @SupportedBrowser(SupportedBrowser.SAFARI)
+  @DocsEditable @DomName('History.pushState') @SupportedBrowser(SupportedBrowser.CHROME) @SupportedBrowser(SupportedBrowser.FIREFOX) @SupportedBrowser(SupportedBrowser.IE, '10') @SupportedBrowser(SupportedBrowser.SAFARI)
   void pushState(Object data, String title, [String url]) native;
 
-  /// @domName History.replaceState; @docsEditable true
-  @SupportedBrowser(SupportedBrowser.CHROME) @SupportedBrowser(SupportedBrowser.FIREFOX) @SupportedBrowser(SupportedBrowser.IE, '10') @SupportedBrowser(SupportedBrowser.SAFARI)
+  @DocsEditable @DomName('History.replaceState') @SupportedBrowser(SupportedBrowser.CHROME) @SupportedBrowser(SupportedBrowser.FIREFOX) @SupportedBrowser(SupportedBrowser.IE, '10') @SupportedBrowser(SupportedBrowser.SAFARI)
   void replaceState(Object data, String title, [String url]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10815,10 +10771,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLAllCollection; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLAllCollection')
 class HtmlAllCollection implements JavaScriptIndexingBehavior, List<Node> native "*HTMLAllCollection" {
 
-  /// @domName HTMLAllCollection.length; @docsEditable true
+  @DocsEditable @DomName('HTMLAllCollection.length')
   int get length => JS("int", "#.length", this);
 
   Node operator[](int index) => JS("Node", "#[#]", this, index);
@@ -10839,50 +10797,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Node element) => Collections.contains(this, element);
+  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Node element)) => Collections.forEach(this, f);
+  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Node element)) => new MappedList<Node, dynamic>(this, f);
+  List mappedBy(f(Node element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Node> where(bool f(Node element)) => new WhereIterable<Node>(this, f);
+  Iterable<Node> where(bool f(Node element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Node element)) => Collections.every(this, f);
+  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Node element)) => Collections.any(this, f);
+  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);
 
   List<Node> toList() => new List<Node>.from(this);
   Set<Node> toSet() => new Set<Node>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Node> take(int n) => new ListView<Node>(this, 0, n);
+  List<Node> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Node> takeWhile(bool test(Node value)) {
-    return new TakeWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Node> skip(int n) => new ListView<Node>(this, n, null);
+  List<Node> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Node> skipWhile(bool test(Node value)) {
-    return new SkipWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Node firstMatching(bool test(Node value), { Node orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Node lastMatching(bool test(Node value), {Node orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Node singleMatching(bool test(Node value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Node elementAt(int index) {
@@ -10940,16 +10898,36 @@
     throw new StateError("More than one element");
   }
 
-  Node min([int compare(Node a, Node b)]) => Collections.min(this, compare);
+  Node min([int compare(Node a, Node b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Node max([int compare(Node a, Node b)]) => Collections.max(this, compare);
+  Node max([int compare(Node a, Node b)]) => IterableMixinWorkaround.max(this, compare);
 
   Node removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Node removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Node element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Node element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
@@ -10969,13 +10947,13 @@
 
   // -- end List<Node> mixins.
 
-  /// @domName HTMLAllCollection.item; @docsEditable true
+  @DocsEditable @DomName('HTMLAllCollection.item')
   Node item(int index) native;
 
-  /// @domName HTMLAllCollection.namedItem; @docsEditable true
+  @DocsEditable @DomName('HTMLAllCollection.namedItem')
   Node namedItem(String name) native;
 
-  /// @domName HTMLAllCollection.tags; @docsEditable true
+  @DocsEditable @DomName('HTMLAllCollection.tags')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> tags(String name) native;
 }
@@ -10984,10 +10962,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLCollection; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLCollection')
 class HtmlCollection implements JavaScriptIndexingBehavior, List<Node> native "*HTMLCollection" {
 
-  /// @domName HTMLCollection.length; @docsEditable true
+  @DocsEditable @DomName('HTMLCollection.length')
   int get length => JS("int", "#.length", this);
 
   Node operator[](int index) => JS("Node", "#[#]", this, index);
@@ -11008,50 +10988,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Node element) => Collections.contains(this, element);
+  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Node element)) => Collections.forEach(this, f);
+  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Node element)) => new MappedList<Node, dynamic>(this, f);
+  List mappedBy(f(Node element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Node> where(bool f(Node element)) => new WhereIterable<Node>(this, f);
+  Iterable<Node> where(bool f(Node element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Node element)) => Collections.every(this, f);
+  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Node element)) => Collections.any(this, f);
+  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);
 
   List<Node> toList() => new List<Node>.from(this);
   Set<Node> toSet() => new Set<Node>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Node> take(int n) => new ListView<Node>(this, 0, n);
+  List<Node> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Node> takeWhile(bool test(Node value)) {
-    return new TakeWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Node> skip(int n) => new ListView<Node>(this, n, null);
+  List<Node> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Node> skipWhile(bool test(Node value)) {
-    return new SkipWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Node firstMatching(bool test(Node value), { Node orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Node lastMatching(bool test(Node value), {Node orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Node singleMatching(bool test(Node value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Node elementAt(int index) {
@@ -11109,16 +11089,36 @@
     throw new StateError("More than one element");
   }
 
-  Node min([int compare(Node a, Node b)]) => Collections.min(this, compare);
+  Node min([int compare(Node a, Node b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Node max([int compare(Node a, Node b)]) => Collections.max(this, compare);
+  Node max([int compare(Node a, Node b)]) => IterableMixinWorkaround.max(this, compare);
 
   Node removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Node removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Node element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Node element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
@@ -11138,10 +11138,10 @@
 
   // -- end List<Node> mixins.
 
-  /// @domName HTMLCollection.item; @docsEditable true
+  @DocsEditable @DomName('HTMLCollection.item')
   Node item(int index) native;
 
-  /// @domName HTMLCollection.namedItem; @docsEditable true
+  @DocsEditable @DomName('HTMLCollection.namedItem')
   Node namedItem(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11151,26 +11151,27 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLDocument
+@DocsEditable
+@DomName('HTMLDocument')
 class HtmlDocument extends Document native "*HTMLDocument" {
 
-  /// @domName HTMLDocument.activeElement; @docsEditable true
+  @DocsEditable @DomName('HTMLDocument.activeElement')
   final Element activeElement;
 
-  /** @domName Document.body */
+  @DomName('Document.body')
   BodyElement get body => document.$dom_body;
 
-  /** @domName Document.body */
+  @DomName('Document.body')
   void set body(BodyElement value) {
     document.$dom_body = value;
   }
 
-  /** @domName Document.caretRangeFromPoint */
+  @DomName('Document.caretRangeFromPoint')
   Range caretRangeFromPoint(int x, int y) {
     return document.$dom_caretRangeFromPoint(x, y);
   }
 
-  /** @domName Document.elementFromPoint */
+  @DomName('Document.elementFromPoint')
   Element elementFromPoint(int x, int y) {
     return document.$dom_elementFromPoint(x, y);
   }
@@ -11209,72 +11210,73 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
+  @DomName('Document.getCSSCanvasContext')
   CanvasRenderingContext getCssCanvasContext(String contextId, String name,
       int width, int height) {
     return document.$dom_getCssCanvasContext(contextId, name, width, height);
   }
 
-  /** @domName Document.head */
+  @DomName('Document.head')
   HeadElement get head => document.$dom_head;
 
-  /** @domName Document.lastModified */
+  @DomName('Document.lastModified')
   String get lastModified => document.$dom_lastModified;
 
-  /** @domName Document.preferredStylesheetSet */
+  @DomName('Document.preferredStylesheetSet')
   String get preferredStylesheetSet => document.$dom_preferredStylesheetSet;
 
-  /** @domName Document.referrer */
+  @DomName('Document.referrer')
   String get referrer => document.$dom_referrer;
 
-  /** @domName Document.selectedStylesheetSet */
+  @DomName('Document.selectedStylesheetSet')
   String get selectedStylesheetSet => document.$dom_selectedStylesheetSet;
   void set selectedStylesheetSet(String value) {
     document.$dom_selectedStylesheetSet = value;
   }
 
-  /** @domName Document.styleSheets */
+  @DomName('Document.styleSheets')
   List<StyleSheet> get styleSheets => document.$dom_styleSheets;
 
-  /** @domName Document.title */
+  @DomName('Document.title')
   String get title => document.$dom_title;
 
-  /** @domName Document.title */
+  @DomName('Document.title')
   void set title(String value) {
     document.$dom_title = value;
   }
 
-  /** @domName Document.webkitCancelFullScreen */
+  @DomName('Document.webkitCancelFullScreen')
   void webkitCancelFullScreen() {
     document.$dom_webkitCancelFullScreen();
   }
 
-  /** @domName Document.webkitExitFullscreen */
+  @DomName('Document.webkitExitFullscreen')
   void webkitExitFullscreen() {
     document.$dom_webkitExitFullscreen();
   }
 
-  /** @domName Document.webkitExitPointerLock */
+  @DomName('Document.webkitExitPointerLock')
   void webkitExitPointerLock() {
     document.$dom_webkitExitPointerLock();
   }
 
-  /** @domName Document.webkitFullscreenElement */
+  @DomName('Document.webkitFullscreenElement')
   Element get webkitFullscreenElement => document.$dom_webkitFullscreenElement;
 
-  /** @domName Document.webkitFullscreenEnabled */
+  @DomName('Document.webkitFullscreenEnabled')
   bool get webkitFullscreenEnabled => document.$dom_webkitFullscreenEnabled;
 
-  /** @domName Document.webkitHidden */
+  @DomName('Document.webkitHidden')
   bool get webkitHidden => document.$dom_webkitHidden;
 
-  /** @domName Document.webkitIsFullScreen */
+  @DomName('Document.webkitIsFullScreen')
   bool get webkitIsFullScreen => document.$dom_webkitIsFullScreen;
 
-  /** @domName Document.webkitPointerLockElement */
+  @DomName('Document.webkitPointerLockElement')
   Element get webkitPointerLockElement =>
       document.$dom_webkitPointerLockElement;
 
-  /** @domName Document.webkitVisibilityState */
+  @DomName('Document.webkitVisibilityState')
   String get webkitVisibilityState => document.$dom_webkitVisibilityState;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11282,10 +11284,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLHtmlElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLHtmlElement')
 class HtmlElement extends Element native "*HTMLHtmlElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory HtmlElement() => document.$dom_createElement("html");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11293,10 +11297,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLFormControlsCollection; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLFormControlsCollection')
 class HtmlFormControlsCollection extends HtmlCollection native "*HTMLFormControlsCollection" {
 
-  /// @domName HTMLFormControlsCollection.namedItem; @docsEditable true
+  @DocsEditable @DomName('HTMLFormControlsCollection.namedItem')
   Node namedItem(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11304,26 +11310,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLOptionsCollection; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLOptionsCollection')
 class HtmlOptionsCollection extends HtmlCollection native "*HTMLOptionsCollection" {
-
-  // Shadowing definition.
-  /// @domName HTMLOptionsCollection.length; @docsEditable true
-  int get length => JS("int", "#.length", this);
-
-  /// @domName HTMLOptionsCollection.length; @docsEditable true
-  void set length(int value) {
-    JS("void", "#.length = #", this, value);
-  }
-
-  /// @domName HTMLOptionsCollection.selectedIndex; @docsEditable true
-  int selectedIndex;
-
-  /// @domName HTMLOptionsCollection.namedItem; @docsEditable true
-  Node namedItem(String name) native;
-
-  /// @domName HTMLOptionsCollection.remove; @docsEditable true
-  void remove(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -11332,34 +11322,34 @@
 
 /**
  * A utility for retrieving data from a URL.
- *
+ * 
  * HttpRequest can be used to obtain data from http, ftp, and file
- * protocols.
- *
+ * protocols. 
+ * 
  * For example, suppose we're developing these API docs, and we
  * wish to retrieve the HTML of the top-level page and print it out.
  * The easiest way to do that would be:
- *
+ * 
  *     var httpRequest = HttpRequest.get('http://api.dartlang.org',
  *         (request) => print(request.responseText));
- *
+ * 
  * **Important**: With the default behavior of this class, your
  * code making the request should be served from the same origin (domain name,
  * port, and application layer protocol) as the URL you are trying to access
- * with HttpRequest. However, there are ways to
+ * with HttpRequest. However, there are ways to 
  * [get around this restriction](http://www.dartlang.org/articles/json-web-service/#note-on-jsonp).
- *
+ * 
  * See also:
  *
  * * [Dart article on using HttpRequests](http://www.dartlang.org/articles/json-web-service/#getting-data)
  * * [JS XMLHttpRequest](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest)
  * * [Using XMLHttpRequest](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Using_XMLHttpRequest)
  */
-/// @domName XMLHttpRequest
+@DomName('XMLHttpRequest')
 class HttpRequest extends EventTarget native "*XMLHttpRequest" {
   /**
    * Creates a URL get request for the specified `url`.
-   *
+   * 
    * After completing the request, the object will call the user-provided
    * [onComplete] callback.
    */
@@ -11371,8 +11361,8 @@
    * Creates a URL GET request for the specified `url` with
    * credentials such a cookie (already) set in the header or
    * [authorization headers](http://tools.ietf.org/html/rfc1945#section-10.2).
-   *
-   * After completing the request, the object will call the user-provided
+   * 
+   * After completing the request, the object will call the user-provided 
    * [onComplete] callback.
    *
    * A few other details to keep in mind when using credentials:
@@ -11381,7 +11371,7 @@
    * * The `Access-Control-Allow-Origin` header of `url` cannot contain a wildcard (*).
    * * The `Access-Control-Allow-Credentials` header of `url` must be set to true.
    * * If `Access-Control-Expose-Headers` has not been set to true, only a subset of all the response headers will be returned when calling [getAllRequestHeaders].
-   *
+   * 
    * See also: [authorization headers](http://en.wikipedia.org/wiki/Basic_access_authentication).
    */
   factory HttpRequest.getWithCredentials(String url,
@@ -11403,16 +11393,12 @@
 
   static const EventStreamProvider<ProgressEvent> readyStateChangeEvent = const EventStreamProvider<ProgressEvent>('readystatechange');
 
-  ///@docsEditable true
+  @DocsEditable
   factory HttpRequest() => HttpRequest._create();
   static HttpRequest _create() => JS('HttpRequest', 'new XMLHttpRequest()');
 
-  /**
-   * Get the set of [HttpRequestEvents] that this request can respond to.
-   * Usually used when adding an EventListener, such as in
-   * `document.window.on.keyDown.add((e) => print('keydown happened'))`.
-   */
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   HttpRequestEvents get on =>
     new HttpRequestEvents(this);
 
@@ -11426,191 +11412,65 @@
 
   static const int UNSENT = 0;
 
-  /**
-   * Indicator of the current state of the request:
-   *
-   * <table>
-   *   <tr>
-   *     <td>Value</td>
-   *     <td>State</td>
-   *     <td>Meaning</td>
-   *   </tr>
-   *   <tr>
-   *     <td>0</td>
-   *     <td>unsent</td>
-   *     <td><code>open()</code> has not yet been called</td>
-   *   </tr>
-   *   <tr>
-   *     <td>1</td>
-   *     <td>opened</td>
-   *     <td><code>send()</code> has not yet been called</td>
-   *   </tr>
-   *   <tr>
-   *     <td>2</td>
-   *     <td>headers received</td>
-   *     <td><code>sent()</code> has been called; response headers and <code>status</code> are available</td>
-   *   </tr>
-   *   <tr>
-   *     <td>3</td> <td>loading</td> <td><code>responseText</code> holds some data</td>
-   *   </tr>
-   *   <tr>
-   *     <td>4</td> <td>done</td> <td>request is complete</td>
-   *   </tr>
-   * </table>
-   */
-  /// @domName XMLHttpRequest.readyState; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequest.readyState')
   final int readyState;
 
-  /**
-   * The data received as a reponse from the request.
-   *
-   * The data could be in the
-   * form of a [String], [ArrayBuffer], [Document], [Blob], or json (also a
-   * [String]). `null` indicates request failure.
-   */
-  /// @domName XMLHttpRequest.response; @docsEditable true
-  @Creates('ArrayBuffer|Blob|Document|=Object|=List|String|num')
+  @DocsEditable @DomName('XMLHttpRequest.response') @Creates('ArrayBuffer|Blob|Document|=Object|=List|String|num')
   final Object response;
 
-  /**
-   * The response in string form or null on failure.
-   */
-  /// @domName XMLHttpRequest.responseText; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequest.responseText')
   final String responseText;
 
-  /**
-   * [String] telling the server the desired response format.
-   *
-   * Default is `String`.
-   * Other options are one of 'arraybuffer', 'blob', 'document', 'json',
-   * 'text'. Some newer browsers will throw `NS_ERROR_DOM_INVALID_ACCESS_ERR` if
-   * `responseType` is set while performing a synchronous request.
-   *
-   * See also: [MDN responseType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType)
-   */
-  /// @domName XMLHttpRequest.responseType; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequest.responseType')
   String responseType;
 
-  /**
-   * The request response, or null on failure.
-   *
-   * The response is processed as
-   * `text/xml` stream, unless responseType = 'document' and the request is
-   * synchronous.
-   */
-  /// @domName XMLHttpRequest.responseXML; @docsEditable true
   @JSName('responseXML')
+  @DocsEditable @DomName('XMLHttpRequest.responseXML')
   final Document responseXml;
 
-  /**
-   * The http result code from the request (200, 404, etc).
-   * See also: [Http Status Codes](http://en.wikipedia.org/wiki/List_of_HTTP_status_codes)
-   */
-  /// @domName XMLHttpRequest.status; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequest.status')
   final int status;
 
-  /**
-   * The request response string (such as "200 OK").
-   * See also: [Http Status Codes](http://en.wikipedia.org/wiki/List_of_HTTP_status_codes)
-   */
-  /// @domName XMLHttpRequest.statusText; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequest.statusText')
   final String statusText;
 
-  /**
-   * [EventTarget] that can hold listeners to track the progress of the request.
-   * The events fired will be members of [HttpRequestUploadEvents].
-   */
-  /// @domName XMLHttpRequest.upload; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequest.upload')
   final HttpRequestUpload upload;
 
-  /**
-   * True if cross-site requests should use credentials such as cookies
-   * or authorization headers; false otherwise.
-   *
-   * This value is ignored for same-site requests.
-   */
-  /// @domName XMLHttpRequest.withCredentials; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequest.withCredentials')
   bool withCredentials;
 
-  /**
-   * Stop the current request.
-   *
-   * The request can only be stopped if readyState is `HEADERS_RECIEVED` or
-   * `LOADING`. If this method is not in the process of being sent, the method
-   * has no effect.
-   */
-  /// @domName XMLHttpRequest.abort; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequest.abort')
   void abort() native;
 
-  /// @domName XMLHttpRequest.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('XMLHttpRequest.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName XMLHttpRequest.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('XMLHttpRequest.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /**
-   * Retrieve all the response headers from a request.
-   *
-   * `null` if no headers have been received. For multipart requests,
-   * `getAllResponseHeaders` will return the response headers for the current
-   * part of the request.
-   *
-   * See also [HTTP response headers](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Responses)
-   * for a list of common response headers.
-   */
-  /// @domName XMLHttpRequest.getAllResponseHeaders; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequest.getAllResponseHeaders')
   String getAllResponseHeaders() native;
 
-  /**
-   * Return the response header named `header`, or `null` if not found.
-   *
-   * See also [HTTP response headers](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Responses)
-   * for a list of common response headers.
-   */
-  /// @domName XMLHttpRequest.getResponseHeader; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequest.getResponseHeader')
   String getResponseHeader(String header) native;
 
-  /**
-   * Specify the desired `url`, and `method` to use in making the request.
-   *
-   * By default the request is done asyncronously, with no user or password
-   * authentication information. If `async` is false, the request will be send
-   * synchronously.
-   *
-   * Calling `open` again on a currently active request is equivalent to
-   * calling `abort`.
-   */
-  /// @domName XMLHttpRequest.open; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequest.open')
   void open(String method, String url, [bool async, String user, String password]) native;
 
-  /**
-   * Specify a particular MIME type (such as `text/xml`) desired for the
-   * response.
-   *
-   * This value must be set before the request has been sent. See also the list
-   * of [common MIME types](http://en.wikipedia.org/wiki/Internet_media_type#List_of_common_media_types)
-   */
-  /// @domName XMLHttpRequest.overrideMimeType; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequest.overrideMimeType')
   void overrideMimeType(String override) native;
 
-  /// @domName XMLHttpRequest.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('XMLHttpRequest.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /**
-   * Send the request with any given `data`.
-   *
-   * See also:
-   * [send() docs](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send())
-   * from MDN.
-   */
-  /// @domName XMLHttpRequest.send; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequest.send')
   void send([data]) native;
 
-  /** Sets HTTP `header` to `value`. */
-  /// @domName XMLHttpRequest.setRequestHeader; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequest.setRequestHeader')
   void setRequestHeader(String header, String value) native;
 
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
@@ -11629,74 +11489,30 @@
 
 }
 
-/**
- * A class that supports listening for and dispatching events that can fire when
- * making an HTTP request.
- *
- * Here's an example of adding an event handler that executes once an HTTP
- * request has fully loaded:
- *
- *     httpRequest.on.loadEnd.add((e) => myCustomLoadEndHandler(e));
- *
- * Each property of this class is a read-only pointer to an [EventListenerList].
- * That list holds all of the [EventListener]s that have registered for that
- * particular type of event that fires from an HttpRequest.
- */
-/// @docsEditable true
+@DocsEditable
 class HttpRequestEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   HttpRequestEvents(EventTarget _ptr) : super(_ptr);
 
-  /**
-   * Event listeners to be notified when request has been aborted,
-   * generally due to calling `httpRequest.abort()`.
-   */
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /**
-   * Event listeners to be notified when a request has failed, such as when a
-   * cross-domain error occurred or the file wasn't found on the server.
-   */
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /**
-   * Event listeners to be notified once the request has completed
-   * *successfully*.
-   */
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get load => this['load'];
 
-  /**
-   * Event listeners to be notified once the request has completed (on
-   * either success or failure).
-   */
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadEnd => this['loadend'];
 
-  /**
-   * Event listeners to be notified when the request starts, once
-   * `httpRequest.send()` has been called.
-   */
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadStart => this['loadstart'];
 
-  /**
-   * Event listeners to be notified when data for the request
-   * is being sent or loaded.
-   *
-   * Progress events are fired every 50ms or for every byte transmitted,
-   * whichever is less frequent.
-   */
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get progress => this['progress'];
 
-  /**
-   * Event listeners to be notified every time the [HttpRequest]
-   * object's `readyState` changes values.
-   */
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get readyStateChange => this['readystatechange'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11704,23 +11520,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XMLHttpRequestException; @docsEditable true
+
+@DocsEditable
+@DomName('XMLHttpRequestException')
 class HttpRequestException native "*XMLHttpRequestException" {
 
   static const int ABORT_ERR = 102;
 
   static const int NETWORK_ERR = 101;
 
-  /// @domName XMLHttpRequestException.code; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequestException.code')
   final int code;
 
-  /// @domName XMLHttpRequestException.message; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequestException.message')
   final String message;
 
-  /// @domName XMLHttpRequestException.name; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequestException.name')
   final String name;
 
-  /// @domName XMLHttpRequestException.toString; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequestException.toString')
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11728,13 +11546,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XMLHttpRequestProgressEvent; @docsEditable true
+
+@DocsEditable
+@DomName('XMLHttpRequestProgressEvent')
 class HttpRequestProgressEvent extends ProgressEvent native "*XMLHttpRequestProgressEvent" {
 
-  /// @domName XMLHttpRequestProgressEvent.position; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequestProgressEvent.position')
   final int position;
 
-  /// @domName XMLHttpRequestProgressEvent.totalSize; @docsEditable true
+  @DocsEditable @DomName('XMLHttpRequestProgressEvent.totalSize')
   final int totalSize;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11742,7 +11562,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XMLHttpRequestUpload; @docsEditable true
+
+@DocsEditable
+@DomName('XMLHttpRequestUpload')
 class HttpRequestUpload extends EventTarget native "*XMLHttpRequestUpload" {
 
   static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
@@ -11757,20 +11579,21 @@
 
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   HttpRequestUploadEvents get on =>
     new HttpRequestUploadEvents(this);
 
-  /// @domName XMLHttpRequestUpload.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('XMLHttpRequestUpload.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName XMLHttpRequestUpload.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('XMLHttpRequestUpload.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName XMLHttpRequestUpload.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('XMLHttpRequestUpload.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
@@ -11786,27 +11609,27 @@
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class HttpRequestUploadEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   HttpRequestUploadEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get load => this['load'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadEnd => this['loadend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadStart => this['loadstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get progress => this['progress'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11814,34 +11637,35 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLIFrameElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLIFrameElement')
 class IFrameElement extends Element native "*HTMLIFrameElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory IFrameElement() => document.$dom_createElement("iframe");
 
-  /// @domName HTMLIFrameElement.contentWindow; @docsEditable true
   WindowBase get contentWindow => _convertNativeToDart_Window(this._contentWindow);
   @JSName('contentWindow')
-  @Creates('Window|=Object') @Returns('Window|=Object')
+  @DocsEditable @DomName('HTMLIFrameElement.contentWindow') @Creates('Window|=Object') @Returns('Window|=Object')
   final dynamic _contentWindow;
 
-  /// @domName HTMLIFrameElement.height; @docsEditable true
+  @DocsEditable @DomName('HTMLIFrameElement.height')
   String height;
 
-  /// @domName HTMLIFrameElement.name; @docsEditable true
+  @DocsEditable @DomName('HTMLIFrameElement.name')
   String name;
 
-  /// @domName HTMLIFrameElement.sandbox; @docsEditable true
+  @DocsEditable @DomName('HTMLIFrameElement.sandbox')
   String sandbox;
 
-  /// @domName HTMLIFrameElement.src; @docsEditable true
+  @DocsEditable @DomName('HTMLIFrameElement.src')
   String src;
 
-  /// @domName HTMLIFrameElement.srcdoc; @docsEditable true
+  @DocsEditable @DomName('HTMLIFrameElement.srcdoc')
   String srcdoc;
 
-  /// @domName HTMLIFrameElement.width; @docsEditable true
+  @DocsEditable @DomName('HTMLIFrameElement.width')
   String width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11849,16 +11673,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ImageData; @docsEditable true
+
+@DocsEditable
+@DomName('ImageData')
 class ImageData native "*ImageData" {
 
-  /// @domName ImageData.data; @docsEditable true
+  @DocsEditable @DomName('ImageData.data')
   final Uint8ClampedArray data;
 
-  /// @domName ImageData.height; @docsEditable true
+  @DocsEditable @DomName('ImageData.height')
   final int height;
 
-  /// @domName ImageData.width; @docsEditable true
+  @DocsEditable @DomName('ImageData.width')
   final int width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11866,10 +11692,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLImageElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLImageElement')
 class ImageElement extends Element native "*HTMLImageElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory ImageElement({String src, int width, int height}) {
     var e = document.$dom_createElement("img");
     if (src != null) e.src = src;
@@ -11878,46 +11706,46 @@
     return e;
   }
 
-  /// @domName HTMLImageElement.alt; @docsEditable true
+  @DocsEditable @DomName('HTMLImageElement.alt')
   String alt;
 
-  /// @domName HTMLImageElement.border; @docsEditable true
+  @DocsEditable @DomName('HTMLImageElement.border')
   String border;
 
-  /// @domName HTMLImageElement.complete; @docsEditable true
+  @DocsEditable @DomName('HTMLImageElement.complete')
   final bool complete;
 
-  /// @domName HTMLImageElement.crossOrigin; @docsEditable true
+  @DocsEditable @DomName('HTMLImageElement.crossOrigin')
   String crossOrigin;
 
-  /// @domName HTMLImageElement.height; @docsEditable true
+  @DocsEditable @DomName('HTMLImageElement.height')
   int height;
 
-  /// @domName HTMLImageElement.isMap; @docsEditable true
+  @DocsEditable @DomName('HTMLImageElement.isMap')
   bool isMap;
 
-  /// @domName HTMLImageElement.lowsrc; @docsEditable true
+  @DocsEditable @DomName('HTMLImageElement.lowsrc')
   String lowsrc;
 
-  /// @domName HTMLImageElement.naturalHeight; @docsEditable true
+  @DocsEditable @DomName('HTMLImageElement.naturalHeight')
   final int naturalHeight;
 
-  /// @domName HTMLImageElement.naturalWidth; @docsEditable true
+  @DocsEditable @DomName('HTMLImageElement.naturalWidth')
   final int naturalWidth;
 
-  /// @domName HTMLImageElement.src; @docsEditable true
+  @DocsEditable @DomName('HTMLImageElement.src')
   String src;
 
-  /// @domName HTMLImageElement.useMap; @docsEditable true
+  @DocsEditable @DomName('HTMLImageElement.useMap')
   String useMap;
 
-  /// @domName HTMLImageElement.width; @docsEditable true
+  @DocsEditable @DomName('HTMLImageElement.width')
   int width;
 
-  /// @domName HTMLImageElement.x; @docsEditable true
+  @DocsEditable @DomName('HTMLImageElement.x')
   final int x;
 
-  /// @domName HTMLImageElement.y; @docsEditable true
+  @DocsEditable @DomName('HTMLImageElement.y')
   final int y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11925,7 +11753,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLInputElement
+@DocsEditable
+@DomName('HTMLInputElement')
 class InputElement extends Element implements
     HiddenInputElement,
     SearchInputElement,
@@ -11951,7 +11780,6 @@
     ButtonInputElement
      native "*HTMLInputElement" {
 
-  ///@docsEditable true
   factory InputElement({String type}) {
     var e = document.$dom_createElement("input");
     if (type != null) {
@@ -11965,179 +11793,180 @@
 
   static const EventStreamProvider<Event> speechChangeEvent = const EventStreamProvider<Event>('webkitSpeechChange');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   InputElementEvents get on =>
     new InputElementEvents(this);
 
-  /// @domName HTMLInputElement.accept; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.accept')
   String accept;
 
-  /// @domName HTMLInputElement.alt; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.alt')
   String alt;
 
-  /// @domName HTMLInputElement.autocomplete; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.autocomplete')
   String autocomplete;
 
-  /// @domName HTMLInputElement.autofocus; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.autofocus')
   bool autofocus;
 
-  /// @domName HTMLInputElement.checked; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.checked')
   bool checked;
 
-  /// @domName HTMLInputElement.defaultChecked; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.defaultChecked')
   bool defaultChecked;
 
-  /// @domName HTMLInputElement.defaultValue; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.defaultValue')
   String defaultValue;
 
-  /// @domName HTMLInputElement.dirName; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.dirName')
   String dirName;
 
-  /// @domName HTMLInputElement.disabled; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.disabled')
   bool disabled;
 
-  /// @domName HTMLInputElement.files; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.files')
   @Returns('FileList') @Creates('FileList')
   List<File> files;
 
-  /// @domName HTMLInputElement.form; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.form')
   final FormElement form;
 
-  /// @domName HTMLInputElement.formAction; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.formAction')
   String formAction;
 
-  /// @domName HTMLInputElement.formEnctype; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.formEnctype')
   String formEnctype;
 
-  /// @domName HTMLInputElement.formMethod; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.formMethod')
   String formMethod;
 
-  /// @domName HTMLInputElement.formNoValidate; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.formNoValidate')
   bool formNoValidate;
 
-  /// @domName HTMLInputElement.formTarget; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.formTarget')
   String formTarget;
 
-  /// @domName HTMLInputElement.height; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.height')
   int height;
 
-  /// @domName HTMLInputElement.incremental; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.incremental')
   bool incremental;
 
-  /// @domName HTMLInputElement.indeterminate; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.indeterminate')
   bool indeterminate;
 
-  /// @domName HTMLInputElement.labels; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.labels')
   @Returns('NodeList') @Creates('NodeList')
   final List<Node> labels;
 
-  /// @domName HTMLInputElement.list; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.list')
   final Element list;
 
-  /// @domName HTMLInputElement.max; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.max')
   String max;
 
-  /// @domName HTMLInputElement.maxLength; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.maxLength')
   int maxLength;
 
-  /// @domName HTMLInputElement.min; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.min')
   String min;
 
-  /// @domName HTMLInputElement.multiple; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.multiple')
   bool multiple;
 
-  /// @domName HTMLInputElement.name; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.name')
   String name;
 
-  /// @domName HTMLInputElement.pattern; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.pattern')
   String pattern;
 
-  /// @domName HTMLInputElement.placeholder; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.placeholder')
   String placeholder;
 
-  /// @domName HTMLInputElement.readOnly; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.required')
   bool required;
 
-  /// @domName HTMLInputElement.selectionDirection; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.selectionDirection')
   String selectionDirection;
 
-  /// @domName HTMLInputElement.selectionEnd; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.selectionEnd')
   int selectionEnd;
 
-  /// @domName HTMLInputElement.selectionStart; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.selectionStart')
   int selectionStart;
 
-  /// @domName HTMLInputElement.size; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.size')
   int size;
 
-  /// @domName HTMLInputElement.src; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.src')
   String src;
 
-  /// @domName HTMLInputElement.step; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.step')
   String step;
 
-  /// @domName HTMLInputElement.type; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.type')
   String type;
 
-  /// @domName HTMLInputElement.useMap; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.useMap')
   String useMap;
 
-  /// @domName HTMLInputElement.validationMessage; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.validationMessage')
   final String validationMessage;
 
-  /// @domName HTMLInputElement.validity; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.validity')
   final ValidityState validity;
 
-  /// @domName HTMLInputElement.value; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.value')
   String value;
 
-  /// @domName HTMLInputElement.valueAsDate; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.valueAsDate')
   Date valueAsDate;
 
-  /// @domName HTMLInputElement.valueAsNumber; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.valueAsNumber')
   num valueAsNumber;
 
-  /// @domName HTMLInputElement.webkitEntries; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.webkitEntries')
   @Returns('_EntryArray') @Creates('_EntryArray')
   final List<Entry> webkitEntries;
 
-  /// @domName HTMLInputElement.webkitGrammar; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.webkitGrammar')
   bool webkitGrammar;
 
-  /// @domName HTMLInputElement.webkitSpeech; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.webkitSpeech')
   bool webkitSpeech;
 
-  /// @domName HTMLInputElement.webkitdirectory; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.webkitdirectory')
   bool webkitdirectory;
 
-  /// @domName HTMLInputElement.width; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.width')
   int width;
 
-  /// @domName HTMLInputElement.willValidate; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.willValidate')
   final bool willValidate;
 
-  /// @domName HTMLInputElement.checkValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.checkValidity')
   bool checkValidity() native;
 
-  /// @domName HTMLInputElement.select; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.select')
   void select() native;
 
-  /// @domName HTMLInputElement.setCustomValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.setCustomValidity')
   void setCustomValidity(String error) native;
 
-  /// @domName HTMLInputElement.setRangeText; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.setRangeText')
   void setRangeText(String replacement, [int start, int end, String selectionMode]) native;
 
-  /// @domName HTMLInputElement.setSelectionRange; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.setSelectionRange')
   void setSelectionRange(int start, int end, [String direction]) native;
 
-  /// @domName HTMLInputElement.stepDown; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.stepDown')
   void stepDown([int n]) native;
 
-  /// @domName HTMLInputElement.stepUp; @docsEditable true
+  @DocsEditable @DomName('HTMLInputElement.stepUp')
   void stepUp([int n]) native;
 
   Stream<Event> get onSpeechChange => speechChangeEvent.forTarget(this);
@@ -12153,40 +11982,40 @@
  * Exposes the functionality common between all InputElement types.
  */
 abstract class InputElementBase implements Element {
-  /// @domName HTMLInputElement.autofocus
+  @DomName('HTMLInputElement.autofocus')
   bool autofocus;
 
-  /// @domName HTMLInputElement.disabled
+  @DomName('HTMLInputElement.disabled')
   bool disabled;
 
-  /// @domName HTMLInputElement.incremental
+  @DomName('HTMLInputElement.incremental')
   bool incremental;
 
-  /// @domName HTMLInputElement.indeterminate
+  @DomName('HTMLInputElement.indeterminate')
   bool indeterminate;
 
-  /// @domName HTMLInputElement.labels
+  @DomName('HTMLInputElement.labels')
   List<Node> get labels;
 
-  /// @domName HTMLInputElement.name
+  @DomName('HTMLInputElement.name')
   String name;
 
-  /// @domName HTMLInputElement.validationMessage
+  @DomName('HTMLInputElement.validationMessage')
   String get validationMessage;
 
-  /// @domName HTMLInputElement.validity
+  @DomName('HTMLInputElement.validity')
   ValidityState get validity;
 
-  /// @domName HTMLInputElement.value
+  @DomName('HTMLInputElement.value')
   String value;
 
-  /// @domName HTMLInputElement.willValidate
+  @DomName('HTMLInputElement.willValidate')
   bool get willValidate;
 
-  /// @domName HTMLInputElement.checkValidity
+  @DomName('HTMLInputElement.checkValidity')
   bool checkValidity();
 
-  /// @domName HTMLInputElement.setCustomValidity
+  @DomName('HTMLInputElement.setCustomValidity')
   void setCustomValidity(String error);
 }
 
@@ -12202,40 +12031,40 @@
  * Base interface for all inputs which involve text editing.
  */
 abstract class TextInputElementBase implements InputElementBase {
-  /// @domName HTMLInputElement.autocomplete
+  @DomName('HTMLInputElement.autocomplete')
   String autocomplete;
 
-  /// @domName HTMLInputElement.maxLength
+  @DomName('HTMLInputElement.maxLength')
   int maxLength;
 
-  /// @domName HTMLInputElement.pattern
+  @DomName('HTMLInputElement.pattern')
   String pattern;
 
-  /// @domName HTMLInputElement.placeholder
+  @DomName('HTMLInputElement.placeholder')
   String placeholder;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
-  /// @domName HTMLInputElement.size
+  @DomName('HTMLInputElement.size')
   int size;
 
-  /// @domName HTMLInputElement.select
+  @DomName('HTMLInputElement.select')
   void select();
 
-  /// @domName HTMLInputElement.selectionDirection
+  @DomName('HTMLInputElement.selectionDirection')
   String selectionDirection;
 
-  /// @domName HTMLInputElement.selectionEnd
+  @DomName('HTMLInputElement.selectionEnd')
   int selectionEnd;
 
-  /// @domName HTMLInputElement.selectionStart
+  @DomName('HTMLInputElement.selectionStart')
   int selectionStart;
 
-  /// @domName HTMLInputElement.setSelectionRange
+  @DomName('HTMLInputElement.setSelectionRange')
   void setSelectionRange(int start, int end, [String direction]);
 }
 
@@ -12252,10 +12081,10 @@
 abstract class SearchInputElement implements TextInputElementBase {
   factory SearchInputElement() => new InputElement(type: 'search');
 
-  /// @domName HTMLInputElement.dirName;
+  @DomName('HTMLInputElement.dirName')
   String dirName;
 
-  /// @domName HTMLInputElement.list;
+  @DomName('HTMLInputElement.list')
   Element get list;
 
   /// Returns true if this input type is supported on the current platform.
@@ -12270,10 +12099,10 @@
 abstract class TextInputElement implements TextInputElementBase {
   factory TextInputElement() => new InputElement(type: 'text');
 
-  /// @domName HTMLInputElement.dirName;
+  @DomName('HTMLInputElement.dirName')
   String dirName;
 
-  /// @domName HTMLInputElement.list;
+  @DomName('HTMLInputElement.list')
   Element get list;
 }
 
@@ -12289,7 +12118,7 @@
 abstract class UrlInputElement implements TextInputElementBase {
   factory UrlInputElement() => new InputElement(type: 'url');
 
-  /// @domName HTMLInputElement.list;
+  @DomName('HTMLInputElement.list')
   Element get list;
 
   /// Returns true if this input type is supported on the current platform.
@@ -12313,7 +12142,7 @@
 abstract class TelephoneInputElement implements TextInputElementBase {
   factory TelephoneInputElement() => new InputElement(type: 'tel');
 
-  /// @domName HTMLInputElement.list;
+  @DomName('HTMLInputElement.list')
   Element get list;
 
   /// Returns true if this input type is supported on the current platform.
@@ -12334,34 +12163,34 @@
 abstract class EmailInputElement implements TextInputElementBase {
   factory EmailInputElement() => new InputElement(type: 'email');
 
-  /// @domName HTMLInputElement.autocomplete
+  @DomName('HTMLInputElement.autocomplete')
   String autocomplete;
 
-  /// @domName HTMLInputElement.autofocus
+  @DomName('HTMLInputElement.autofocus')
   bool autofocus;
 
-  /// @domName HTMLInputElement.list;
+  @DomName('HTMLInputElement.list')
   Element get list;
 
-  /// @domName HTMLInputElement.maxLength
+  @DomName('HTMLInputElement.maxLength')
   int maxLength;
 
-  /// @domName HTMLInputElement.multiple;
+  @DomName('HTMLInputElement.multiple')
   bool multiple;
 
-  /// @domName HTMLInputElement.pattern
+  @DomName('HTMLInputElement.pattern')
   String pattern;
 
-  /// @domName HTMLInputElement.placeholder
+  @DomName('HTMLInputElement.placeholder')
   String placeholder;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
-  /// @domName HTMLInputElement.size
+  @DomName('HTMLInputElement.size')
   int size;
 
   /// Returns true if this input type is supported on the current platform.
@@ -12382,25 +12211,25 @@
  */
 abstract class RangeInputElementBase implements InputElementBase {
 
-  /// @domName HTMLInputElement.list
+  @DomName('HTMLInputElement.list')
   Element get list;
 
-  /// @domName HTMLInputElement.max
+  @DomName('HTMLInputElement.max')
   String max;
 
-  /// @domName HTMLInputElement.min
+  @DomName('HTMLInputElement.min')
   String min;
 
-  /// @domName HTMLInputElement.step
+  @DomName('HTMLInputElement.step')
   String step;
 
-  /// @domName HTMLInputElement.valueAsNumber
+  @DomName('HTMLInputElement.valueAsNumber')
   num valueAsNumber;
 
-  /// @domName HTMLInputElement.stepDown
+  @DomName('HTMLInputElement.stepDown')
   void stepDown([int n]);
 
-  /// @domName HTMLInputElement.stepUp
+  @DomName('HTMLInputElement.stepUp')
   void stepUp([int n]);
 }
 
@@ -12415,13 +12244,13 @@
 abstract class DateTimeInputElement implements RangeInputElementBase {
   factory DateTimeInputElement() => new InputElement(type: 'datetime');
 
-  /// @domName HTMLInputElement.valueAsDate
+  @DomName('HTMLInputElement.valueAsDate')
   Date valueAsDate;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -12440,13 +12269,13 @@
 abstract class DateInputElement implements RangeInputElementBase {
   factory DateInputElement() => new InputElement(type: 'date');
 
-  /// @domName HTMLInputElement.valueAsDate
+  @DomName('HTMLInputElement.valueAsDate')
   Date valueAsDate;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -12465,13 +12294,13 @@
 abstract class MonthInputElement implements RangeInputElementBase {
   factory MonthInputElement() => new InputElement(type: 'month');
 
-  /// @domName HTMLInputElement.valueAsDate
+  @DomName('HTMLInputElement.valueAsDate')
   Date valueAsDate;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -12490,13 +12319,13 @@
 abstract class WeekInputElement implements RangeInputElementBase {
   factory WeekInputElement() => new InputElement(type: 'week');
 
-  /// @domName HTMLInputElement.valueAsDate
+  @DomName('HTMLInputElement.valueAsDate')
   Date valueAsDate;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -12515,13 +12344,13 @@
 abstract class TimeInputElement implements RangeInputElementBase {
   factory TimeInputElement() => new InputElement(type: 'time');
 
-  /// @domName HTMLInputElement.valueAsDate
+  @DomName('HTMLInputElement.valueAsDate')
   Date valueAsDate;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -12542,10 +12371,10 @@
   factory LocalDateTimeInputElement() =>
       new InputElement(type: 'datetime-local');
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -12564,13 +12393,13 @@
 abstract class NumberInputElement implements RangeInputElementBase {
   factory NumberInputElement() => new InputElement(type: 'number');
 
-  /// @domName HTMLInputElement.placeholder
+  @DomName('HTMLInputElement.placeholder')
   String placeholder;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -12606,10 +12435,10 @@
 abstract class CheckboxInputElement implements InputElementBase {
   factory CheckboxInputElement() => new InputElement(type: 'checkbox');
 
-  /// @domName HTMLInputElement.checked
+  @DomName('HTMLInputElement.checked')
   bool checked;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 }
 
@@ -12628,10 +12457,10 @@
 abstract class RadioButtonInputElement implements InputElementBase {
   factory RadioButtonInputElement() => new InputElement(type: 'radio');
 
-  /// @domName HTMLInputElement.checked
+  @DomName('HTMLInputElement.checked')
   bool checked;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 }
 
@@ -12641,16 +12470,16 @@
 abstract class FileUploadInputElement implements InputElementBase {
   factory FileUploadInputElement() => new InputElement(type: 'file');
 
-  /// @domName HTMLInputElement.accept
+  @DomName('HTMLInputElement.accept')
   String accept;
 
-  /// @domName HTMLInputElement.multiple
+  @DomName('HTMLInputElement.multiple')
   bool multiple;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
-  /// @domName HTMLInputElement.files
+  @DomName('HTMLInputElement.files')
   List<File> files;
 }
 
@@ -12660,19 +12489,19 @@
 abstract class SubmitButtonInputElement implements InputElementBase {
   factory SubmitButtonInputElement() => new InputElement(type: 'submit');
 
-  /// @domName HTMLInputElement.formAction
+  @DomName('HTMLInputElement.formAction')
   String formAction;
 
-  /// @domName HTMLInputElement.formEnctype
+  @DomName('HTMLInputElement.formEnctype')
   String formEnctype;
 
-  /// @domName HTMLInputElement.formMethod
+  @DomName('HTMLInputElement.formMethod')
   String formMethod;
 
-  /// @domName HTMLInputElement.formNoValidate
+  @DomName('HTMLInputElement.formNoValidate')
   bool formNoValidate;
 
-  /// @domName HTMLInputElement.formTarget
+  @DomName('HTMLInputElement.formTarget')
   String formTarget;
 }
 
@@ -12683,31 +12512,31 @@
 abstract class ImageButtonInputElement implements InputElementBase {
   factory ImageButtonInputElement() => new InputElement(type: 'image');
 
-  /// @domName HTMLInputElement.alt
+  @DomName('HTMLInputElement.alt')
   String alt;
 
-  /// @domName HTMLInputElement.formAction
+  @DomName('HTMLInputElement.formAction')
   String formAction;
 
-  /// @domName HTMLInputElement.formEnctype
+  @DomName('HTMLInputElement.formEnctype')
   String formEnctype;
 
-  /// @domName HTMLInputElement.formMethod
+  @DomName('HTMLInputElement.formMethod')
   String formMethod;
 
-  /// @domName HTMLInputElement.formNoValidate
+  @DomName('HTMLInputElement.formNoValidate')
   bool formNoValidate;
 
-  /// @domName HTMLInputElement.formTarget
+  @DomName('HTMLInputElement.formTarget')
   String formTarget;
 
-  /// @domName HTMLInputElement.height
+  @DomName('HTMLInputElement.height')
   int height;
 
-  /// @domName HTMLInputElement.src
+  @DomName('HTMLInputElement.src')
   String src;
 
-  /// @domName HTMLInputElement.width
+  @DomName('HTMLInputElement.width')
   int width;
 }
 
@@ -12726,12 +12555,12 @@
 }
 
 
-/// @docsEditable true
+@DocsEditable
 class InputElementEvents extends ElementEvents {
-  /// @docsEditable true
+  @DocsEditable
   InputElementEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get speechChange => this['webkitSpeechChange'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12739,7 +12568,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Int16Array; @docsEditable true
+
+@DocsEditable
+@DomName('Int16Array')
 class Int16Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Int16Array" {
 
   factory Int16Array(int length) =>
@@ -12748,12 +12579,12 @@
   factory Int16Array.fromList(List<int> list) =>
     _TypedArrayFactoryProvider.createInt16Array_fromList(list);
 
-  factory Int16Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) =>
+  factory Int16Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createInt16Array_fromBuffer(buffer, byteOffset, length);
 
   static const int BYTES_PER_ELEMENT = 2;
 
-  /// @domName Int16Array.length; @docsEditable true
+  @DocsEditable @DomName('Int16Array.length')
   int get length => JS("int", "#.length", this);
 
   int operator[](int index) => JS("int", "#[#]", this, index);
@@ -12771,50 +12602,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(int element) => Collections.contains(this, element);
+  bool contains(int element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(int element)) => Collections.forEach(this, f);
+  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(int element)) => new MappedList<int, dynamic>(this, f);
+  List mappedBy(f(int element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<int> where(bool f(int element)) => new WhereIterable<int>(this, f);
+  Iterable<int> where(bool f(int element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(int element)) => Collections.every(this, f);
+  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(int element)) => Collections.any(this, f);
+  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);
 
   List<int> toList() => new List<int>.from(this);
   Set<int> toSet() => new Set<int>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<int> take(int n) => new ListView<int>(this, 0, n);
+  List<int> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<int> takeWhile(bool test(int value)) {
-    return new TakeWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<int> skip(int n) => new ListView<int>(this, n, null);
+  List<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<int> skipWhile(bool test(int value)) {
-    return new SkipWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   int firstMatching(bool test(int value), { int orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   int lastMatching(bool test(int value), {int orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   int singleMatching(bool test(int value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   int elementAt(int index) {
@@ -12872,16 +12703,36 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) => Collections.min(this, compare);
+  int min([int compare(int a, int b)]) => IterableMixinWorkaround.min(this, compare);
 
-  int max([int compare(int a, int b)]) => Collections.max(this, compare);
+  int max([int compare(int a, int b)]) => IterableMixinWorkaround.max(this, compare);
 
   int removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
@@ -12901,11 +12752,11 @@
 
   // -- end List<int> mixins.
 
-  /// @domName Int16Array.setElements; @docsEditable true
   @JSName('set')
+  @DocsEditable @DomName('Int16Array.set')
   void setElements(Object array, [int offset]) native;
 
-  /// @domName Int16Array.subarray; @docsEditable true
+  @DocsEditable @DomName('Int16Array.subarray')
   Int16Array subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12913,7 +12764,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Int32Array; @docsEditable true
+
+@DocsEditable
+@DomName('Int32Array')
 class Int32Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Int32Array" {
 
   factory Int32Array(int length) =>
@@ -12922,12 +12775,12 @@
   factory Int32Array.fromList(List<int> list) =>
     _TypedArrayFactoryProvider.createInt32Array_fromList(list);
 
-  factory Int32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) =>
+  factory Int32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createInt32Array_fromBuffer(buffer, byteOffset, length);
 
   static const int BYTES_PER_ELEMENT = 4;
 
-  /// @domName Int32Array.length; @docsEditable true
+  @DocsEditable @DomName('Int32Array.length')
   int get length => JS("int", "#.length", this);
 
   int operator[](int index) => JS("int", "#[#]", this, index);
@@ -12945,50 +12798,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(int element) => Collections.contains(this, element);
+  bool contains(int element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(int element)) => Collections.forEach(this, f);
+  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(int element)) => new MappedList<int, dynamic>(this, f);
+  List mappedBy(f(int element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<int> where(bool f(int element)) => new WhereIterable<int>(this, f);
+  Iterable<int> where(bool f(int element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(int element)) => Collections.every(this, f);
+  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(int element)) => Collections.any(this, f);
+  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);
 
   List<int> toList() => new List<int>.from(this);
   Set<int> toSet() => new Set<int>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<int> take(int n) => new ListView<int>(this, 0, n);
+  List<int> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<int> takeWhile(bool test(int value)) {
-    return new TakeWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<int> skip(int n) => new ListView<int>(this, n, null);
+  List<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<int> skipWhile(bool test(int value)) {
-    return new SkipWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   int firstMatching(bool test(int value), { int orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   int lastMatching(bool test(int value), {int orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   int singleMatching(bool test(int value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   int elementAt(int index) {
@@ -13046,16 +12899,36 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) => Collections.min(this, compare);
+  int min([int compare(int a, int b)]) => IterableMixinWorkaround.min(this, compare);
 
-  int max([int compare(int a, int b)]) => Collections.max(this, compare);
+  int max([int compare(int a, int b)]) => IterableMixinWorkaround.max(this, compare);
 
   int removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
@@ -13075,11 +12948,11 @@
 
   // -- end List<int> mixins.
 
-  /// @domName Int32Array.setElements; @docsEditable true
   @JSName('set')
+  @DocsEditable @DomName('Int32Array.set')
   void setElements(Object array, [int offset]) native;
 
-  /// @domName Int32Array.subarray; @docsEditable true
+  @DocsEditable @DomName('Int32Array.subarray')
   Int32Array subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13087,7 +12960,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Int8Array; @docsEditable true
+
+@DocsEditable
+@DomName('Int8Array')
 class Int8Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Int8Array" {
 
   factory Int8Array(int length) =>
@@ -13096,12 +12971,12 @@
   factory Int8Array.fromList(List<int> list) =>
     _TypedArrayFactoryProvider.createInt8Array_fromList(list);
 
-  factory Int8Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) =>
+  factory Int8Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createInt8Array_fromBuffer(buffer, byteOffset, length);
 
   static const int BYTES_PER_ELEMENT = 1;
 
-  /// @domName Int8Array.length; @docsEditable true
+  @DocsEditable @DomName('Int8Array.length')
   int get length => JS("int", "#.length", this);
 
   int operator[](int index) => JS("int", "#[#]", this, index);
@@ -13119,50 +12994,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(int element) => Collections.contains(this, element);
+  bool contains(int element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(int element)) => Collections.forEach(this, f);
+  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(int element)) => new MappedList<int, dynamic>(this, f);
+  List mappedBy(f(int element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<int> where(bool f(int element)) => new WhereIterable<int>(this, f);
+  Iterable<int> where(bool f(int element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(int element)) => Collections.every(this, f);
+  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(int element)) => Collections.any(this, f);
+  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);
 
   List<int> toList() => new List<int>.from(this);
   Set<int> toSet() => new Set<int>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<int> take(int n) => new ListView<int>(this, 0, n);
+  List<int> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<int> takeWhile(bool test(int value)) {
-    return new TakeWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<int> skip(int n) => new ListView<int>(this, n, null);
+  List<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<int> skipWhile(bool test(int value)) {
-    return new SkipWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   int firstMatching(bool test(int value), { int orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   int lastMatching(bool test(int value), {int orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   int singleMatching(bool test(int value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   int elementAt(int index) {
@@ -13220,16 +13095,36 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) => Collections.min(this, compare);
+  int min([int compare(int a, int b)]) => IterableMixinWorkaround.min(this, compare);
 
-  int max([int compare(int a, int b)]) => Collections.max(this, compare);
+  int max([int compare(int a, int b)]) => IterableMixinWorkaround.max(this, compare);
 
   int removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
@@ -13249,11 +13144,11 @@
 
   // -- end List<int> mixins.
 
-  /// @domName Int8Array.setElements; @docsEditable true
   @JSName('set')
+  @DocsEditable @DomName('Int8Array.set')
   void setElements(Object array, [int offset]) native;
 
-  /// @domName Int8Array.subarray; @docsEditable true
+  @DocsEditable @DomName('Int8Array.subarray')
   Int8Array subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13261,7 +13156,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName JavaScriptCallFrame; @docsEditable true
+
+@DocsEditable
+@DomName('JavaScriptCallFrame')
 class JavaScriptCallFrame native "*JavaScriptCallFrame" {
 
   static const int CATCH_SCOPE = 4;
@@ -13274,37 +13171,37 @@
 
   static const int WITH_SCOPE = 2;
 
-  /// @domName JavaScriptCallFrame.caller; @docsEditable true
+  @DocsEditable @DomName('JavaScriptCallFrame.caller')
   final JavaScriptCallFrame caller;
 
-  /// @domName JavaScriptCallFrame.column; @docsEditable true
+  @DocsEditable @DomName('JavaScriptCallFrame.column')
   final int column;
 
-  /// @domName JavaScriptCallFrame.functionName; @docsEditable true
+  @DocsEditable @DomName('JavaScriptCallFrame.functionName')
   final String functionName;
 
-  /// @domName JavaScriptCallFrame.line; @docsEditable true
+  @DocsEditable @DomName('JavaScriptCallFrame.line')
   final int line;
 
-  /// @domName JavaScriptCallFrame.scopeChain; @docsEditable true
+  @DocsEditable @DomName('JavaScriptCallFrame.scopeChain')
   final List scopeChain;
 
-  /// @domName JavaScriptCallFrame.sourceID; @docsEditable true
+  @DocsEditable @DomName('JavaScriptCallFrame.sourceID')
   final int sourceID;
 
-  /// @domName JavaScriptCallFrame.thisObject; @docsEditable true
+  @DocsEditable @DomName('JavaScriptCallFrame.thisObject')
   final Object thisObject;
 
-  /// @domName JavaScriptCallFrame.type; @docsEditable true
+  @DocsEditable @DomName('JavaScriptCallFrame.type')
   final String type;
 
-  /// @domName JavaScriptCallFrame.evaluate; @docsEditable true
+  @DocsEditable @DomName('JavaScriptCallFrame.evaluate')
   void evaluate(String script) native;
 
-  /// @domName JavaScriptCallFrame.restart; @docsEditable true
+  @DocsEditable @DomName('JavaScriptCallFrame.restart')
   Object restart() native;
 
-  /// @domName JavaScriptCallFrame.scopeType; @docsEditable true
+  @DocsEditable @DomName('JavaScriptCallFrame.scopeType')
   int scopeType(int scopeIndex) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13312,7 +13209,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName KeyboardEvent; @docsEditable true
+@DomName('KeyboardEvent')
 class KeyboardEvent extends UIEvent native "*KeyboardEvent" {
 
   factory KeyboardEvent(String type, Window view,
@@ -13326,7 +13223,7 @@
     return e;
   }
 
-  /** @domName KeyboardEvent.initKeyboardEvent */
+  @DomName('KeyboardEvent.initKeyboardEvent')
   void $dom_initKeyboardEvent(String type, bool canBubble, bool cancelable,
       Window view, String keyIdentifier, int keyLocation, bool ctrlKey,
       bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) {
@@ -13346,32 +13243,32 @@
     }
   }
 
-  /** @domName KeyboardEvent.keyCode */
+  @DomName('KeyboardEvent.keyCode')
   int get keyCode => $dom_keyCode;
 
-  /** @domName KeyboardEvent.charCode */
+  @DomName('KeyboardEvent.charCode')
   int get charCode => $dom_charCode;
 
-  /// @domName KeyboardEvent.altGraphKey; @docsEditable true
+  @DocsEditable @DomName('KeyboardEvent.altGraphKey')
   final bool altGraphKey;
 
-  /// @domName KeyboardEvent.altKey; @docsEditable true
+  @DocsEditable @DomName('KeyboardEvent.altKey')
   final bool altKey;
 
-  /// @domName KeyboardEvent.ctrlKey; @docsEditable true
+  @DocsEditable @DomName('KeyboardEvent.ctrlKey')
   final bool ctrlKey;
 
-  /// @domName KeyboardEvent.keyIdentifier; @docsEditable true
   @JSName('keyIdentifier')
+  @DocsEditable @DomName('KeyboardEvent.keyIdentifier')
   final String $dom_keyIdentifier;
 
-  /// @domName KeyboardEvent.keyLocation; @docsEditable true
+  @DocsEditable @DomName('KeyboardEvent.keyLocation')
   final int keyLocation;
 
-  /// @domName KeyboardEvent.metaKey; @docsEditable true
+  @DocsEditable @DomName('KeyboardEvent.metaKey')
   final bool metaKey;
 
-  /// @domName KeyboardEvent.shiftKey; @docsEditable true
+  @DocsEditable @DomName('KeyboardEvent.shiftKey')
   final bool shiftKey;
 
 }
@@ -13380,56 +13277,58 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLKeygenElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLKeygenElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental()
 class KeygenElement extends Element native "*HTMLKeygenElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory KeygenElement() => document.$dom_createElement("keygen");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('keygen') && (new Element.tag('keygen') is KeygenElement);
 
-  /// @domName HTMLKeygenElement.autofocus; @docsEditable true
+  @DocsEditable @DomName('HTMLKeygenElement.autofocus')
   bool autofocus;
 
-  /// @domName HTMLKeygenElement.challenge; @docsEditable true
+  @DocsEditable @DomName('HTMLKeygenElement.challenge')
   String challenge;
 
-  /// @domName HTMLKeygenElement.disabled; @docsEditable true
+  @DocsEditable @DomName('HTMLKeygenElement.disabled')
   bool disabled;
 
-  /// @domName HTMLKeygenElement.form; @docsEditable true
+  @DocsEditable @DomName('HTMLKeygenElement.form')
   final FormElement form;
 
-  /// @domName HTMLKeygenElement.keytype; @docsEditable true
+  @DocsEditable @DomName('HTMLKeygenElement.keytype')
   String keytype;
 
-  /// @domName HTMLKeygenElement.labels; @docsEditable true
+  @DocsEditable @DomName('HTMLKeygenElement.labels')
   @Returns('NodeList') @Creates('NodeList')
   final List<Node> labels;
 
-  /// @domName HTMLKeygenElement.name; @docsEditable true
+  @DocsEditable @DomName('HTMLKeygenElement.name')
   String name;
 
-  /// @domName HTMLKeygenElement.type; @docsEditable true
+  @DocsEditable @DomName('HTMLKeygenElement.type')
   final String type;
 
-  /// @domName HTMLKeygenElement.validationMessage; @docsEditable true
+  @DocsEditable @DomName('HTMLKeygenElement.validationMessage')
   final String validationMessage;
 
-  /// @domName HTMLKeygenElement.validity; @docsEditable true
+  @DocsEditable @DomName('HTMLKeygenElement.validity')
   final ValidityState validity;
 
-  /// @domName HTMLKeygenElement.willValidate; @docsEditable true
+  @DocsEditable @DomName('HTMLKeygenElement.willValidate')
   final bool willValidate;
 
-  /// @domName HTMLKeygenElement.checkValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLKeygenElement.checkValidity')
   bool checkValidity() native;
 
-  /// @domName HTMLKeygenElement.setCustomValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLKeygenElement.setCustomValidity')
   void setCustomValidity(String error) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13437,16 +13336,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLLIElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLLIElement')
 class LIElement extends Element native "*HTMLLIElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory LIElement() => document.$dom_createElement("li");
 
-  /// @domName HTMLLIElement.type; @docsEditable true
+  @DocsEditable @DomName('HTMLLIElement.type')
   String type;
 
-  /// @domName HTMLLIElement.value; @docsEditable true
+  @DocsEditable @DomName('HTMLLIElement.value')
   int value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13454,19 +13355,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLLabelElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLLabelElement')
 class LabelElement extends Element native "*HTMLLabelElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory LabelElement() => document.$dom_createElement("label");
 
-  /// @domName HTMLLabelElement.control; @docsEditable true
+  @DocsEditable @DomName('HTMLLabelElement.control')
   final Element control;
 
-  /// @domName HTMLLabelElement.form; @docsEditable true
+  @DocsEditable @DomName('HTMLLabelElement.form')
   final FormElement form;
 
-  /// @domName HTMLLabelElement.htmlFor; @docsEditable true
+  @DocsEditable @DomName('HTMLLabelElement.htmlFor')
   String htmlFor;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13474,16 +13377,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLLegendElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLLegendElement')
 class LegendElement extends Element native "*HTMLLegendElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory LegendElement() => document.$dom_createElement("legend");
 
-  /// @domName HTMLLegendElement.align; @docsEditable true
-  String align;
-
-  /// @domName HTMLLegendElement.form; @docsEditable true
+  @DocsEditable @DomName('HTMLLegendElement.form')
   final FormElement form;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13491,34 +13393,36 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLLinkElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLLinkElement')
 class LinkElement extends Element native "*HTMLLinkElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory LinkElement() => document.$dom_createElement("link");
 
-  /// @domName HTMLLinkElement.disabled; @docsEditable true
+  @DocsEditable @DomName('HTMLLinkElement.disabled')
   bool disabled;
 
-  /// @domName HTMLLinkElement.href; @docsEditable true
+  @DocsEditable @DomName('HTMLLinkElement.href')
   String href;
 
-  /// @domName HTMLLinkElement.hreflang; @docsEditable true
+  @DocsEditable @DomName('HTMLLinkElement.hreflang')
   String hreflang;
 
-  /// @domName HTMLLinkElement.media; @docsEditable true
+  @DocsEditable @DomName('HTMLLinkElement.media')
   String media;
 
-  /// @domName HTMLLinkElement.rel; @docsEditable true
+  @DocsEditable @DomName('HTMLLinkElement.rel')
   String rel;
 
-  /// @domName HTMLLinkElement.sheet; @docsEditable true
+  @DocsEditable @DomName('HTMLLinkElement.sheet')
   final StyleSheet sheet;
 
-  /// @domName HTMLLinkElement.sizes; @docsEditable true
+  @DocsEditable @DomName('HTMLLinkElement.sizes')
   DomSettableTokenList sizes;
 
-  /// @domName HTMLLinkElement.type; @docsEditable true
+  @DocsEditable @DomName('HTMLLinkElement.type')
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13526,10 +13430,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName LocalMediaStream; @docsEditable true
+
+@DocsEditable
+@DomName('LocalMediaStream')
 class LocalMediaStream extends MediaStream implements EventTarget native "*LocalMediaStream" {
 
-  /// @domName LocalMediaStream.stop; @docsEditable true
+  @DocsEditable @DomName('LocalMediaStream.stop')
   void stop() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13537,50 +13443,52 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Location; @docsEditable true
+
+@DocsEditable
+@DomName('Location')
 class Location implements LocationBase native "*Location" {
 
-  /// @domName Location.ancestorOrigins; @docsEditable true
+  @DocsEditable @DomName('Location.ancestorOrigins')
   @Returns('DomStringList') @Creates('DomStringList')
   final List<String> ancestorOrigins;
 
-  /// @domName Location.hash; @docsEditable true
+  @DocsEditable @DomName('Location.hash')
   String hash;
 
-  /// @domName Location.host; @docsEditable true
+  @DocsEditable @DomName('Location.host')
   String host;
 
-  /// @domName Location.hostname; @docsEditable true
+  @DocsEditable @DomName('Location.hostname')
   String hostname;
 
-  /// @domName Location.href; @docsEditable true
+  @DocsEditable @DomName('Location.href')
   String href;
 
-  /// @domName Location.origin; @docsEditable true
+  @DocsEditable @DomName('Location.origin')
   final String origin;
 
-  /// @domName Location.pathname; @docsEditable true
+  @DocsEditable @DomName('Location.pathname')
   String pathname;
 
-  /// @domName Location.port; @docsEditable true
+  @DocsEditable @DomName('Location.port')
   String port;
 
-  /// @domName Location.protocol; @docsEditable true
+  @DocsEditable @DomName('Location.protocol')
   String protocol;
 
-  /// @domName Location.search; @docsEditable true
+  @DocsEditable @DomName('Location.search')
   String search;
 
-  /// @domName Location.assign; @docsEditable true
+  @DocsEditable @DomName('Location.assign')
   void assign(String url) native;
 
-  /// @domName Location.reload; @docsEditable true
+  @DocsEditable @DomName('Location.reload')
   void reload() native;
 
-  /// @domName Location.replace; @docsEditable true
+  @DocsEditable @DomName('Location.replace')
   void replace(String url) native;
 
-  /// @domName Location.toString; @docsEditable true
+  @DocsEditable @DomName('Location.toString')
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13588,16 +13496,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLMapElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLMapElement')
 class MapElement extends Element native "*HTMLMapElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory MapElement() => document.$dom_createElement("map");
 
-  /// @domName HTMLMapElement.areas; @docsEditable true
+  @DocsEditable @DomName('HTMLMapElement.areas')
   final HtmlCollection areas;
 
-  /// @domName HTMLMapElement.name; @docsEditable true
+  @DocsEditable @DomName('HTMLMapElement.name')
   String name;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13605,115 +13515,67 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLMarqueeElement; @docsEditable true
-class MarqueeElement extends Element native "*HTMLMarqueeElement" {
 
-  /// Checks if this type is supported on the current platform.
-  static bool get supported => Element.isTagSupported('marquee')&& (new Element.tag('marquee') is MarqueeElement);
-
-  /// @domName HTMLMarqueeElement.behavior; @docsEditable true
-  String behavior;
-
-  /// @domName HTMLMarqueeElement.bgColor; @docsEditable true
-  String bgColor;
-
-  /// @domName HTMLMarqueeElement.direction; @docsEditable true
-  String direction;
-
-  /// @domName HTMLMarqueeElement.height; @docsEditable true
-  String height;
-
-  /// @domName HTMLMarqueeElement.hspace; @docsEditable true
-  int hspace;
-
-  /// @domName HTMLMarqueeElement.loop; @docsEditable true
-  int loop;
-
-  /// @domName HTMLMarqueeElement.scrollAmount; @docsEditable true
-  int scrollAmount;
-
-  /// @domName HTMLMarqueeElement.scrollDelay; @docsEditable true
-  int scrollDelay;
-
-  /// @domName HTMLMarqueeElement.trueSpeed; @docsEditable true
-  bool trueSpeed;
-
-  /// @domName HTMLMarqueeElement.vspace; @docsEditable true
-  int vspace;
-
-  /// @domName HTMLMarqueeElement.width; @docsEditable true
-  String width;
-
-  /// @domName HTMLMarqueeElement.start; @docsEditable true
-  void start() native;
-
-  /// @domName HTMLMarqueeElement.stop; @docsEditable true
-  void stop() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName MediaController; @docsEditable true
+@DocsEditable
+@DomName('MediaController')
 class MediaController extends EventTarget native "*MediaController" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory MediaController() => MediaController._create();
   static MediaController _create() => JS('MediaController', 'new MediaController()');
 
-  /// @domName MediaController.buffered; @docsEditable true
+  @DocsEditable @DomName('MediaController.buffered')
   final TimeRanges buffered;
 
-  /// @domName MediaController.currentTime; @docsEditable true
+  @DocsEditable @DomName('MediaController.currentTime')
   num currentTime;
 
-  /// @domName MediaController.defaultPlaybackRate; @docsEditable true
+  @DocsEditable @DomName('MediaController.defaultPlaybackRate')
   num defaultPlaybackRate;
 
-  /// @domName MediaController.duration; @docsEditable true
+  @DocsEditable @DomName('MediaController.duration')
   final num duration;
 
-  /// @domName MediaController.muted; @docsEditable true
+  @DocsEditable @DomName('MediaController.muted')
   bool muted;
 
-  /// @domName MediaController.paused; @docsEditable true
+  @DocsEditable @DomName('MediaController.paused')
   final bool paused;
 
-  /// @domName MediaController.playbackRate; @docsEditable true
+  @DocsEditable @DomName('MediaController.playbackRate')
   num playbackRate;
 
-  /// @domName MediaController.playbackState; @docsEditable true
+  @DocsEditable @DomName('MediaController.playbackState')
   final String playbackState;
 
-  /// @domName MediaController.played; @docsEditable true
+  @DocsEditable @DomName('MediaController.played')
   final TimeRanges played;
 
-  /// @domName MediaController.seekable; @docsEditable true
+  @DocsEditable @DomName('MediaController.seekable')
   final TimeRanges seekable;
 
-  /// @domName MediaController.volume; @docsEditable true
+  @DocsEditable @DomName('MediaController.volume')
   num volume;
 
-  /// @domName MediaController.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('MediaController.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName MediaController.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('MediaController.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName MediaController.pause; @docsEditable true
+  @DocsEditable @DomName('MediaController.pause')
   void pause() native;
 
-  /// @domName MediaController.play; @docsEditable true
+  @DocsEditable @DomName('MediaController.play')
   void play() native;
 
-  /// @domName MediaController.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('MediaController.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName MediaController.unpause; @docsEditable true
+  @DocsEditable @DomName('MediaController.unpause')
   void unpause() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13721,7 +13583,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLMediaElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLMediaElement')
 class MediaElement extends Element native "*HTMLMediaElement" {
 
   static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');
@@ -13774,7 +13638,8 @@
 
   static const EventStreamProvider<MediaKeyEvent> needKeyEvent = const EventStreamProvider<MediaKeyEvent>('webkitneedkey');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   MediaElementEvents get on =>
     new MediaElementEvents(this);
 
@@ -13796,124 +13661,124 @@
 
   static const int NETWORK_NO_SOURCE = 3;
 
-  /// @domName HTMLMediaElement.autoplay; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.autoplay')
   bool autoplay;
 
-  /// @domName HTMLMediaElement.buffered; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.buffered')
   final TimeRanges buffered;
 
-  /// @domName HTMLMediaElement.controller; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.controller')
   MediaController controller;
 
-  /// @domName HTMLMediaElement.controls; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.controls')
   bool controls;
 
-  /// @domName HTMLMediaElement.currentSrc; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.currentSrc')
   final String currentSrc;
 
-  /// @domName HTMLMediaElement.currentTime; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.currentTime')
   num currentTime;
 
-  /// @domName HTMLMediaElement.defaultMuted; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.defaultMuted')
   bool defaultMuted;
 
-  /// @domName HTMLMediaElement.defaultPlaybackRate; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.defaultPlaybackRate')
   num defaultPlaybackRate;
 
-  /// @domName HTMLMediaElement.duration; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.duration')
   final num duration;
 
-  /// @domName HTMLMediaElement.ended; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.ended')
   final bool ended;
 
-  /// @domName HTMLMediaElement.error; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.error')
   final MediaError error;
 
-  /// @domName HTMLMediaElement.initialTime; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.initialTime')
   final num initialTime;
 
-  /// @domName HTMLMediaElement.loop; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.loop')
   bool loop;
 
-  /// @domName HTMLMediaElement.mediaGroup; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.mediaGroup')
   String mediaGroup;
 
-  /// @domName HTMLMediaElement.muted; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.muted')
   bool muted;
 
-  /// @domName HTMLMediaElement.networkState; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.networkState')
   final int networkState;
 
-  /// @domName HTMLMediaElement.paused; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.paused')
   final bool paused;
 
-  /// @domName HTMLMediaElement.playbackRate; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.playbackRate')
   num playbackRate;
 
-  /// @domName HTMLMediaElement.played; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.played')
   final TimeRanges played;
 
-  /// @domName HTMLMediaElement.preload; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.preload')
   String preload;
 
-  /// @domName HTMLMediaElement.readyState; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.readyState')
   final int readyState;
 
-  /// @domName HTMLMediaElement.seekable; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.seekable')
   final TimeRanges seekable;
 
-  /// @domName HTMLMediaElement.seeking; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.seeking')
   final bool seeking;
 
-  /// @domName HTMLMediaElement.src; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.src')
   String src;
 
-  /// @domName HTMLMediaElement.startTime; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.startTime')
   final num startTime;
 
-  /// @domName HTMLMediaElement.textTracks; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.textTracks')
   final TextTrackList textTracks;
 
-  /// @domName HTMLMediaElement.volume; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.volume')
   num volume;
 
-  /// @domName HTMLMediaElement.webkitAudioDecodedByteCount; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.webkitAudioDecodedByteCount')
   final int webkitAudioDecodedByteCount;
 
-  /// @domName HTMLMediaElement.webkitClosedCaptionsVisible; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.webkitClosedCaptionsVisible')
   bool webkitClosedCaptionsVisible;
 
-  /// @domName HTMLMediaElement.webkitHasClosedCaptions; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.webkitHasClosedCaptions')
   final bool webkitHasClosedCaptions;
 
-  /// @domName HTMLMediaElement.webkitPreservesPitch; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.webkitPreservesPitch')
   bool webkitPreservesPitch;
 
-  /// @domName HTMLMediaElement.webkitVideoDecodedByteCount; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.webkitVideoDecodedByteCount')
   final int webkitVideoDecodedByteCount;
 
-  /// @domName HTMLMediaElement.addTextTrack; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.addTextTrack')
   TextTrack addTextTrack(String kind, [String label, String language]) native;
 
-  /// @domName HTMLMediaElement.canPlayType; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.canPlayType')
   String canPlayType(String type, String keySystem) native;
 
-  /// @domName HTMLMediaElement.load; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.load')
   void load() native;
 
-  /// @domName HTMLMediaElement.pause; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.pause')
   void pause() native;
 
-  /// @domName HTMLMediaElement.play; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.play')
   void play() native;
 
-  /// @domName HTMLMediaElement.webkitAddKey; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.webkitAddKey')
   void webkitAddKey(String keySystem, Uint8Array key, [Uint8Array initData, String sessionId]) native;
 
-  /// @domName HTMLMediaElement.webkitCancelKeyRequest; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.webkitCancelKeyRequest')
   void webkitCancelKeyRequest(String keySystem, String sessionId) native;
 
-  /// @domName HTMLMediaElement.webkitGenerateKeyRequest; @docsEditable true
+  @DocsEditable @DomName('HTMLMediaElement.webkitGenerateKeyRequest')
   void webkitGenerateKeyRequest(String keySystem, [Uint8Array initData]) native;
 
   Stream<Event> get onCanPlay => canPlayEvent.forTarget(this);
@@ -13967,84 +13832,84 @@
   Stream<MediaKeyEvent> get onNeedKey => needKeyEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class MediaElementEvents extends ElementEvents {
-  /// @docsEditable true
+  @DocsEditable
   MediaElementEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get canPlay => this['canplay'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get canPlayThrough => this['canplaythrough'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get durationChange => this['durationchange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get emptied => this['emptied'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get ended => this['ended'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadedData => this['loadeddata'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadedMetadata => this['loadedmetadata'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadStart => this['loadstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get pause => this['pause'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get play => this['play'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get playing => this['playing'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get progress => this['progress'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get rateChange => this['ratechange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get seeked => this['seeked'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get seeking => this['seeking'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get show => this['show'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get stalled => this['stalled'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get suspend => this['suspend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get timeUpdate => this['timeupdate'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get volumeChange => this['volumechange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get waiting => this['waiting'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyAdded => this['webkitkeyadded'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyError => this['webkitkeyerror'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyMessage => this['webkitkeymessage'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get needKey => this['webkitneedkey'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14052,7 +13917,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaError; @docsEditable true
+
+@DocsEditable
+@DomName('MediaError')
 class MediaError native "*MediaError" {
 
   static const int MEDIA_ERR_ABORTED = 1;
@@ -14065,7 +13932,7 @@
 
   static const int MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
 
-  /// @domName MediaError.code; @docsEditable true
+  @DocsEditable @DomName('MediaError.code')
   final int code;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14073,7 +13940,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaKeyError; @docsEditable true
+
+@DocsEditable
+@DomName('MediaKeyError')
 class MediaKeyError native "*MediaKeyError" {
 
   static const int MEDIA_KEYERR_CLIENT = 2;
@@ -14088,7 +13957,7 @@
 
   static const int MEDIA_KEYERR_UNKNOWN = 1;
 
-  /// @domName MediaKeyError.code; @docsEditable true
+  @DocsEditable @DomName('MediaKeyError.code')
   final int code;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14096,29 +13965,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaKeyEvent; @docsEditable true
+
+@DocsEditable
+@DomName('MediaKeyEvent')
 class MediaKeyEvent extends Event native "*MediaKeyEvent" {
 
-  /// @domName MediaKeyEvent.defaultURL; @docsEditable true
   @JSName('defaultURL')
+  @DocsEditable @DomName('MediaKeyEvent.defaultURL')
   final String defaultUrl;
 
-  /// @domName MediaKeyEvent.errorCode; @docsEditable true
+  @DocsEditable @DomName('MediaKeyEvent.errorCode')
   final MediaKeyError errorCode;
 
-  /// @domName MediaKeyEvent.initData; @docsEditable true
+  @DocsEditable @DomName('MediaKeyEvent.initData')
   final Uint8Array initData;
 
-  /// @domName MediaKeyEvent.keySystem; @docsEditable true
+  @DocsEditable @DomName('MediaKeyEvent.keySystem')
   final String keySystem;
 
-  /// @domName MediaKeyEvent.message; @docsEditable true
+  @DocsEditable @DomName('MediaKeyEvent.message')
   final Uint8Array message;
 
-  /// @domName MediaKeyEvent.sessionId; @docsEditable true
+  @DocsEditable @DomName('MediaKeyEvent.sessionId')
   final String sessionId;
 
-  /// @domName MediaKeyEvent.systemCode; @docsEditable true
+  @DocsEditable @DomName('MediaKeyEvent.systemCode')
   final int systemCode;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14126,22 +13997,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaList; @docsEditable true
+
+@DocsEditable
+@DomName('MediaList')
 class MediaList native "*MediaList" {
 
-  /// @domName MediaList.length; @docsEditable true
+  @DocsEditable @DomName('MediaList.length')
   final int length;
 
-  /// @domName MediaList.mediaText; @docsEditable true
+  @DocsEditable @DomName('MediaList.mediaText')
   String mediaText;
 
-  /// @domName MediaList.appendMedium; @docsEditable true
+  @DocsEditable @DomName('MediaList.appendMedium')
   void appendMedium(String newMedium) native;
 
-  /// @domName MediaList.deleteMedium; @docsEditable true
+  @DocsEditable @DomName('MediaList.deleteMedium')
   void deleteMedium(String oldMedium) native;
 
-  /// @domName MediaList.item; @docsEditable true
+  @DocsEditable @DomName('MediaList.item')
   String item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14149,19 +14022,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaQueryList; @docsEditable true
+
+@DocsEditable
+@DomName('MediaQueryList')
 class MediaQueryList native "*MediaQueryList" {
 
-  /// @domName MediaQueryList.matches; @docsEditable true
+  @DocsEditable @DomName('MediaQueryList.matches')
   final bool matches;
 
-  /// @domName MediaQueryList.media; @docsEditable true
+  @DocsEditable @DomName('MediaQueryList.media')
   final String media;
 
-  /// @domName MediaQueryList.addListener; @docsEditable true
+  @DocsEditable @DomName('MediaQueryList.addListener')
   void addListener(MediaQueryListListener listener) native;
 
-  /// @domName MediaQueryList.removeListener; @docsEditable true
+  @DocsEditable @DomName('MediaQueryList.removeListener')
   void removeListener(MediaQueryListListener listener) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14169,10 +14044,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaQueryListListener
+@DocsEditable
+@DomName('MediaQueryListListener')
 abstract class MediaQueryListListener {
 
-  /// @domName MediaQueryListListener.queryChanged; @docsEditable true
   void queryChanged(MediaQueryList list);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14180,112 +14055,149 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaSource; @docsEditable true
+
+@DocsEditable
+@DomName('MediaSource')
 class MediaSource extends EventTarget native "*MediaSource" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory MediaSource() => MediaSource._create();
   static MediaSource _create() => JS('MediaSource', 'new MediaSource()');
 
-  /// @domName MediaSource.activeSourceBuffers; @docsEditable true
+  @DocsEditable @DomName('MediaSource.activeSourceBuffers')
   final SourceBufferList activeSourceBuffers;
 
-  /// @domName MediaSource.duration; @docsEditable true
+  @DocsEditable @DomName('MediaSource.duration')
   num duration;
 
-  /// @domName MediaSource.readyState; @docsEditable true
+  @DocsEditable @DomName('MediaSource.readyState')
   final String readyState;
 
-  /// @domName MediaSource.sourceBuffers; @docsEditable true
+  @DocsEditable @DomName('MediaSource.sourceBuffers')
   final SourceBufferList sourceBuffers;
 
-  /// @domName MediaSource.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('MediaSource.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName MediaSource.addSourceBuffer; @docsEditable true
+  @DocsEditable @DomName('MediaSource.addSourceBuffer')
   SourceBuffer addSourceBuffer(String type) native;
 
-  /// @domName MediaSource.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('MediaSource.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native;
 
-  /// @domName MediaSource.endOfStream; @docsEditable true
+  @DocsEditable @DomName('MediaSource.endOfStream')
   void endOfStream(String error) native;
 
-  /// @domName MediaSource.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('MediaSource.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName MediaSource.removeSourceBuffer; @docsEditable true
+  @DocsEditable @DomName('MediaSource.removeSourceBuffer')
   void removeSourceBuffer(SourceBuffer buffer) native;
 }
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
 /// @domName MediaStream; @docsEditable true
+@DocsEditable
+@DomName('MediaStream')
 class MediaStream extends EventTarget native "*MediaStream" {
 
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
-  ///@docsEditable true
-  factory MediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) => MediaStream._create(audioTracks, videoTracks);
-  static MediaStream _create(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) => JS('MediaStream', 'new MediaStream(#,#)', audioTracks, videoTracks);
+  @DocsEditable
+  factory MediaStream() => MediaStream._create();
+  static MediaStream _create() => JS('MediaStream', 'new MediaStream()');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   MediaStreamEvents get on =>
     new MediaStreamEvents(this);
 
-  static const int ENDED = 2;
+  @DocsEditable @DomName('MediaStream.ended')
+  final bool ended;
 
-  static const int LIVE = 1;
+  @DocsEditable @DomName('MediaStream.id')
+  final String id;
 
-  /// @domName MediaStream.audioTracks; @docsEditable true
-  final MediaStreamTrackList audioTracks;
-
-  /// @domName MediaStream.label; @docsEditable true
+  @DocsEditable @DomName('MediaStream.label')
   final String label;
 
-  /// @domName MediaStream.readyState; @docsEditable true
-  final int readyState;
-
-  /// @domName MediaStream.videoTracks; @docsEditable true
-  final MediaStreamTrackList videoTracks;
-
-  /// @domName MediaStream.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('MediaStream.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName MediaStream.dispatchEvent; @docsEditable true
+  @DocsEditable @DomName('MediaStream.addTrack')
+  void addTrack(MediaStreamTrack track) native;
+
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('MediaStream.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native;
 
-  /// @domName MediaStream.removeEventListener; @docsEditable true
+  @DocsEditable @DomName('MediaStream.getAudioTracks')
+  List<MediaStreamTrack> getAudioTracks() native;
+
+  @DocsEditable @DomName('MediaStream.getTrackById')
+  MediaStreamTrack getTrackById(String trackId) native;
+
+  @DocsEditable @DomName('MediaStream.getVideoTracks')
+  List<MediaStreamTrack> getVideoTracks() native;
+
   @JSName('removeEventListener')
+  @DocsEditable @DomName('MediaStream.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
+  @DocsEditable @DomName('MediaStream.removeTrack')
+  void removeTrack(MediaStreamTrack track) native;
+
   Stream<Event> get onEnded => endedEvent.forTarget(this);
+
+
+  /**
+   * Checks if the MediaStream APIs are supported on the current platform.
+   *
+   * See also:
+   *
+   * * [Navigator.getUserMedia]
+   */
+  static bool get supported =>
+    JS('bool', '''!!(#.getUserMedia || #.webkitGetUserMedia ||
+        #.mozGetUserMedia || #.msGetUserMedia)''',
+        window.navigator,
+        window.navigator,
+        window.navigator,
+        window.navigator);
 }
 
-/// @docsEditable true
+@DocsEditable
 class MediaStreamEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   MediaStreamEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
+  EventListenerList get addTrack => this['addtrack'];
+
+  @DocsEditable
   EventListenerList get ended => this['ended'];
+
+  @DocsEditable
+  EventListenerList get removeTrack => this['removetrack'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaStreamEvent; @docsEditable true
+
+@DocsEditable
+@DomName('MediaStreamEvent')
 class MediaStreamEvent extends Event native "*MediaStreamEvent" {
 
-  /// @domName MediaStreamEvent.stream; @docsEditable true
+  @DocsEditable @DomName('MediaStreamEvent.stream')
   final MediaStream stream;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14293,7 +14205,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaStreamTrack; @docsEditable true
+
+@DocsEditable
+@DomName('MediaStreamTrack')
 class MediaStreamTrack extends EventTarget native "*MediaStreamTrack" {
 
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
@@ -14302,7 +14216,8 @@
 
   static const EventStreamProvider<Event> unmuteEvent = const EventStreamProvider<Event>('unmute');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   MediaStreamTrackEvents get on =>
     new MediaStreamTrackEvents(this);
 
@@ -14312,28 +14227,31 @@
 
   static const int MUTED = 1;
 
-  /// @domName MediaStreamTrack.enabled; @docsEditable true
+  @DocsEditable @DomName('MediaStreamTrack.enabled')
   bool enabled;
 
-  /// @domName MediaStreamTrack.kind; @docsEditable true
+  @DocsEditable @DomName('MediaStreamTrack.id')
+  final String id;
+
+  @DocsEditable @DomName('MediaStreamTrack.kind')
   final String kind;
 
-  /// @domName MediaStreamTrack.label; @docsEditable true
+  @DocsEditable @DomName('MediaStreamTrack.label')
   final String label;
 
-  /// @domName MediaStreamTrack.readyState; @docsEditable true
+  @DocsEditable @DomName('MediaStreamTrack.readyState')
   final int readyState;
 
-  /// @domName MediaStreamTrack.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('MediaStreamTrack.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName MediaStreamTrack.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('MediaStreamTrack.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native;
 
-  /// @domName MediaStreamTrack.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('MediaStreamTrack.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   Stream<Event> get onEnded => endedEvent.forTarget(this);
@@ -14343,18 +14261,18 @@
   Stream<Event> get onUnmute => unmuteEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class MediaStreamTrackEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   MediaStreamTrackEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get ended => this['ended'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mute => this['mute'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get unmute => this['unmute'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14362,10 +14280,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaStreamTrackEvent; @docsEditable true
+
+@DocsEditable
+@DomName('MediaStreamTrackEvent')
 class MediaStreamTrackEvent extends Event native "*MediaStreamTrackEvent" {
 
-  /// @domName MediaStreamTrackEvent.track; @docsEditable true
+  @DocsEditable @DomName('MediaStreamTrackEvent.track')
   final MediaStreamTrack track;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14373,72 +14293,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaStreamTrackList; @docsEditable true
-class MediaStreamTrackList extends EventTarget native "*MediaStreamTrackList" {
 
-  static const EventStreamProvider<MediaStreamTrackEvent> addTrackEvent = const EventStreamProvider<MediaStreamTrackEvent>('addtrack');
-
-  static const EventStreamProvider<MediaStreamTrackEvent> removeTrackEvent = const EventStreamProvider<MediaStreamTrackEvent>('removetrack');
-
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
-  MediaStreamTrackListEvents get on =>
-    new MediaStreamTrackListEvents(this);
-
-  /// @domName MediaStreamTrackList.length; @docsEditable true
-  final int length;
-
-  /// @domName MediaStreamTrackList.add; @docsEditable true
-  void add(MediaStreamTrack track) native;
-
-  /// @domName MediaStreamTrackList.addEventListener; @docsEditable true
-  @JSName('addEventListener')
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
-  /// @domName MediaStreamTrackList.dispatchEvent; @docsEditable true
-  @JSName('dispatchEvent')
-  bool $dom_dispatchEvent(Event event) native;
-
-  /// @domName MediaStreamTrackList.item; @docsEditable true
-  MediaStreamTrack item(int index) native;
-
-  /// @domName MediaStreamTrackList.remove; @docsEditable true
-  void remove(MediaStreamTrack track) native;
-
-  /// @domName MediaStreamTrackList.removeEventListener; @docsEditable true
-  @JSName('removeEventListener')
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
-
-  Stream<MediaStreamTrackEvent> get onAddTrack => addTrackEvent.forTarget(this);
-
-  Stream<MediaStreamTrackEvent> get onRemoveTrack => removeTrackEvent.forTarget(this);
-}
-
-/// @docsEditable true
-class MediaStreamTrackListEvents extends Events {
-  /// @docsEditable true
-  MediaStreamTrackListEvents(EventTarget _ptr) : super(_ptr);
-
-  /// @docsEditable true
-  EventListenerList get addTrack => this['addtrack'];
-
-  /// @docsEditable true
-  EventListenerList get removeTrack => this['removetrack'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName MemoryInfo; @docsEditable true
+@DocsEditable
+@DomName('MemoryInfo')
 class MemoryInfo native "*MemoryInfo" {
 
-  /// @domName MemoryInfo.jsHeapSizeLimit; @docsEditable true
+  @DocsEditable @DomName('MemoryInfo.jsHeapSizeLimit')
   final int jsHeapSizeLimit;
 
-  /// @domName MemoryInfo.totalJSHeapSize; @docsEditable true
+  @DocsEditable @DomName('MemoryInfo.totalJSHeapSize')
   final int totalJSHeapSize;
 
-  /// @domName MemoryInfo.usedJSHeapSize; @docsEditable true
+  @DocsEditable @DomName('MemoryInfo.usedJSHeapSize')
   final int usedJSHeapSize;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14446,20 +14312,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/**
- * An HTML <menu> element.
- *
- * A <menu> element represents an unordered list of menu commands.
- *
- * See also:
- *
- *  * [Menu Element](https://developer.mozilla.org/en-US/docs/HTML/Element/menu) from MDN.
- *  * [Menu Element](http://www.w3.org/TR/html5/the-menu-element.html#the-menu-element) from the W3C.
- */
-/// @domName HTMLMenuElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLMenuElement')
 class MenuElement extends Element native "*HTMLMenuElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory MenuElement() => document.$dom_createElement("menu");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14467,17 +14325,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MessageChannel; @docsEditable true
+
+@DocsEditable
+@DomName('MessageChannel')
 class MessageChannel native "*MessageChannel" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory MessageChannel() => MessageChannel._create();
   static MessageChannel _create() => JS('MessageChannel', 'new MessageChannel()');
 
-  /// @domName MessageChannel.port1; @docsEditable true
+  @DocsEditable @DomName('MessageChannel.port1')
   final MessagePort port1;
 
-  /// @domName MessageChannel.port2; @docsEditable true
+  @DocsEditable @DomName('MessageChannel.port2')
   final MessagePort port2;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14485,35 +14345,34 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MessageEvent; @docsEditable true
+
+@DocsEditable
+@DomName('MessageEvent')
 class MessageEvent extends Event native "*MessageEvent" {
 
-  /// @domName MessageEvent.data; @docsEditable true
   dynamic get data => convertNativeToDart_SerializedScriptValue(this._data);
   @JSName('data')
-  @annotation_Creates_SerializedScriptValue @annotation_Returns_SerializedScriptValue
+  @DocsEditable @DomName('MessageEvent.data') @annotation_Creates_SerializedScriptValue @annotation_Returns_SerializedScriptValue
   final dynamic _data;
 
-  /// @domName MessageEvent.lastEventId; @docsEditable true
+  @DocsEditable @DomName('MessageEvent.lastEventId')
   final String lastEventId;
 
-  /// @domName MessageEvent.origin; @docsEditable true
+  @DocsEditable @DomName('MessageEvent.origin')
   final String origin;
 
-  /// @domName MessageEvent.ports; @docsEditable true
-  @Creates('=List')
+  @DocsEditable @DomName('MessageEvent.ports') @Creates('=List')
   final List ports;
 
-  /// @domName MessageEvent.source; @docsEditable true
   WindowBase get source => _convertNativeToDart_Window(this._source);
   @JSName('source')
-  @Creates('Window|=Object') @Returns('Window|=Object')
+  @DocsEditable @DomName('MessageEvent.source') @Creates('Window|=Object') @Returns('Window|=Object')
   final dynamic _source;
 
-  /// @domName MessageEvent.initMessageEvent; @docsEditable true
+  @DocsEditable @DomName('MessageEvent.initMessageEvent')
   void initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List messagePorts) native;
 
-  /// @domName MessageEvent.webkitInitMessageEvent; @docsEditable true
+  @DocsEditable @DomName('MessageEvent.webkitInitMessageEvent')
   void webkitInitMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List transferables) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14521,27 +14380,29 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MessagePort; @docsEditable true
+
+@DocsEditable
+@DomName('MessagePort')
 class MessagePort extends EventTarget native "*MessagePort" {
 
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   MessagePortEvents get on =>
     new MessagePortEvents(this);
 
-  /// @domName MessagePort.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('MessagePort.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName MessagePort.close; @docsEditable true
+  @DocsEditable @DomName('MessagePort.close')
   void close() native;
 
-  /// @domName MessagePort.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('MessagePort.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName MessagePort.postMessage; @docsEditable true
   void postMessage(/*any*/ message, [List messagePorts]) {
     if (?messagePorts) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
@@ -14553,26 +14414,28 @@
     return;
   }
   @JSName('postMessage')
+  @DocsEditable @DomName('MessagePort.postMessage')
   void _postMessage_1(message, List messagePorts) native;
   @JSName('postMessage')
+  @DocsEditable @DomName('MessagePort.postMessage')
   void _postMessage_2(message) native;
 
-  /// @domName MessagePort.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('MessagePort.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName MessagePort.start; @docsEditable true
+  @DocsEditable @DomName('MessagePort.start')
   void start() native;
 
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class MessagePortEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   MessagePortEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get message => this['message'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14580,16 +14443,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLMetaElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLMetaElement')
 class MetaElement extends Element native "*HTMLMetaElement" {
 
-  /// @domName HTMLMetaElement.content; @docsEditable true
+  @DocsEditable @DomName('HTMLMetaElement.content')
   String content;
 
-  /// @domName HTMLMetaElement.httpEquiv; @docsEditable true
+  @DocsEditable @DomName('HTMLMetaElement.httpEquiv')
   String httpEquiv;
 
-  /// @domName HTMLMetaElement.name; @docsEditable true
+  @DocsEditable @DomName('HTMLMetaElement.name')
   String name;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14597,13 +14462,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Metadata; @docsEditable true
+
+@DocsEditable
+@DomName('Metadata')
 class Metadata native "*Metadata" {
 
-  /// @domName Metadata.modificationTime; @docsEditable true
+  @DocsEditable @DomName('Metadata.modificationTime')
   final Date modificationTime;
 
-  /// @domName Metadata.size; @docsEditable true
+  @DocsEditable @DomName('Metadata.size')
   final int size;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14619,38 +14486,40 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLMeterElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLMeterElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 class MeterElement extends Element native "*HTMLMeterElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory MeterElement() => document.$dom_createElement("meter");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('meter');
 
-  /// @domName HTMLMeterElement.high; @docsEditable true
+  @DocsEditable @DomName('HTMLMeterElement.high')
   num high;
 
-  /// @domName HTMLMeterElement.labels; @docsEditable true
+  @DocsEditable @DomName('HTMLMeterElement.labels')
   @Returns('NodeList') @Creates('NodeList')
   final List<Node> labels;
 
-  /// @domName HTMLMeterElement.low; @docsEditable true
+  @DocsEditable @DomName('HTMLMeterElement.low')
   num low;
 
-  /// @domName HTMLMeterElement.max; @docsEditable true
+  @DocsEditable @DomName('HTMLMeterElement.max')
   num max;
 
-  /// @domName HTMLMeterElement.min; @docsEditable true
+  @DocsEditable @DomName('HTMLMeterElement.min')
   num min;
 
-  /// @domName HTMLMeterElement.optimum; @docsEditable true
+  @DocsEditable @DomName('HTMLMeterElement.optimum')
   num optimum;
 
-  /// @domName HTMLMeterElement.value; @docsEditable true
+  @DocsEditable @DomName('HTMLMeterElement.value')
   num value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14658,13 +14527,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLModElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLModElement')
 class ModElement extends Element native "*HTMLModElement" {
 
-  /// @domName HTMLModElement.cite; @docsEditable true
+  @DocsEditable @DomName('HTMLModElement.cite')
   String cite;
 
-  /// @domName HTMLModElement.dateTime; @docsEditable true
+  @DocsEditable @DomName('HTMLModElement.dateTime')
   String dateTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14672,7 +14543,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MouseEvent
+@DocsEditable
+@DomName('MouseEvent')
 class MouseEvent extends UIEvent native "*MouseEvent" {
   factory MouseEvent(String type, Window view, int detail, int screenX,
       int screenY, int clientX, int clientY, int button, [bool canBubble = true,
@@ -14685,67 +14557,66 @@
           ctrlKey, altKey, shiftKey, metaKey,
           relatedTarget);
 
-  /// @domName MouseEvent.altKey; @docsEditable true
+  @DocsEditable @DomName('MouseEvent.altKey')
   final bool altKey;
 
-  /// @domName MouseEvent.button; @docsEditable true
+  @DocsEditable @DomName('MouseEvent.button')
   final int button;
 
-  /// @domName MouseEvent.clientX; @docsEditable true
+  @DocsEditable @DomName('MouseEvent.clientX')
   final int clientX;
 
-  /// @domName MouseEvent.clientY; @docsEditable true
+  @DocsEditable @DomName('MouseEvent.clientY')
   final int clientY;
 
-  /// @domName MouseEvent.ctrlKey; @docsEditable true
+  @DocsEditable @DomName('MouseEvent.ctrlKey')
   final bool ctrlKey;
 
-  /// @domName MouseEvent.dataTransfer; @docsEditable true
+  @DocsEditable @DomName('MouseEvent.dataTransfer')
   final Clipboard dataTransfer;
 
-  /// @domName MouseEvent.fromElement; @docsEditable true
+  @DocsEditable @DomName('MouseEvent.fromElement')
   final Node fromElement;
 
-  /// @domName MouseEvent.metaKey; @docsEditable true
+  @DocsEditable @DomName('MouseEvent.metaKey')
   final bool metaKey;
 
-  /// @domName MouseEvent.relatedTarget; @docsEditable true
   EventTarget get relatedTarget => _convertNativeToDart_EventTarget(this._relatedTarget);
   @JSName('relatedTarget')
-  @Creates('Node') @Returns('EventTarget|=Object')
+  @DocsEditable @DomName('MouseEvent.relatedTarget') @Creates('Node') @Returns('EventTarget|=Object')
   final dynamic _relatedTarget;
 
-  /// @domName MouseEvent.screenX; @docsEditable true
+  @DocsEditable @DomName('MouseEvent.screenX')
   final int screenX;
 
-  /// @domName MouseEvent.screenY; @docsEditable true
+  @DocsEditable @DomName('MouseEvent.screenY')
   final int screenY;
 
-  /// @domName MouseEvent.shiftKey; @docsEditable true
+  @DocsEditable @DomName('MouseEvent.shiftKey')
   final bool shiftKey;
 
-  /// @domName MouseEvent.toElement; @docsEditable true
+  @DocsEditable @DomName('MouseEvent.toElement')
   final Node toElement;
 
-  /// @domName MouseEvent.webkitMovementX; @docsEditable true
+  @DocsEditable @DomName('MouseEvent.webkitMovementX')
   final int webkitMovementX;
 
-  /// @domName MouseEvent.webkitMovementY; @docsEditable true
+  @DocsEditable @DomName('MouseEvent.webkitMovementY')
   final int webkitMovementY;
 
-  /// @domName MouseEvent.x; @docsEditable true
+  @DocsEditable @DomName('MouseEvent.x')
   final int x;
 
-  /// @domName MouseEvent.y; @docsEditable true
+  @DocsEditable @DomName('MouseEvent.y')
   final int y;
 
-  /// @domName MouseEvent.initMouseEvent; @docsEditable true
   void $dom_initMouseEvent(String type, bool canBubble, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) {
     var relatedTarget_1 = _convertDartToNative_EventTarget(relatedTarget);
     _$dom_initMouseEvent_1(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget_1);
     return;
   }
   @JSName('initMouseEvent')
+  @DocsEditable @DomName('MouseEvent.initMouseEvent')
   void _$dom_initMouseEvent_1(type, canBubble, cancelable, Window view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) native;
 
 
@@ -14790,7 +14661,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MutationEvent; @docsEditable true
+
+@DocsEditable
+@DomName('MutationEvent')
 class MutationEvent extends Event native "*MutationEvent" {
 
   static const int ADDITION = 2;
@@ -14799,22 +14672,22 @@
 
   static const int REMOVAL = 3;
 
-  /// @domName MutationEvent.attrChange; @docsEditable true
+  @DocsEditable @DomName('MutationEvent.attrChange')
   final int attrChange;
 
-  /// @domName MutationEvent.attrName; @docsEditable true
+  @DocsEditable @DomName('MutationEvent.attrName')
   final String attrName;
 
-  /// @domName MutationEvent.newValue; @docsEditable true
+  @DocsEditable @DomName('MutationEvent.newValue')
   final String newValue;
 
-  /// @domName MutationEvent.prevValue; @docsEditable true
+  @DocsEditable @DomName('MutationEvent.prevValue')
   final String prevValue;
 
-  /// @domName MutationEvent.relatedNode; @docsEditable true
+  @DocsEditable @DomName('MutationEvent.relatedNode')
   final Node relatedNode;
 
-  /// @domName MutationEvent.initMutationEvent; @docsEditable true
+  @DocsEditable @DomName('MutationEvent.initMutationEvent')
   void initMutationEvent(String type, bool canBubble, bool cancelable, Node relatedNode, String prevValue, String newValue, String attrName, int attrChange) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14822,29 +14695,30 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MutationObserver
+@DocsEditable
+@DomName('MutationObserver')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental()
 class MutationObserver native "*MutationObserver" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory MutationObserver(MutationCallback callback) => MutationObserver._create(callback);
 
-  /// @domName MutationObserver.disconnect; @docsEditable true
+  @DocsEditable @DomName('MutationObserver.disconnect')
   void disconnect() native;
 
-  /// @domName MutationObserver._observe; @docsEditable true
   void _observe(Node target, Map options) {
     var options_1 = convertDartToNative_Dictionary(options);
     __observe_1(target, options_1);
     return;
   }
   @JSName('observe')
+  @DocsEditable @DomName('MutationObserver.observe')
   void __observe_1(Node target, options) native;
 
-  /// @domName MutationObserver.takeRecords; @docsEditable true
+  @DocsEditable @DomName('MutationObserver.takeRecords')
   List<MutationRecord> takeRecords() native;
 
   /**
@@ -14933,36 +14807,38 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MutationRecord; @docsEditable true
+
+@DocsEditable
+@DomName('MutationRecord')
 class MutationRecord native "*MutationRecord" {
 
-  /// @domName MutationRecord.addedNodes; @docsEditable true
+  @DocsEditable @DomName('MutationRecord.addedNodes')
   @Returns('NodeList') @Creates('NodeList')
   final List<Node> addedNodes;
 
-  /// @domName MutationRecord.attributeName; @docsEditable true
+  @DocsEditable @DomName('MutationRecord.attributeName')
   final String attributeName;
 
-  /// @domName MutationRecord.attributeNamespace; @docsEditable true
+  @DocsEditable @DomName('MutationRecord.attributeNamespace')
   final String attributeNamespace;
 
-  /// @domName MutationRecord.nextSibling; @docsEditable true
+  @DocsEditable @DomName('MutationRecord.nextSibling')
   final Node nextSibling;
 
-  /// @domName MutationRecord.oldValue; @docsEditable true
+  @DocsEditable @DomName('MutationRecord.oldValue')
   final String oldValue;
 
-  /// @domName MutationRecord.previousSibling; @docsEditable true
+  @DocsEditable @DomName('MutationRecord.previousSibling')
   final Node previousSibling;
 
-  /// @domName MutationRecord.removedNodes; @docsEditable true
+  @DocsEditable @DomName('MutationRecord.removedNodes')
   @Returns('NodeList') @Creates('NodeList')
   final List<Node> removedNodes;
 
-  /// @domName MutationRecord.target; @docsEditable true
+  @DocsEditable @DomName('MutationRecord.target')
   final Node target;
 
-  /// @domName MutationRecord.type; @docsEditable true
+  @DocsEditable @DomName('MutationRecord.type')
   final String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14970,10 +14846,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName NamedNodeMap; @docsEditable true
+
+@DocsEditable
+@DomName('NamedNodeMap')
 class NamedNodeMap implements JavaScriptIndexingBehavior, List<Node> native "*NamedNodeMap" {
 
-  /// @domName NamedNodeMap.length; @docsEditable true
+  @DocsEditable @DomName('NamedNodeMap.length')
   int get length => JS("int", "#.length", this);
 
   Node operator[](int index) => JS("Node", "#[#]", this, index);
@@ -14994,50 +14872,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Node element) => Collections.contains(this, element);
+  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Node element)) => Collections.forEach(this, f);
+  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Node element)) => new MappedList<Node, dynamic>(this, f);
+  List mappedBy(f(Node element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Node> where(bool f(Node element)) => new WhereIterable<Node>(this, f);
+  Iterable<Node> where(bool f(Node element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Node element)) => Collections.every(this, f);
+  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Node element)) => Collections.any(this, f);
+  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);
 
   List<Node> toList() => new List<Node>.from(this);
   Set<Node> toSet() => new Set<Node>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Node> take(int n) => new ListView<Node>(this, 0, n);
+  List<Node> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Node> takeWhile(bool test(Node value)) {
-    return new TakeWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Node> skip(int n) => new ListView<Node>(this, n, null);
+  List<Node> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Node> skipWhile(bool test(Node value)) {
-    return new SkipWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Node firstMatching(bool test(Node value), { Node orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Node lastMatching(bool test(Node value), {Node orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Node singleMatching(bool test(Node value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Node elementAt(int index) {
@@ -15095,16 +14973,36 @@
     throw new StateError("More than one element");
   }
 
-  Node min([int compare(Node a, Node b)]) => Collections.min(this, compare);
+  Node min([int compare(Node a, Node b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Node max([int compare(Node a, Node b)]) => Collections.max(this, compare);
+  Node max([int compare(Node a, Node b)]) => IterableMixinWorkaround.max(this, compare);
 
   Node removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Node removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Node element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Node element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
@@ -15124,25 +15022,25 @@
 
   // -- end List<Node> mixins.
 
-  /// @domName NamedNodeMap.getNamedItem; @docsEditable true
+  @DocsEditable @DomName('NamedNodeMap.getNamedItem')
   Node getNamedItem(String name) native;
 
-  /// @domName NamedNodeMap.getNamedItemNS; @docsEditable true
+  @DocsEditable @DomName('NamedNodeMap.getNamedItemNS')
   Node getNamedItemNS(String namespaceURI, String localName) native;
 
-  /// @domName NamedNodeMap.item; @docsEditable true
+  @DocsEditable @DomName('NamedNodeMap.item')
   Node item(int index) native;
 
-  /// @domName NamedNodeMap.removeNamedItem; @docsEditable true
+  @DocsEditable @DomName('NamedNodeMap.removeNamedItem')
   Node removeNamedItem(String name) native;
 
-  /// @domName NamedNodeMap.removeNamedItemNS; @docsEditable true
+  @DocsEditable @DomName('NamedNodeMap.removeNamedItemNS')
   Node removeNamedItemNS(String namespaceURI, String localName) native;
 
-  /// @domName NamedNodeMap.setNamedItem; @docsEditable true
+  @DocsEditable @DomName('NamedNodeMap.setNamedItem')
   Node setNamedItem(Node node) native;
 
-  /// @domName NamedNodeMap.setNamedItemNS; @docsEditable true
+  @DocsEditable @DomName('NamedNodeMap.setNamedItemNS')
   Node setNamedItemNS(Node node) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15150,96 +15048,135 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Navigator; @docsEditable true
+@DocsEditable
+@DomName('Navigator')
 class Navigator native "*Navigator" {
 
-  /// @domName Navigator.language; @docsEditable true
+  @DomName('Navigator.language')
   String get language => JS('String', '#.language || #.userLanguage', this,
       this);
 
-  /// @domName Navigator.appCodeName; @docsEditable true
+  /**
+   * Gets a stream (video and or audio) from the local computer.
+   *
+   * Use [MediaStream.supported] to check if this is supported by the current
+   * platform.
+   *
+   * Example use:
+   *
+   *     window.navigator.getUserMedia(audio:true, video: true).then((stream) {
+   *       var video = new VideoElement()
+   *         ..autoplay = true
+   *         ..src = Url.createObjectUrl(stream);
+   *       document.body.append(video);
+   *     });
+   *
+   * See also:
+   * * [MediaStream.supported]
+   */
+  @DomName('Navigator.webkitGetUserMedia')
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @Experimental()
+  Future<LocalMediaStream> getUserMedia({bool audio: false,
+      bool video: false}) {
+    var completer = new Completer<LocalMediaStream>();
+    var options = {
+      'audio': audio,
+      'video': video
+    };
+    _ensureGetUserMedia();
+    this._getUserMedia(convertDartToNative_Dictionary(options),
+      (stream) {
+        completer.complete(stream);
+      },
+      (error) {
+        completer.completeError(error);
+      });
+    return completer.future;
+  }
+
+  _ensureGetUserMedia() {
+    if (JS('bool', '!(#.getUserMedia)', this)) {
+      JS('void', '#.getUserMedia = '
+          '(#.getUserMedia || #.webkitGetUserMedia || #.mozGetUserMedia ||'
+          '#.msGetUserMedia)', this, this, this, this, this);
+    }
+  }
+
+  @JSName('getUserMedia')
+  void _getUserMedia(options, _NavigatorUserMediaSuccessCallback success,
+      _NavigatorUserMediaErrorCallback error) native;
+
+
+  @DocsEditable @DomName('Navigator.appCodeName')
   final String appCodeName;
 
-  /// @domName Navigator.appName; @docsEditable true
+  @DocsEditable @DomName('Navigator.appName')
   final String appName;
 
-  /// @domName Navigator.appVersion; @docsEditable true
+  @DocsEditable @DomName('Navigator.appVersion')
   final String appVersion;
 
-  /// @domName Navigator.cookieEnabled; @docsEditable true
+  @DocsEditable @DomName('Navigator.cookieEnabled')
   final bool cookieEnabled;
 
-  /// @domName Navigator.geolocation; @docsEditable true
+  @DocsEditable @DomName('Navigator.geolocation')
   final Geolocation geolocation;
 
-  /// @domName Navigator.mimeTypes; @docsEditable true
+  @DocsEditable @DomName('Navigator.mimeTypes')
   final DomMimeTypeArray mimeTypes;
 
-  /// @domName Navigator.onLine; @docsEditable true
+  @DocsEditable @DomName('Navigator.onLine')
   final bool onLine;
 
-  /// @domName Navigator.platform; @docsEditable true
+  @DocsEditable @DomName('Navigator.platform')
   final String platform;
 
-  /// @domName Navigator.plugins; @docsEditable true
+  @DocsEditable @DomName('Navigator.plugins')
   final DomPluginArray plugins;
 
-  /// @domName Navigator.product; @docsEditable true
+  @DocsEditable @DomName('Navigator.product')
   final String product;
 
-  /// @domName Navigator.productSub; @docsEditable true
+  @DocsEditable @DomName('Navigator.productSub')
   final String productSub;
 
-  /// @domName Navigator.userAgent; @docsEditable true
+  @DocsEditable @DomName('Navigator.userAgent')
   final String userAgent;
 
-  /// @domName Navigator.vendor; @docsEditable true
+  @DocsEditable @DomName('Navigator.vendor')
   final String vendor;
 
-  /// @domName Navigator.vendorSub; @docsEditable true
+  @DocsEditable @DomName('Navigator.vendorSub')
   final String vendorSub;
 
-  /// @domName Navigator.webkitBattery; @docsEditable true
+  @DocsEditable @DomName('Navigator.webkitBattery')
   final BatteryManager webkitBattery;
 
-  /// @domName Navigator.getStorageUpdates; @docsEditable true
+  @DocsEditable @DomName('Navigator.getStorageUpdates')
   void getStorageUpdates() native;
 
-  /// @domName Navigator.javaEnabled; @docsEditable true
+  @DocsEditable @DomName('Navigator.javaEnabled')
   bool javaEnabled() native;
 
-  /// @domName Navigator.webkitGetGamepads; @docsEditable true
+  @DocsEditable @DomName('Navigator.webkitGetGamepads')
   @Returns('_GamepadList') @Creates('_GamepadList')
   List<Gamepad> webkitGetGamepads() native;
 
-  /// @domName Navigator.webkitGetUserMedia; @docsEditable true
-  void webkitGetUserMedia(Map options, NavigatorUserMediaSuccessCallback successCallback, [NavigatorUserMediaErrorCallback errorCallback]) {
-    if (?errorCallback) {
-      var options_1 = convertDartToNative_Dictionary(options);
-      _webkitGetUserMedia_1(options_1, successCallback, errorCallback);
-      return;
-    }
-    var options_2 = convertDartToNative_Dictionary(options);
-    _webkitGetUserMedia_2(options_2, successCallback);
-    return;
-  }
-  @JSName('webkitGetUserMedia')
-  void _webkitGetUserMedia_1(options, NavigatorUserMediaSuccessCallback successCallback, NavigatorUserMediaErrorCallback errorCallback) native;
-  @JSName('webkitGetUserMedia')
-  void _webkitGetUserMedia_2(options, NavigatorUserMediaSuccessCallback successCallback) native;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName NavigatorUserMediaError; @docsEditable true
+
+@DocsEditable
+@DomName('NavigatorUserMediaError')
 class NavigatorUserMediaError native "*NavigatorUserMediaError" {
 
   static const int PERMISSION_DENIED = 1;
 
-  /// @domName NavigatorUserMediaError.code; @docsEditable true
+  @DocsEditable @DomName('NavigatorUserMediaError.code')
   final int code;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15249,7 +15186,7 @@
 // WARNING: Do not edit - generated code.
 
 
-typedef void NavigatorUserMediaErrorCallback(NavigatorUserMediaError error);
+typedef void _NavigatorUserMediaErrorCallback(NavigatorUserMediaError error);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -15257,7 +15194,7 @@
 // WARNING: Do not edit - generated code.
 
 
-typedef void NavigatorUserMediaSuccessCallback(LocalMediaStream stream);
+typedef void _NavigatorUserMediaSuccessCallback(LocalMediaStream stream);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -15292,11 +15229,11 @@
   }
 
   Node min([int compare(Node a, Node b)]) {
-    return Collections.min(this, compare);
+    return IterableMixinWorkaround.min(this, compare);
   }
 
   Node max([int compare(Node a, Node b)]) {
-    return Collections.max(this, compare);
+    return IterableMixinWorkaround.max(this, compare);
   }
 
   void add(Node value) {
@@ -15330,6 +15267,29 @@
     return result;
   }
 
+  void remove(Object object) {
+    if (object is! Node) return;
+    Node node = object;
+    if (!identical(this, node.parentNode)) return;
+    _this.$dom_removeChild(node);
+  }
+
+  void removeAll(Iterable elements) {
+    IterableMixinWorkaround.removeAll(this, elements);
+  }
+
+  void retainAll(Iterable elements) {
+    IterableMixinWorkaround.retainAll(this, elements);
+  }
+
+  void removeMatching(bool test(Node node)) {
+    IterableMixinWorkaround.removeMatching(this, test);
+  }
+
+  void retainMatching(bool test(Node node)) {
+    IterableMixinWorkaround.retainMatching(this, test);
+  }
+
   void clear() {
     _this.text = '';
   }
@@ -15342,28 +15302,30 @@
 
   // TODO(jacobr): We can implement these methods much more efficiently by
   // looking up the nodeList only once instead of once per iteration.
-  bool contains(Node element) => Collections.contains(this, element);
+  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Node element)) => Collections.forEach(this, f);
+  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
   dynamic reduce(dynamic initialValue,
       dynamic combine(dynamic previousValue, Node element)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
   String join([String separator]) {
-    return Collections.joinList(this, separator);
+    return IterableMixinWorkaround.joinList(this, separator);
   }
 
-  List mappedBy(f(Node element)) =>
-      new MappedList<Node, dynamic>(this, f);
+  List mappedBy(f(Node element)) {
+    return IterableMixinWorkaround.mappedByList(this, f);
+  }
 
-  Iterable<Node> where(bool f(Node element)) =>
-     new WhereIterable<Node>(this, f);
+  Iterable<Node> where(bool f(Node element)) {
+    return IterableMixinWorkaround.where(this, f);
+  }
 
-  bool every(bool f(Node element)) => Collections.every(this, f);
+  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Node element)) => Collections.any(this, f);
+  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);
 
   List<Node> toList() => new List<Node>.from(this);
   Set<Node> toSet() => new Set<Node>.from(this);
@@ -15373,31 +15335,31 @@
   // From List<Node>:
 
   List<Node> take(int n) {
-    return new ListView<Node>(this, 0, n);
+    return IterableMixinWorkaround.takeList(this, n);
   }
 
   Iterable<Node> takeWhile(bool test(Node value)) {
-    return new TakeWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
   List<Node> skip(int n) {
-    return new ListView<Node>(this, n, null);
+    return IterableMixinWorkaround.skipList(this, n);
   }
 
   Iterable<Node> skipWhile(bool test(Node value)) {
-    return new SkipWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Node firstMatching(bool test(Node value), {Node orElse()}) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Node lastMatching(bool test(Node value), {Node orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Node singleMatching(bool test(Node value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Node elementAt(int index) {
@@ -15446,7 +15408,8 @@
   Node operator[](int index) => _this.$dom_childNodes[index];
 }
 
-/// @domName Node
+@DocsEditable
+@DomName('Node')
 class Node extends EventTarget native "*Node" {
   List<Node> get nodes {
     return new _ChildNodeListLazy(this);
@@ -15464,8 +15427,8 @@
 
   /**
    * Removes this node from the DOM.
-   * @domName Node.removeChild
    */
+  @DomName('Node.removeChild')
   void remove() {
     // TODO(jacobr): should we throw an exception if parent is already null?
     // TODO(vsm): Use the native remove when available.
@@ -15477,8 +15440,8 @@
 
   /**
    * Replaces this node with another node.
-   * @domName Node.replaceChild
    */
+  @DomName('Node.replaceChild')
   Node replaceWith(Node otherNode) {
     try {
       final Node parent = this.parentNode;
@@ -15490,128 +15453,95 @@
   }
 
 
-  static const int ATTRIBUTE_NODE = 2;
-
-  static const int CDATA_SECTION_NODE = 4;
-
-  static const int COMMENT_NODE = 8;
-
-  static const int DOCUMENT_FRAGMENT_NODE = 11;
-
-  static const int DOCUMENT_NODE = 9;
-
-  static const int DOCUMENT_POSITION_CONTAINED_BY = 0x10;
-
-  static const int DOCUMENT_POSITION_CONTAINS = 0x08;
-
-  static const int DOCUMENT_POSITION_DISCONNECTED = 0x01;
-
-  static const int DOCUMENT_POSITION_FOLLOWING = 0x04;
-
-  static const int DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
-
-  static const int DOCUMENT_POSITION_PRECEDING = 0x02;
-
-  static const int DOCUMENT_TYPE_NODE = 10;
-
-  static const int ELEMENT_NODE = 1;
-
-  static const int ENTITY_NODE = 6;
-
-  static const int ENTITY_REFERENCE_NODE = 5;
-
-  static const int NOTATION_NODE = 12;
-
-  static const int PROCESSING_INSTRUCTION_NODE = 7;
-
-  static const int TEXT_NODE = 3;
-
-  /// @domName Node.attributes; @docsEditable true
   @JSName('attributes')
+  @DocsEditable @DomName('Node.attributes')
   final NamedNodeMap $dom_attributes;
 
-  /// @domName Node.childNodes; @docsEditable true
   @JSName('childNodes')
+  @DocsEditable @DomName('Node.childNodes')
   @Returns('NodeList') @Creates('NodeList')
   final List<Node> $dom_childNodes;
 
-  /// @domName Node.firstChild; @docsEditable true
   @JSName('firstChild')
+  @DocsEditable @DomName('Node.firstChild')
   final Node $dom_firstChild;
 
-  /// @domName Node.lastChild; @docsEditable true
   @JSName('lastChild')
+  @DocsEditable @DomName('Node.lastChild')
   final Node $dom_lastChild;
 
-  /// @domName Node.localName; @docsEditable true
   @JSName('localName')
+  @DocsEditable @DomName('Node.localName')
   final String $dom_localName;
 
-  /// @domName Node.namespaceURI; @docsEditable true
   @JSName('namespaceURI')
+  @DocsEditable @DomName('Node.namespaceURI')
   final String $dom_namespaceUri;
 
-  /// @domName Node.nextSibling; @docsEditable true
   @JSName('nextSibling')
+  @DocsEditable @DomName('Node.nextSibling')
   final Node nextNode;
 
-  /// @domName Node.nodeType; @docsEditable true
+  @DocsEditable @DomName('Node.nodeType')
   final int nodeType;
 
-  /// @domName Node.ownerDocument; @docsEditable true
+  @DocsEditable @DomName('Node.nodeValue')
+  final String nodeValue;
+
   @JSName('ownerDocument')
+  @DocsEditable @DomName('Node.ownerDocument')
   final Document document;
 
-  /// @domName Node.parentElement; @docsEditable true
   @JSName('parentElement')
+  @DocsEditable @DomName('Node.parentElement')
   final Element parent;
 
-  /// @domName Node.parentNode; @docsEditable true
+  @DocsEditable @DomName('Node.parentNode')
   final Node parentNode;
 
-  /// @domName Node.previousSibling; @docsEditable true
   @JSName('previousSibling')
+  @DocsEditable @DomName('Node.previousSibling')
   final Node previousNode;
 
-  /// @domName Node.textContent; @docsEditable true
   @JSName('textContent')
+  @DocsEditable @DomName('Node.textContent')
   String text;
 
-  /// @domName Node.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('Node.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName Node.appendChild; @docsEditable true
   @JSName('appendChild')
+  @DocsEditable @DomName('Node.appendChild')
   Node $dom_appendChild(Node newChild) native;
 
-  /// @domName Node.cloneNode; @docsEditable true
   @JSName('cloneNode')
+  @DocsEditable @DomName('Node.cloneNode')
   Node clone(bool deep) native;
 
-  /// @domName Node.contains; @docsEditable true
+  @DocsEditable @DomName('Node.contains')
   bool contains(Node other) native;
 
-  /// @domName Node.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('Node.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native;
 
-  /// @domName Node.hasChildNodes; @docsEditable true
+  @DocsEditable @DomName('Node.hasChildNodes')
   bool hasChildNodes() native;
 
-  /// @domName Node.insertBefore; @docsEditable true
+  @DocsEditable @DomName('Node.insertBefore')
   Node insertBefore(Node newChild, Node refChild) native;
 
-  /// @domName Node.removeChild; @docsEditable true
   @JSName('removeChild')
+  @DocsEditable @DomName('Node.removeChild')
   Node $dom_removeChild(Node oldChild) native;
 
-  /// @domName Node.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('Node.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName Node.replaceChild; @docsEditable true
   @JSName('replaceChild')
+  @DocsEditable @DomName('Node.replaceChild')
   Node $dom_replaceChild(Node newChild, Node oldChild) native;
 
 }
@@ -15620,7 +15550,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName NodeFilter; @docsEditable true
+
+@DocsEditable
+@DomName('NodeFilter')
 class NodeFilter native "*NodeFilter" {
 
   static const int FILTER_ACCEPT = 1;
@@ -15655,7 +15587,7 @@
 
   static const int SHOW_TEXT = 0x00000004;
 
-  /// @domName NodeFilter.acceptNode; @docsEditable true
+  @DocsEditable @DomName('NodeFilter.acceptNode')
   int acceptNode(Node n) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15663,34 +15595,36 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName NodeIterator; @docsEditable true
+
+@DocsEditable
+@DomName('NodeIterator')
 class NodeIterator native "*NodeIterator" {
 
-  /// @domName NodeIterator.expandEntityReferences; @docsEditable true
+  @DocsEditable @DomName('NodeIterator.expandEntityReferences')
   final bool expandEntityReferences;
 
-  /// @domName NodeIterator.filter; @docsEditable true
+  @DocsEditable @DomName('NodeIterator.filter')
   final NodeFilter filter;
 
-  /// @domName NodeIterator.pointerBeforeReferenceNode; @docsEditable true
+  @DocsEditable @DomName('NodeIterator.pointerBeforeReferenceNode')
   final bool pointerBeforeReferenceNode;
 
-  /// @domName NodeIterator.referenceNode; @docsEditable true
+  @DocsEditable @DomName('NodeIterator.referenceNode')
   final Node referenceNode;
 
-  /// @domName NodeIterator.root; @docsEditable true
+  @DocsEditable @DomName('NodeIterator.root')
   final Node root;
 
-  /// @domName NodeIterator.whatToShow; @docsEditable true
+  @DocsEditable @DomName('NodeIterator.whatToShow')
   final int whatToShow;
 
-  /// @domName NodeIterator.detach; @docsEditable true
+  @DocsEditable @DomName('NodeIterator.detach')
   void detach() native;
 
-  /// @domName NodeIterator.nextNode; @docsEditable true
+  @DocsEditable @DomName('NodeIterator.nextNode')
   Node nextNode() native;
 
-  /// @domName NodeIterator.previousNode; @docsEditable true
+  @DocsEditable @DomName('NodeIterator.previousNode')
   Node previousNode() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15698,10 +15632,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName NodeList; @docsEditable true
+
+@DocsEditable
+@DomName('NodeList')
 class NodeList implements JavaScriptIndexingBehavior, List<Node> native "*NodeList" {
 
-  /// @domName NodeList.length; @docsEditable true
+  @DocsEditable @DomName('NodeList.length')
   int get length => JS("int", "#.length", this);
 
   Node operator[](int index) => JS("Node", "#[#]", this, index);
@@ -15722,50 +15658,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Node element) => Collections.contains(this, element);
+  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Node element)) => Collections.forEach(this, f);
+  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Node element)) => new MappedList<Node, dynamic>(this, f);
+  List mappedBy(f(Node element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Node> where(bool f(Node element)) => new WhereIterable<Node>(this, f);
+  Iterable<Node> where(bool f(Node element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Node element)) => Collections.every(this, f);
+  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Node element)) => Collections.any(this, f);
+  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);
 
   List<Node> toList() => new List<Node>.from(this);
   Set<Node> toSet() => new Set<Node>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Node> take(int n) => new ListView<Node>(this, 0, n);
+  List<Node> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Node> takeWhile(bool test(Node value)) {
-    return new TakeWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Node> skip(int n) => new ListView<Node>(this, n, null);
+  List<Node> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Node> skipWhile(bool test(Node value)) {
-    return new SkipWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Node firstMatching(bool test(Node value), { Node orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Node lastMatching(bool test(Node value), {Node orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Node singleMatching(bool test(Node value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Node elementAt(int index) {
@@ -15823,16 +15759,36 @@
     throw new StateError("More than one element");
   }
 
-  Node min([int compare(Node a, Node b)]) => Collections.min(this, compare);
+  Node min([int compare(Node a, Node b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Node max([int compare(Node a, Node b)]) => Collections.max(this, compare);
+  Node max([int compare(Node a, Node b)]) => IterableMixinWorkaround.max(this, compare);
 
   Node removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Node removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Node element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Node element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
@@ -15852,8 +15808,8 @@
 
   // -- end List<Node> mixins.
 
-  /// @domName NodeList.item; @docsEditable true
   @JSName('item')
+  @DocsEditable @DomName('NodeList.item')
   Node _item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15861,13 +15817,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Notation; @docsEditable true
+
+@DocsEditable
+@DomName('Notation')
 class Notation extends Node native "*Notation" {
 
-  /// @domName Notation.publicId; @docsEditable true
+  @DocsEditable @DomName('Notation.publicId')
   final String publicId;
 
-  /// @domName Notation.systemId; @docsEditable true
+  @DocsEditable @DomName('Notation.systemId')
   final String systemId;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15875,7 +15833,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Notification; @docsEditable true
+
+@DocsEditable
+@DomName('Notification')
 class Notification extends EventTarget native "*Notification" {
 
   static const EventStreamProvider<Event> clickEvent = const EventStreamProvider<Event>('click');
@@ -15888,7 +15848,7 @@
 
   static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');
 
-  ///@docsEditable true
+  @DocsEditable
   factory Notification(String title, [Map options]) {
     if (!?options) {
       return Notification._create(title);
@@ -15902,44 +15862,45 @@
     return JS('Notification', 'new Notification(#,#)', title, options);
   }
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   NotificationEvents get on =>
     new NotificationEvents(this);
 
-  /// @domName Notification.dir; @docsEditable true
+  @DocsEditable @DomName('Notification.dir')
   String dir;
 
-  /// @domName Notification.permission; @docsEditable true
+  @DocsEditable @DomName('Notification.permission')
   final String permission;
 
-  /// @domName Notification.replaceId; @docsEditable true
+  @DocsEditable @DomName('Notification.replaceId')
   String replaceId;
 
-  /// @domName Notification.tag; @docsEditable true
+  @DocsEditable @DomName('Notification.tag')
   String tag;
 
-  /// @domName Notification.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('Notification.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName Notification.cancel; @docsEditable true
+  @DocsEditable @DomName('Notification.cancel')
   void cancel() native;
 
-  /// @domName Notification.close; @docsEditable true
+  @DocsEditable @DomName('Notification.close')
   void close() native;
 
-  /// @domName Notification.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('Notification.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName Notification.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('Notification.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName Notification.requestPermission; @docsEditable true
+  @DocsEditable @DomName('Notification.requestPermission')
   static void requestPermission(NotificationPermissionCallback callback) native;
 
-  /// @domName Notification.show; @docsEditable true
+  @DocsEditable @DomName('Notification.show')
   void show() native;
 
   Stream<Event> get onClick => clickEvent.forTarget(this);
@@ -15953,24 +15914,24 @@
   Stream<Event> get onShow => showEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class NotificationEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   NotificationEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get click => this['click'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get close => this['close'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get display => this['display'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get show => this['show'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15978,20 +15939,28 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName NotificationCenter; @docsEditable true
+
+@DocsEditable
+@DomName('NotificationCenter')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.SAFARI)
+@Experimental()
 class NotificationCenter native "*NotificationCenter" {
 
-  /// @domName NotificationCenter.checkPermission; @docsEditable true
+  /// Checks if this type is supported on the current platform.
+  static bool get supported => JS('bool', '!!(window.webkitNotifications)');
+
+  @DocsEditable @DomName('NotificationCenter.checkPermission')
   int checkPermission() native;
 
-  /// @domName NotificationCenter.createHTMLNotification; @docsEditable true
   @JSName('createHTMLNotification')
+  @DocsEditable @DomName('NotificationCenter.createHTMLNotification')
   Notification createHtmlNotification(String url) native;
 
-  /// @domName NotificationCenter.createNotification; @docsEditable true
+  @DocsEditable @DomName('NotificationCenter.createNotification')
   Notification createNotification(String iconUrl, String title, String body) native;
 
-  /// @domName NotificationCenter.requestPermission; @docsEditable true
+  @DocsEditable @DomName('NotificationCenter.requestPermission')
   void requestPermission(VoidCallback callback) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16007,19 +15976,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLOListElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLOListElement')
 class OListElement extends Element native "*HTMLOListElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory OListElement() => document.$dom_createElement("ol");
 
-  /// @domName HTMLOListElement.reversed; @docsEditable true
+  @DocsEditable @DomName('HTMLOListElement.reversed')
   bool reversed;
 
-  /// @domName HTMLOListElement.start; @docsEditable true
+  @DocsEditable @DomName('HTMLOListElement.start')
   int start;
 
-  /// @domName HTMLOListElement.type; @docsEditable true
+  @DocsEditable @DomName('HTMLOListElement.type')
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16027,55 +15998,57 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLObjectElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLObjectElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 class ObjectElement extends Element native "*HTMLObjectElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory ObjectElement() => document.$dom_createElement("object");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('object');
 
-  /// @domName HTMLObjectElement.code; @docsEditable true
+  @DocsEditable @DomName('HTMLObjectElement.code')
   String code;
 
-  /// @domName HTMLObjectElement.data; @docsEditable true
+  @DocsEditable @DomName('HTMLObjectElement.data')
   String data;
 
-  /// @domName HTMLObjectElement.form; @docsEditable true
+  @DocsEditable @DomName('HTMLObjectElement.form')
   final FormElement form;
 
-  /// @domName HTMLObjectElement.height; @docsEditable true
+  @DocsEditable @DomName('HTMLObjectElement.height')
   String height;
 
-  /// @domName HTMLObjectElement.name; @docsEditable true
+  @DocsEditable @DomName('HTMLObjectElement.name')
   String name;
 
-  /// @domName HTMLObjectElement.type; @docsEditable true
+  @DocsEditable @DomName('HTMLObjectElement.type')
   String type;
 
-  /// @domName HTMLObjectElement.useMap; @docsEditable true
+  @DocsEditable @DomName('HTMLObjectElement.useMap')
   String useMap;
 
-  /// @domName HTMLObjectElement.validationMessage; @docsEditable true
+  @DocsEditable @DomName('HTMLObjectElement.validationMessage')
   final String validationMessage;
 
-  /// @domName HTMLObjectElement.validity; @docsEditable true
+  @DocsEditable @DomName('HTMLObjectElement.validity')
   final ValidityState validity;
 
-  /// @domName HTMLObjectElement.width; @docsEditable true
+  @DocsEditable @DomName('HTMLObjectElement.width')
   String width;
 
-  /// @domName HTMLObjectElement.willValidate; @docsEditable true
+  @DocsEditable @DomName('HTMLObjectElement.willValidate')
   final bool willValidate;
 
-  /// @domName HTMLObjectElement.checkValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLObjectElement.checkValidity')
   bool checkValidity() native;
 
-  /// @domName HTMLObjectElement.setCustomValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLObjectElement.setCustomValidity')
   void setCustomValidity(String error) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16083,7 +16056,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OESElementIndexUint; @docsEditable true
+
+@DocsEditable
+@DomName('OESElementIndexUint')
 class OesElementIndexUint native "*OESElementIndexUint" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16091,7 +16066,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OESStandardDerivatives; @docsEditable true
+
+@DocsEditable
+@DomName('OESStandardDerivatives')
 class OesStandardDerivatives native "*OESStandardDerivatives" {
 
   static const int FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B;
@@ -16101,7 +16078,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OESTextureFloat; @docsEditable true
+
+@DocsEditable
+@DomName('OESTextureFloat')
 class OesTextureFloat native "*OESTextureFloat" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16109,25 +16088,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OESVertexArrayObject; @docsEditable true
+
+@DocsEditable
+@DomName('OESVertexArrayObject')
 class OesVertexArrayObject native "*OESVertexArrayObject" {
 
   static const int VERTEX_ARRAY_BINDING_OES = 0x85B5;
 
-  /// @domName OESVertexArrayObject.bindVertexArrayOES; @docsEditable true
   @JSName('bindVertexArrayOES')
+  @DocsEditable @DomName('OESVertexArrayObject.bindVertexArrayOES')
   void bindVertexArray(WebGLVertexArrayObject arrayObject) native;
 
-  /// @domName OESVertexArrayObject.createVertexArrayOES; @docsEditable true
   @JSName('createVertexArrayOES')
+  @DocsEditable @DomName('OESVertexArrayObject.createVertexArrayOES')
   WebGLVertexArrayObject createVertexArray() native;
 
-  /// @domName OESVertexArrayObject.deleteVertexArrayOES; @docsEditable true
   @JSName('deleteVertexArrayOES')
+  @DocsEditable @DomName('OESVertexArrayObject.deleteVertexArrayOES')
   void deleteVertexArray(WebGLVertexArrayObject arrayObject) native;
 
-  /// @domName OESVertexArrayObject.isVertexArrayOES; @docsEditable true
   @JSName('isVertexArrayOES')
+  @DocsEditable @DomName('OESVertexArrayObject.isVertexArrayOES')
   bool isVertexArray(WebGLVertexArrayObject arrayObject) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16135,16 +16116,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLOptGroupElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLOptGroupElement')
 class OptGroupElement extends Element native "*HTMLOptGroupElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory OptGroupElement() => document.$dom_createElement("optgroup");
 
-  /// @domName HTMLOptGroupElement.disabled; @docsEditable true
+  @DocsEditable @DomName('HTMLOptGroupElement.disabled')
   bool disabled;
 
-  /// @domName HTMLOptGroupElement.label; @docsEditable true
+  @DocsEditable @DomName('HTMLOptGroupElement.label')
   String label;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16152,10 +16135,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLOptionElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLOptionElement')
 class OptionElement extends Element native "*HTMLOptionElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory OptionElement([String data, String value, bool defaultSelected, bool selected]) {
     if (!?data) {
       return OptionElement._create();
@@ -16187,25 +16172,25 @@
     return JS('OptionElement', 'new Option(#,#,#,#)', data, value, defaultSelected, selected);
   }
 
-  /// @domName HTMLOptionElement.defaultSelected; @docsEditable true
+  @DocsEditable @DomName('HTMLOptionElement.defaultSelected')
   bool defaultSelected;
 
-  /// @domName HTMLOptionElement.disabled; @docsEditable true
+  @DocsEditable @DomName('HTMLOptionElement.disabled')
   bool disabled;
 
-  /// @domName HTMLOptionElement.form; @docsEditable true
+  @DocsEditable @DomName('HTMLOptionElement.form')
   final FormElement form;
 
-  /// @domName HTMLOptionElement.index; @docsEditable true
+  @DocsEditable @DomName('HTMLOptionElement.index')
   final int index;
 
-  /// @domName HTMLOptionElement.label; @docsEditable true
+  @DocsEditable @DomName('HTMLOptionElement.label')
   String label;
 
-  /// @domName HTMLOptionElement.selected; @docsEditable true
+  @DocsEditable @DomName('HTMLOptionElement.selected')
   bool selected;
 
-  /// @domName HTMLOptionElement.value; @docsEditable true
+  @DocsEditable @DomName('HTMLOptionElement.value')
   String value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16213,53 +16198,55 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLOutputElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLOutputElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 class OutputElement extends Element native "*HTMLOutputElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory OutputElement() => document.$dom_createElement("output");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('output');
 
-  /// @domName HTMLOutputElement.defaultValue; @docsEditable true
+  @DocsEditable @DomName('HTMLOutputElement.defaultValue')
   String defaultValue;
 
-  /// @domName HTMLOutputElement.form; @docsEditable true
+  @DocsEditable @DomName('HTMLOutputElement.form')
   final FormElement form;
 
-  /// @domName HTMLOutputElement.htmlFor; @docsEditable true
+  @DocsEditable @DomName('HTMLOutputElement.htmlFor')
   DomSettableTokenList htmlFor;
 
-  /// @domName HTMLOutputElement.labels; @docsEditable true
+  @DocsEditable @DomName('HTMLOutputElement.labels')
   @Returns('NodeList') @Creates('NodeList')
   final List<Node> labels;
 
-  /// @domName HTMLOutputElement.name; @docsEditable true
+  @DocsEditable @DomName('HTMLOutputElement.name')
   String name;
 
-  /// @domName HTMLOutputElement.type; @docsEditable true
+  @DocsEditable @DomName('HTMLOutputElement.type')
   final String type;
 
-  /// @domName HTMLOutputElement.validationMessage; @docsEditable true
+  @DocsEditable @DomName('HTMLOutputElement.validationMessage')
   final String validationMessage;
 
-  /// @domName HTMLOutputElement.validity; @docsEditable true
+  @DocsEditable @DomName('HTMLOutputElement.validity')
   final ValidityState validity;
 
-  /// @domName HTMLOutputElement.value; @docsEditable true
+  @DocsEditable @DomName('HTMLOutputElement.value')
   String value;
 
-  /// @domName HTMLOutputElement.willValidate; @docsEditable true
+  @DocsEditable @DomName('HTMLOutputElement.willValidate')
   final bool willValidate;
 
-  /// @domName HTMLOutputElement.checkValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLOutputElement.checkValidity')
   bool checkValidity() native;
 
-  /// @domName HTMLOutputElement.setCustomValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLOutputElement.setCustomValidity')
   void setCustomValidity(String error) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16267,7 +16254,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OverflowEvent; @docsEditable true
+
+@DocsEditable
+@DomName('OverflowEvent')
 class OverflowEvent extends Event native "*OverflowEvent" {
 
   static const int BOTH = 2;
@@ -16276,13 +16265,13 @@
 
   static const int VERTICAL = 1;
 
-  /// @domName OverflowEvent.horizontalOverflow; @docsEditable true
+  @DocsEditable @DomName('OverflowEvent.horizontalOverflow')
   final bool horizontalOverflow;
 
-  /// @domName OverflowEvent.orient; @docsEditable true
+  @DocsEditable @DomName('OverflowEvent.orient')
   final int orient;
 
-  /// @domName OverflowEvent.verticalOverflow; @docsEditable true
+  @DocsEditable @DomName('OverflowEvent.verticalOverflow')
   final bool verticalOverflow;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16290,19 +16279,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PagePopupController; @docsEditable true
+
+@DocsEditable
+@DomName('PagePopupController')
 class PagePopupController native "*PagePopupController" {
 
-  /// @domName PagePopupController.formatMonth; @docsEditable true
+  @DocsEditable @DomName('PagePopupController.formatMonth')
   String formatMonth(int year, int zeroBaseMonth) native;
 
-  /// @domName PagePopupController.histogramEnumeration; @docsEditable true
+  @DocsEditable @DomName('PagePopupController.histogramEnumeration')
   void histogramEnumeration(String name, int sample, int boundaryValue) native;
 
-  /// @domName PagePopupController.localizeNumberString; @docsEditable true
+  @DocsEditable @DomName('PagePopupController.localizeNumberString')
   String localizeNumberString(String numberString) native;
 
-  /// @domName PagePopupController.setValueAndClosePopup; @docsEditable true
+  @DocsEditable @DomName('PagePopupController.setValueAndClosePopup')
   void setValueAndClosePopup(int numberValue, String stringValue) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16310,10 +16301,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PageTransitionEvent; @docsEditable true
+
+@DocsEditable
+@DomName('PageTransitionEvent')
 class PageTransitionEvent extends Event native "*PageTransitionEvent" {
 
-  /// @domName PageTransitionEvent.persisted; @docsEditable true
+  @DocsEditable @DomName('PageTransitionEvent.persisted')
   final bool persisted;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16321,10 +16314,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLParagraphElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLParagraphElement')
 class ParagraphElement extends Element native "*HTMLParagraphElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory ParagraphElement() => document.$dom_createElement("p");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16332,16 +16327,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLParamElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLParamElement')
 class ParamElement extends Element native "*HTMLParamElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory ParamElement() => document.$dom_createElement("param");
 
-  /// @domName HTMLParamElement.name; @docsEditable true
+  @DocsEditable @DomName('HTMLParamElement.name')
   String name;
 
-  /// @domName HTMLParamElement.value; @docsEditable true
+  @DocsEditable @DomName('HTMLParamElement.value')
   String value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16349,7 +16346,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Performance; @docsEditable true
+
+@DocsEditable
+@DomName('Performance')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE)
@@ -16358,16 +16357,16 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.performance)');
 
-  /// @domName Performance.memory; @docsEditable true
+  @DocsEditable @DomName('Performance.memory')
   final MemoryInfo memory;
 
-  /// @domName Performance.navigation; @docsEditable true
+  @DocsEditable @DomName('Performance.navigation')
   final PerformanceNavigation navigation;
 
-  /// @domName Performance.timing; @docsEditable true
+  @DocsEditable @DomName('Performance.timing')
   final PerformanceTiming timing;
 
-  /// @domName Performance.now; @docsEditable true
+  @DocsEditable @DomName('Performance.now')
   num now() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16375,7 +16374,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PerformanceNavigation; @docsEditable true
+
+@DocsEditable
+@DomName('PerformanceNavigation')
 class PerformanceNavigation native "*PerformanceNavigation" {
 
   static const int TYPE_BACK_FORWARD = 2;
@@ -16386,10 +16387,10 @@
 
   static const int TYPE_RESERVED = 255;
 
-  /// @domName PerformanceNavigation.redirectCount; @docsEditable true
+  @DocsEditable @DomName('PerformanceNavigation.redirectCount')
   final int redirectCount;
 
-  /// @domName PerformanceNavigation.type; @docsEditable true
+  @DocsEditable @DomName('PerformanceNavigation.type')
   final int type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16397,70 +16398,72 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PerformanceTiming; @docsEditable true
+
+@DocsEditable
+@DomName('PerformanceTiming')
 class PerformanceTiming native "*PerformanceTiming" {
 
-  /// @domName PerformanceTiming.connectEnd; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.connectEnd')
   final int connectEnd;
 
-  /// @domName PerformanceTiming.connectStart; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.connectStart')
   final int connectStart;
 
-  /// @domName PerformanceTiming.domComplete; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.domComplete')
   final int domComplete;
 
-  /// @domName PerformanceTiming.domContentLoadedEventEnd; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.domContentLoadedEventEnd')
   final int domContentLoadedEventEnd;
 
-  /// @domName PerformanceTiming.domContentLoadedEventStart; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.domContentLoadedEventStart')
   final int domContentLoadedEventStart;
 
-  /// @domName PerformanceTiming.domInteractive; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.domInteractive')
   final int domInteractive;
 
-  /// @domName PerformanceTiming.domLoading; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.domLoading')
   final int domLoading;
 
-  /// @domName PerformanceTiming.domainLookupEnd; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.domainLookupEnd')
   final int domainLookupEnd;
 
-  /// @domName PerformanceTiming.domainLookupStart; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.domainLookupStart')
   final int domainLookupStart;
 
-  /// @domName PerformanceTiming.fetchStart; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.fetchStart')
   final int fetchStart;
 
-  /// @domName PerformanceTiming.loadEventEnd; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.loadEventEnd')
   final int loadEventEnd;
 
-  /// @domName PerformanceTiming.loadEventStart; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.loadEventStart')
   final int loadEventStart;
 
-  /// @domName PerformanceTiming.navigationStart; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.navigationStart')
   final int navigationStart;
 
-  /// @domName PerformanceTiming.redirectEnd; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.redirectEnd')
   final int redirectEnd;
 
-  /// @domName PerformanceTiming.redirectStart; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.redirectStart')
   final int redirectStart;
 
-  /// @domName PerformanceTiming.requestStart; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.requestStart')
   final int requestStart;
 
-  /// @domName PerformanceTiming.responseEnd; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.responseEnd')
   final int responseEnd;
 
-  /// @domName PerformanceTiming.responseStart; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.responseStart')
   final int responseStart;
 
-  /// @domName PerformanceTiming.secureConnectionStart; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.secureConnectionStart')
   final int secureConnectionStart;
 
-  /// @domName PerformanceTiming.unloadEventEnd; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.unloadEventEnd')
   final int unloadEventEnd;
 
-  /// @domName PerformanceTiming.unloadEventStart; @docsEditable true
+  @DocsEditable @DomName('PerformanceTiming.unloadEventStart')
   final int unloadEventStart;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16468,17 +16471,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitPoint; @docsEditable true
+
+@DocsEditable
+@DomName('WebKitPoint')
 class Point native "*WebKitPoint" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory Point(num x, num y) => Point._create(x, y);
   static Point _create(num x, num y) => JS('Point', 'new WebKitPoint(#,#)', x, y);
 
-  /// @domName WebKitPoint.x; @docsEditable true
+  @DocsEditable @DomName('WebKitPoint.x')
   num x;
 
-  /// @domName WebKitPoint.y; @docsEditable true
+  @DocsEditable @DomName('WebKitPoint.y')
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16486,13 +16491,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PopStateEvent; @docsEditable true
+
+@DocsEditable
+@DomName('PopStateEvent')
 class PopStateEvent extends Event native "*PopStateEvent" {
 
-  /// @domName PopStateEvent.state; @docsEditable true
   dynamic get state => convertNativeToDart_SerializedScriptValue(this._state);
   @JSName('state')
-  @annotation_Creates_SerializedScriptValue @annotation_Returns_SerializedScriptValue
+  @DocsEditable @DomName('PopStateEvent.state') @annotation_Creates_SerializedScriptValue @annotation_Returns_SerializedScriptValue
   final dynamic _state;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16508,7 +16514,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PositionError; @docsEditable true
+
+@DocsEditable
+@DomName('PositionError')
 class PositionError native "*PositionError" {
 
   static const int PERMISSION_DENIED = 1;
@@ -16517,10 +16525,10 @@
 
   static const int TIMEOUT = 3;
 
-  /// @domName PositionError.code; @docsEditable true
+  @DocsEditable @DomName('PositionError.code')
   final int code;
 
-  /// @domName PositionError.message; @docsEditable true
+  @DocsEditable @DomName('PositionError.message')
   final String message;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16536,13 +16544,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLPreElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLPreElement')
 class PreElement extends Element native "*HTMLPreElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory PreElement() => document.$dom_createElement("pre");
 
-  /// @domName HTMLPreElement.wrap; @docsEditable true
+  @DocsEditable @DomName('HTMLPreElement.wrap')
   bool wrap;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16550,16 +16560,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ProcessingInstruction; @docsEditable true
+
+@DocsEditable
+@DomName('ProcessingInstruction')
 class ProcessingInstruction extends Node native "*ProcessingInstruction" {
 
-  /// @domName ProcessingInstruction.data; @docsEditable true
+  @DocsEditable @DomName('ProcessingInstruction.data')
   String data;
 
-  /// @domName ProcessingInstruction.sheet; @docsEditable true
+  @DocsEditable @DomName('ProcessingInstruction.sheet')
   final StyleSheet sheet;
 
-  /// @domName ProcessingInstruction.target; @docsEditable true
+  @DocsEditable @DomName('ProcessingInstruction.target')
   final String target;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16567,30 +16579,32 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLProgressElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLProgressElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
 class ProgressElement extends Element native "*HTMLProgressElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory ProgressElement() => document.$dom_createElement("progress");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('progress');
 
-  /// @domName HTMLProgressElement.labels; @docsEditable true
+  @DocsEditable @DomName('HTMLProgressElement.labels')
   @Returns('NodeList') @Creates('NodeList')
   final List<Node> labels;
 
-  /// @domName HTMLProgressElement.max; @docsEditable true
+  @DocsEditable @DomName('HTMLProgressElement.max')
   num max;
 
-  /// @domName HTMLProgressElement.position; @docsEditable true
+  @DocsEditable @DomName('HTMLProgressElement.position')
   final num position;
 
-  /// @domName HTMLProgressElement.value; @docsEditable true
+  @DocsEditable @DomName('HTMLProgressElement.value')
   num value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16598,16 +16612,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ProgressEvent; @docsEditable true
+
+@DocsEditable
+@DomName('ProgressEvent')
 class ProgressEvent extends Event native "*ProgressEvent" {
 
-  /// @domName ProgressEvent.lengthComputable; @docsEditable true
+  @DocsEditable @DomName('ProgressEvent.lengthComputable')
   final bool lengthComputable;
 
-  /// @domName ProgressEvent.loaded; @docsEditable true
+  @DocsEditable @DomName('ProgressEvent.loaded')
   final int loaded;
 
-  /// @domName ProgressEvent.total; @docsEditable true
+  @DocsEditable @DomName('ProgressEvent.total')
   final int total;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16615,10 +16631,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLQuoteElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLQuoteElement')
 class QuoteElement extends Element native "*HTMLQuoteElement" {
 
-  /// @domName HTMLQuoteElement.cite; @docsEditable true
+  @DocsEditable @DomName('HTMLQuoteElement.cite')
   String cite;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16650,10 +16668,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RadioNodeList; @docsEditable true
+
+@DocsEditable
+@DomName('RadioNodeList')
 class RadioNodeList extends NodeList native "*RadioNodeList" {
 
-  /// @domName RadioNodeList.value; @docsEditable true
+  @DocsEditable @DomName('RadioNodeList.value')
   String value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16663,7 +16683,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Range
+@DocsEditable
+@DomName('Range')
 class Range native "*Range" {
   factory Range() => document.$dom_createRange();
 
@@ -16684,98 +16705,98 @@
 
   static const int START_TO_START = 0;
 
-  /// @domName Range.collapsed; @docsEditable true
+  @DocsEditable @DomName('Range.collapsed')
   final bool collapsed;
 
-  /// @domName Range.commonAncestorContainer; @docsEditable true
+  @DocsEditable @DomName('Range.commonAncestorContainer')
   final Node commonAncestorContainer;
 
-  /// @domName Range.endContainer; @docsEditable true
+  @DocsEditable @DomName('Range.endContainer')
   final Node endContainer;
 
-  /// @domName Range.endOffset; @docsEditable true
+  @DocsEditable @DomName('Range.endOffset')
   final int endOffset;
 
-  /// @domName Range.startContainer; @docsEditable true
+  @DocsEditable @DomName('Range.startContainer')
   final Node startContainer;
 
-  /// @domName Range.startOffset; @docsEditable true
+  @DocsEditable @DomName('Range.startOffset')
   final int startOffset;
 
-  /// @domName Range.cloneContents; @docsEditable true
+  @DocsEditable @DomName('Range.cloneContents')
   DocumentFragment cloneContents() native;
 
-  /// @domName Range.cloneRange; @docsEditable true
+  @DocsEditable @DomName('Range.cloneRange')
   Range cloneRange() native;
 
-  /// @domName Range.collapse; @docsEditable true
+  @DocsEditable @DomName('Range.collapse')
   void collapse(bool toStart) native;
 
-  /// @domName Range.compareNode; @docsEditable true
+  @DocsEditable @DomName('Range.compareNode')
   int compareNode(Node refNode) native;
 
-  /// @domName Range.comparePoint; @docsEditable true
+  @DocsEditable @DomName('Range.comparePoint')
   int comparePoint(Node refNode, int offset) native;
 
-  /// @domName Range.createContextualFragment; @docsEditable true
+  @DocsEditable @DomName('Range.createContextualFragment')
   DocumentFragment createContextualFragment(String html) native;
 
-  /// @domName Range.deleteContents; @docsEditable true
+  @DocsEditable @DomName('Range.deleteContents')
   void deleteContents() native;
 
-  /// @domName Range.detach; @docsEditable true
+  @DocsEditable @DomName('Range.detach')
   void detach() native;
 
-  /// @domName Range.expand; @docsEditable true
+  @DocsEditable @DomName('Range.expand')
   void expand(String unit) native;
 
-  /// @domName Range.extractContents; @docsEditable true
+  @DocsEditable @DomName('Range.extractContents')
   DocumentFragment extractContents() native;
 
-  /// @domName Range.getBoundingClientRect; @docsEditable true
+  @DocsEditable @DomName('Range.getBoundingClientRect')
   ClientRect getBoundingClientRect() native;
 
-  /// @domName Range.getClientRects; @docsEditable true
+  @DocsEditable @DomName('Range.getClientRects')
   @Returns('_ClientRectList') @Creates('_ClientRectList')
   List<ClientRect> getClientRects() native;
 
-  /// @domName Range.insertNode; @docsEditable true
+  @DocsEditable @DomName('Range.insertNode')
   void insertNode(Node newNode) native;
 
-  /// @domName Range.intersectsNode; @docsEditable true
+  @DocsEditable @DomName('Range.intersectsNode')
   bool intersectsNode(Node refNode) native;
 
-  /// @domName Range.isPointInRange; @docsEditable true
+  @DocsEditable @DomName('Range.isPointInRange')
   bool isPointInRange(Node refNode, int offset) native;
 
-  /// @domName Range.selectNode; @docsEditable true
+  @DocsEditable @DomName('Range.selectNode')
   void selectNode(Node refNode) native;
 
-  /// @domName Range.selectNodeContents; @docsEditable true
+  @DocsEditable @DomName('Range.selectNodeContents')
   void selectNodeContents(Node refNode) native;
 
-  /// @domName Range.setEnd; @docsEditable true
+  @DocsEditable @DomName('Range.setEnd')
   void setEnd(Node refNode, int offset) native;
 
-  /// @domName Range.setEndAfter; @docsEditable true
+  @DocsEditable @DomName('Range.setEndAfter')
   void setEndAfter(Node refNode) native;
 
-  /// @domName Range.setEndBefore; @docsEditable true
+  @DocsEditable @DomName('Range.setEndBefore')
   void setEndBefore(Node refNode) native;
 
-  /// @domName Range.setStart; @docsEditable true
+  @DocsEditable @DomName('Range.setStart')
   void setStart(Node refNode, int offset) native;
 
-  /// @domName Range.setStartAfter; @docsEditable true
+  @DocsEditable @DomName('Range.setStartAfter')
   void setStartAfter(Node refNode) native;
 
-  /// @domName Range.setStartBefore; @docsEditable true
+  @DocsEditable @DomName('Range.setStartBefore')
   void setStartBefore(Node refNode) native;
 
-  /// @domName Range.surroundContents; @docsEditable true
+  @DocsEditable @DomName('Range.surroundContents')
   void surroundContents(Node newParent) native;
 
-  /// @domName Range.toString; @docsEditable true
+  @DocsEditable @DomName('Range.toString')
   String toString() native;
 
 }
@@ -16784,23 +16805,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RangeException; @docsEditable true
+
+@DocsEditable
+@DomName('RangeException')
 class RangeException native "*RangeException" {
 
   static const int BAD_BOUNDARYPOINTS_ERR = 1;
 
   static const int INVALID_NODE_TYPE_ERR = 2;
 
-  /// @domName RangeException.code; @docsEditable true
+  @DocsEditable @DomName('RangeException.code')
   final int code;
 
-  /// @domName RangeException.message; @docsEditable true
+  @DocsEditable @DomName('RangeException.message')
   final String message;
 
-  /// @domName RangeException.name; @docsEditable true
+  @DocsEditable @DomName('RangeException.name')
   final String name;
 
-  /// @domName RangeException.toString; @docsEditable true
+  @DocsEditable @DomName('RangeException.toString')
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16808,19 +16831,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Rect; @docsEditable true
+
+@DocsEditable
+@DomName('Rect')
 class Rect native "*Rect" {
 
-  /// @domName Rect.bottom; @docsEditable true
+  @DocsEditable @DomName('Rect.bottom')
   final CssPrimitiveValue bottom;
 
-  /// @domName Rect.left; @docsEditable true
+  @DocsEditable @DomName('Rect.left')
   final CssPrimitiveValue left;
 
-  /// @domName Rect.right; @docsEditable true
+  @DocsEditable @DomName('Rect.right')
   final CssPrimitiveValue right;
 
-  /// @domName Rect.top; @docsEditable true
+  @DocsEditable @DomName('Rect.top')
   final CssPrimitiveValue top;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16836,16 +16861,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RGBColor; @docsEditable true
+
+@DocsEditable
+@DomName('RGBColor')
 class RgbColor native "*RGBColor" {
 
-  /// @domName RGBColor.blue; @docsEditable true
+  @DocsEditable @DomName('RGBColor.blue')
   final CssPrimitiveValue blue;
 
-  /// @domName RGBColor.green; @docsEditable true
+  @DocsEditable @DomName('RGBColor.green')
   final CssPrimitiveValue green;
 
-  /// @domName RGBColor.red; @docsEditable true
+  @DocsEditable @DomName('RGBColor.red')
   final CssPrimitiveValue red;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16853,7 +16880,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCDataChannel; @docsEditable true
+
+@DocsEditable
+@DomName('RTCDataChannel')
 class RtcDataChannel extends EventTarget native "*RTCDataChannel" {
 
   static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
@@ -16864,41 +16893,42 @@
 
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   RtcDataChannelEvents get on =>
     new RtcDataChannelEvents(this);
 
-  /// @domName RTCDataChannel.binaryType; @docsEditable true
+  @DocsEditable @DomName('RTCDataChannel.binaryType')
   String binaryType;
 
-  /// @domName RTCDataChannel.bufferedAmount; @docsEditable true
+  @DocsEditable @DomName('RTCDataChannel.bufferedAmount')
   final int bufferedAmount;
 
-  /// @domName RTCDataChannel.label; @docsEditable true
+  @DocsEditable @DomName('RTCDataChannel.label')
   final String label;
 
-  /// @domName RTCDataChannel.readyState; @docsEditable true
+  @DocsEditable @DomName('RTCDataChannel.readyState')
   final String readyState;
 
-  /// @domName RTCDataChannel.reliable; @docsEditable true
+  @DocsEditable @DomName('RTCDataChannel.reliable')
   final bool reliable;
 
-  /// @domName RTCDataChannel.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('RTCDataChannel.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName RTCDataChannel.close; @docsEditable true
+  @DocsEditable @DomName('RTCDataChannel.close')
   void close() native;
 
-  /// @domName RTCDataChannel.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('RTCDataChannel.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native;
 
-  /// @domName RTCDataChannel.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('RTCDataChannel.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName RTCDataChannel.send; @docsEditable true
+  @DocsEditable @DomName('RTCDataChannel.send')
   void send(data) native;
 
   Stream<Event> get onClose => closeEvent.forTarget(this);
@@ -16910,21 +16940,21 @@
   Stream<Event> get onOpen => openEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class RtcDataChannelEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   RtcDataChannelEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get close => this['close'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get message => this['message'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get open => this['open'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16932,10 +16962,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCDataChannelEvent; @docsEditable true
+
+@DocsEditable
+@DomName('RTCDataChannelEvent')
 class RtcDataChannelEvent extends Event native "*RTCDataChannelEvent" {
 
-  /// @domName RTCDataChannelEvent.channel; @docsEditable true
+  @DocsEditable @DomName('RTCDataChannelEvent.channel')
   final RtcDataChannel channel;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16943,20 +16975,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCIceCandidate; @docsEditable true
+
+@DocsEditable
+@DomName('RTCIceCandidate')
 class RtcIceCandidate native "*RTCIceCandidate" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory RtcIceCandidate(Map dictionary) => RtcIceCandidate._create(dictionary);
   static RtcIceCandidate _create(Map dictionary) => JS('RtcIceCandidate', 'new RTCIceCandidate(#)', dictionary);
 
-  /// @domName RTCIceCandidate.candidate; @docsEditable true
+  @DocsEditable @DomName('RTCIceCandidate.candidate')
   final String candidate;
 
-  /// @domName RTCIceCandidate.sdpMLineIndex; @docsEditable true
+  @DocsEditable @DomName('RTCIceCandidate.sdpMLineIndex')
   final int sdpMLineIndex;
 
-  /// @domName RTCIceCandidate.sdpMid; @docsEditable true
+  @DocsEditable @DomName('RTCIceCandidate.sdpMid')
   final String sdpMid;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16964,10 +16998,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCIceCandidateEvent; @docsEditable true
+
+@DocsEditable
+@DomName('RTCIceCandidateEvent')
 class RtcIceCandidateEvent extends Event native "*RTCIceCandidateEvent" {
 
-  /// @domName RTCIceCandidateEvent.candidate; @docsEditable true
+  @DocsEditable @DomName('RTCIceCandidateEvent.candidate')
   final RtcIceCandidate candidate;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16975,7 +17011,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCPeerConnection; @docsEditable true
+
+@DocsEditable
+@DomName('RTCPeerConnection')
 class RtcPeerConnection extends EventTarget native "*RTCPeerConnection" {
 
   static const EventStreamProvider<MediaStreamEvent> addStreamEvent = const EventStreamProvider<MediaStreamEvent>('addstream');
@@ -16994,7 +17032,7 @@
 
   static const EventStreamProvider<Event> stateChangeEvent = const EventStreamProvider<Event>('statechange');
 
-  ///@docsEditable true
+  @DocsEditable
   factory RtcPeerConnection(Map rtcIceServers, [Map mediaConstraints]) {
     if (!?mediaConstraints) {
       return RtcPeerConnection._create(rtcIceServers);
@@ -17008,41 +17046,41 @@
     return JS('RtcPeerConnection', 'new RTCPeerConnection(#,#)', rtcIceServers, mediaConstraints);
   }
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   RtcPeerConnectionEvents get on =>
     new RtcPeerConnectionEvents(this);
 
-  /// @domName RTCPeerConnection.iceGatheringState; @docsEditable true
+  @DocsEditable @DomName('RTCPeerConnection.iceGatheringState')
   final String iceGatheringState;
 
-  /// @domName RTCPeerConnection.iceState; @docsEditable true
+  @DocsEditable @DomName('RTCPeerConnection.iceState')
   final String iceState;
 
-  /// @domName RTCPeerConnection.localDescription; @docsEditable true
+  @DocsEditable @DomName('RTCPeerConnection.localDescription')
   final RtcSessionDescription localDescription;
 
-  /// @domName RTCPeerConnection.localStreams; @docsEditable true
+  @DocsEditable @DomName('RTCPeerConnection.localStreams')
   @Returns('_MediaStreamList') @Creates('_MediaStreamList')
   final List<MediaStream> localStreams;
 
-  /// @domName RTCPeerConnection.readyState; @docsEditable true
+  @DocsEditable @DomName('RTCPeerConnection.readyState')
   final String readyState;
 
-  /// @domName RTCPeerConnection.remoteDescription; @docsEditable true
+  @DocsEditable @DomName('RTCPeerConnection.remoteDescription')
   final RtcSessionDescription remoteDescription;
 
-  /// @domName RTCPeerConnection.remoteStreams; @docsEditable true
+  @DocsEditable @DomName('RTCPeerConnection.remoteStreams')
   @Returns('_MediaStreamList') @Creates('_MediaStreamList')
   final List<MediaStream> remoteStreams;
 
-  /// @domName RTCPeerConnection.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('RTCPeerConnection.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName RTCPeerConnection.addIceCandidate; @docsEditable true
+  @DocsEditable @DomName('RTCPeerConnection.addIceCandidate')
   void addIceCandidate(RtcIceCandidate candidate) native;
 
-  /// @domName RTCPeerConnection.addStream; @docsEditable true
   void addStream(MediaStream stream, [Map mediaConstraints]) {
     if (?mediaConstraints) {
       var mediaConstraints_1 = convertDartToNative_Dictionary(mediaConstraints);
@@ -17053,14 +17091,15 @@
     return;
   }
   @JSName('addStream')
+  @DocsEditable @DomName('RTCPeerConnection.addStream')
   void _addStream_1(MediaStream stream, mediaConstraints) native;
   @JSName('addStream')
+  @DocsEditable @DomName('RTCPeerConnection.addStream')
   void _addStream_2(MediaStream stream) native;
 
-  /// @domName RTCPeerConnection.close; @docsEditable true
+  @DocsEditable @DomName('RTCPeerConnection.close')
   void close() native;
 
-  /// @domName RTCPeerConnection.createAnswer; @docsEditable true
   void createAnswer(RtcSessionDescriptionCallback successCallback, [RtcErrorCallback failureCallback, Map mediaConstraints]) {
     if (?mediaConstraints) {
       var mediaConstraints_1 = convertDartToNative_Dictionary(mediaConstraints);
@@ -17071,11 +17110,12 @@
     return;
   }
   @JSName('createAnswer')
+  @DocsEditable @DomName('RTCPeerConnection.createAnswer')
   void _createAnswer_1(RtcSessionDescriptionCallback successCallback, RtcErrorCallback failureCallback, mediaConstraints) native;
   @JSName('createAnswer')
+  @DocsEditable @DomName('RTCPeerConnection.createAnswer')
   void _createAnswer_2(RtcSessionDescriptionCallback successCallback, RtcErrorCallback failureCallback) native;
 
-  /// @domName RTCPeerConnection.createDataChannel; @docsEditable true
   RtcDataChannel createDataChannel(String label, [Map options]) {
     if (?options) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -17084,11 +17124,12 @@
     return _createDataChannel_2(label);
   }
   @JSName('createDataChannel')
+  @DocsEditable @DomName('RTCPeerConnection.createDataChannel')
   RtcDataChannel _createDataChannel_1(label, options) native;
   @JSName('createDataChannel')
+  @DocsEditable @DomName('RTCPeerConnection.createDataChannel')
   RtcDataChannel _createDataChannel_2(label) native;
 
-  /// @domName RTCPeerConnection.createOffer; @docsEditable true
   void createOffer(RtcSessionDescriptionCallback successCallback, [RtcErrorCallback failureCallback, Map mediaConstraints]) {
     if (?mediaConstraints) {
       var mediaConstraints_1 = convertDartToNative_Dictionary(mediaConstraints);
@@ -17099,31 +17140,32 @@
     return;
   }
   @JSName('createOffer')
+  @DocsEditable @DomName('RTCPeerConnection.createOffer')
   void _createOffer_1(RtcSessionDescriptionCallback successCallback, RtcErrorCallback failureCallback, mediaConstraints) native;
   @JSName('createOffer')
+  @DocsEditable @DomName('RTCPeerConnection.createOffer')
   void _createOffer_2(RtcSessionDescriptionCallback successCallback, RtcErrorCallback failureCallback) native;
 
-  /// @domName RTCPeerConnection.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('RTCPeerConnection.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native;
 
-  /// @domName RTCPeerConnection.getStats; @docsEditable true
+  @DocsEditable @DomName('RTCPeerConnection.getStats')
   void getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) native;
 
-  /// @domName RTCPeerConnection.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('RTCPeerConnection.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName RTCPeerConnection.removeStream; @docsEditable true
+  @DocsEditable @DomName('RTCPeerConnection.removeStream')
   void removeStream(MediaStream stream) native;
 
-  /// @domName RTCPeerConnection.setLocalDescription; @docsEditable true
+  @DocsEditable @DomName('RTCPeerConnection.setLocalDescription')
   void setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, RtcErrorCallback failureCallback]) native;
 
-  /// @domName RTCPeerConnection.setRemoteDescription; @docsEditable true
+  @DocsEditable @DomName('RTCPeerConnection.setRemoteDescription')
   void setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, RtcErrorCallback failureCallback]) native;
 
-  /// @domName RTCPeerConnection.updateIce; @docsEditable true
   void updateIce([Map configuration, Map mediaConstraints]) {
     if (?mediaConstraints) {
       var configuration_1 = convertDartToNative_Dictionary(configuration);
@@ -17140,10 +17182,13 @@
     return;
   }
   @JSName('updateIce')
+  @DocsEditable @DomName('RTCPeerConnection.updateIce')
   void _updateIce_1(configuration, mediaConstraints) native;
   @JSName('updateIce')
+  @DocsEditable @DomName('RTCPeerConnection.updateIce')
   void _updateIce_2(configuration) native;
   @JSName('updateIce')
+  @DocsEditable @DomName('RTCPeerConnection.updateIce')
   void _updateIce_3() native;
 
   Stream<MediaStreamEvent> get onAddStream => addStreamEvent.forTarget(this);
@@ -17163,30 +17208,30 @@
   Stream<Event> get onStateChange => stateChangeEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class RtcPeerConnectionEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   RtcPeerConnectionEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get addStream => this['addstream'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get iceCandidate => this['icecandidate'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get iceChange => this['icechange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get negotiationNeeded => this['negotiationneeded'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get open => this['open'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get removeStream => this['removestream'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get stateChange => this['statechange'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17194,17 +17239,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCSessionDescription; @docsEditable true
+
+@DocsEditable
+@DomName('RTCSessionDescription')
 class RtcSessionDescription native "*RTCSessionDescription" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory RtcSessionDescription(Map dictionary) => RtcSessionDescription._create(dictionary);
   static RtcSessionDescription _create(Map dictionary) => JS('RtcSessionDescription', 'new RTCSessionDescription(#)', dictionary);
 
-  /// @domName RTCSessionDescription.sdp; @docsEditable true
+  @DocsEditable @DomName('RTCSessionDescription.sdp')
   String sdp;
 
-  /// @domName RTCSessionDescription.type; @docsEditable true
+  @DocsEditable @DomName('RTCSessionDescription.type')
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17212,16 +17259,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCStatsElement; @docsEditable true
+
+@DocsEditable
+@DomName('RTCStatsElement')
 class RtcStatsElement native "*RTCStatsElement" {
 
-  /// @domName RTCStatsElement.timestamp; @docsEditable true
+  @DocsEditable @DomName('RTCStatsElement.timestamp')
   final Date timestamp;
 
-  /// @domName RTCStatsElement.names; @docsEditable true
+  @DocsEditable @DomName('RTCStatsElement.names')
   List<String> names() native;
 
-  /// @domName RTCStatsElement.stat; @docsEditable true
+  @DocsEditable @DomName('RTCStatsElement.stat')
   String stat(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17229,13 +17278,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCStatsReport; @docsEditable true
+
+@DocsEditable
+@DomName('RTCStatsReport')
 class RtcStatsReport native "*RTCStatsReport" {
 
-  /// @domName RTCStatsReport.local; @docsEditable true
+  @DocsEditable @DomName('RTCStatsReport.local')
   final RtcStatsElement local;
 
-  /// @domName RTCStatsReport.remote; @docsEditable true
+  @DocsEditable @DomName('RTCStatsReport.remote')
   final RtcStatsElement remote;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17243,10 +17294,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCStatsResponse; @docsEditable true
+
+@DocsEditable
+@DomName('RTCStatsResponse')
 class RtcStatsResponse native "*RTCStatsResponse" {
 
-  /// @domName RTCStatsResponse.result; @docsEditable true
+  @DocsEditable @DomName('RTCStatsResponse.result')
   List<RtcStatsReport> result() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17294,31 +17347,33 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Screen; @docsEditable true
+
+@DocsEditable
+@DomName('Screen')
 class Screen native "*Screen" {
 
-  /// @domName Screen.availHeight; @docsEditable true
+  @DocsEditable @DomName('Screen.availHeight')
   final int availHeight;
 
-  /// @domName Screen.availLeft; @docsEditable true
+  @DocsEditable @DomName('Screen.availLeft')
   final int availLeft;
 
-  /// @domName Screen.availTop; @docsEditable true
+  @DocsEditable @DomName('Screen.availTop')
   final int availTop;
 
-  /// @domName Screen.availWidth; @docsEditable true
+  @DocsEditable @DomName('Screen.availWidth')
   final int availWidth;
 
-  /// @domName Screen.colorDepth; @docsEditable true
+  @DocsEditable @DomName('Screen.colorDepth')
   final int colorDepth;
 
-  /// @domName Screen.height; @docsEditable true
+  @DocsEditable @DomName('Screen.height')
   final int height;
 
-  /// @domName Screen.pixelDepth; @docsEditable true
+  @DocsEditable @DomName('Screen.pixelDepth')
   final int pixelDepth;
 
-  /// @domName Screen.width; @docsEditable true
+  @DocsEditable @DomName('Screen.width')
   final int width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17326,34 +17381,36 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLScriptElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLScriptElement')
 class ScriptElement extends Element native "*HTMLScriptElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory ScriptElement() => document.$dom_createElement("script");
 
-  /// @domName HTMLScriptElement.async; @docsEditable true
+  @DocsEditable @DomName('HTMLScriptElement.async')
   bool async;
 
-  /// @domName HTMLScriptElement.charset; @docsEditable true
+  @DocsEditable @DomName('HTMLScriptElement.charset')
   String charset;
 
-  /// @domName HTMLScriptElement.crossOrigin; @docsEditable true
+  @DocsEditable @DomName('HTMLScriptElement.crossOrigin')
   String crossOrigin;
 
-  /// @domName HTMLScriptElement.defer; @docsEditable true
+  @DocsEditable @DomName('HTMLScriptElement.defer')
   bool defer;
 
-  /// @domName HTMLScriptElement.event; @docsEditable true
+  @DocsEditable @DomName('HTMLScriptElement.event')
   String event;
 
-  /// @domName HTMLScriptElement.htmlFor; @docsEditable true
+  @DocsEditable @DomName('HTMLScriptElement.htmlFor')
   String htmlFor;
 
-  /// @domName HTMLScriptElement.src; @docsEditable true
+  @DocsEditable @DomName('HTMLScriptElement.src')
   String src;
 
-  /// @domName HTMLScriptElement.type; @docsEditable true
+  @DocsEditable @DomName('HTMLScriptElement.type')
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17361,16 +17418,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ScriptProfile; @docsEditable true
+
+@DocsEditable
+@DomName('ScriptProfile')
 class ScriptProfile native "*ScriptProfile" {
 
-  /// @domName ScriptProfile.head; @docsEditable true
+  @DocsEditable @DomName('ScriptProfile.head')
   final ScriptProfileNode head;
 
-  /// @domName ScriptProfile.title; @docsEditable true
+  @DocsEditable @DomName('ScriptProfile.idleTime')
+  final num idleTime;
+
+  @DocsEditable @DomName('ScriptProfile.title')
   final String title;
 
-  /// @domName ScriptProfile.uid; @docsEditable true
+  @DocsEditable @DomName('ScriptProfile.uid')
   final int uid;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17378,35 +17440,37 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ScriptProfileNode; @docsEditable true
+
+@DocsEditable
+@DomName('ScriptProfileNode')
 class ScriptProfileNode native "*ScriptProfileNode" {
 
-  /// @domName ScriptProfileNode.callUID; @docsEditable true
   @JSName('callUID')
+  @DocsEditable @DomName('ScriptProfileNode.callUID')
   final int callUid;
 
-  /// @domName ScriptProfileNode.functionName; @docsEditable true
+  @DocsEditable @DomName('ScriptProfileNode.functionName')
   final String functionName;
 
-  /// @domName ScriptProfileNode.lineNumber; @docsEditable true
+  @DocsEditable @DomName('ScriptProfileNode.lineNumber')
   final int lineNumber;
 
-  /// @domName ScriptProfileNode.numberOfCalls; @docsEditable true
+  @DocsEditable @DomName('ScriptProfileNode.numberOfCalls')
   final int numberOfCalls;
 
-  /// @domName ScriptProfileNode.selfTime; @docsEditable true
+  @DocsEditable @DomName('ScriptProfileNode.selfTime')
   final num selfTime;
 
-  /// @domName ScriptProfileNode.totalTime; @docsEditable true
+  @DocsEditable @DomName('ScriptProfileNode.totalTime')
   final num totalTime;
 
-  /// @domName ScriptProfileNode.url; @docsEditable true
+  @DocsEditable @DomName('ScriptProfileNode.url')
   final String url;
 
-  /// @domName ScriptProfileNode.visible; @docsEditable true
+  @DocsEditable @DomName('ScriptProfileNode.visible')
   final bool visible;
 
-  /// @domName ScriptProfileNode.children; @docsEditable true
+  @DocsEditable @DomName('ScriptProfileNode.children')
   List<ScriptProfileNode> children() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17414,68 +17478,69 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLSelectElement
+@DocsEditable
+@DomName('HTMLSelectElement')
 class SelectElement extends Element native "*HTMLSelectElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory SelectElement() => document.$dom_createElement("select");
 
-  /// @domName HTMLSelectElement.autofocus; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.autofocus')
   bool autofocus;
 
-  /// @domName HTMLSelectElement.disabled; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.disabled')
   bool disabled;
 
-  /// @domName HTMLSelectElement.form; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.form')
   final FormElement form;
 
-  /// @domName HTMLSelectElement.labels; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.labels')
   @Returns('NodeList') @Creates('NodeList')
   final List<Node> labels;
 
-  /// @domName HTMLSelectElement.length; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.length')
   int length;
 
-  /// @domName HTMLSelectElement.multiple; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.multiple')
   bool multiple;
 
-  /// @domName HTMLSelectElement.name; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.name')
   String name;
 
-  /// @domName HTMLSelectElement.required; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.required')
   bool required;
 
-  /// @domName HTMLSelectElement.selectedIndex; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.selectedIndex')
   int selectedIndex;
 
-  /// @domName HTMLSelectElement.size; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.size')
   int size;
 
-  /// @domName HTMLSelectElement.type; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.type')
   final String type;
 
-  /// @domName HTMLSelectElement.validationMessage; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.validationMessage')
   final String validationMessage;
 
-  /// @domName HTMLSelectElement.validity; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.validity')
   final ValidityState validity;
 
-  /// @domName HTMLSelectElement.value; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.value')
   String value;
 
-  /// @domName HTMLSelectElement.willValidate; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.willValidate')
   final bool willValidate;
 
-  /// @domName HTMLSelectElement.checkValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.checkValidity')
   bool checkValidity() native;
 
-  /// @domName HTMLSelectElement.item; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.item')
   Node item(int index) native;
 
-  /// @domName HTMLSelectElement.namedItem; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.namedItem')
   Node namedItem(String name) native;
 
-  /// @domName HTMLSelectElement.setCustomValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLSelectElement.setCustomValidity')
   void setCustomValidity(String error) native;
 
 
@@ -17501,7 +17566,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLShadowElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLShadowElement')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental()
 class ShadowElement extends Element native "*HTMLShadowElement" {
@@ -17509,10 +17576,10 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('shadow');
 
-  /// @domName HTMLShadowElement.olderShadowRoot; @docsEditable true
+  @DocsEditable @DomName('HTMLShadowElement.olderShadowRoot')
   final ShadowRoot olderShadowRoot;
 
-  /// @domName HTMLShadowElement.resetStyleInheritance; @docsEditable true
+  @DocsEditable @DomName('HTMLShadowElement.resetStyleInheritance')
   bool resetStyleInheritance;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17522,43 +17589,47 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ShadowRoot
+@DocsEditable
+@DomName('ShadowRoot')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental()
 class ShadowRoot extends DocumentFragment native "*ShadowRoot" {
 
-  /// @domName ShadowRoot.activeElement; @docsEditable true
+  @DocsEditable @DomName('ShadowRoot.activeElement')
   final Element activeElement;
 
-  /// @domName ShadowRoot.applyAuthorStyles; @docsEditable true
+  @DocsEditable @DomName('ShadowRoot.applyAuthorStyles')
   bool applyAuthorStyles;
 
-  /// @domName ShadowRoot.innerHTML; @docsEditable true
   @JSName('innerHTML')
+  @DocsEditable @DomName('ShadowRoot.innerHTML')
   String innerHtml;
 
-  /// @domName ShadowRoot.resetStyleInheritance; @docsEditable true
+  @DocsEditable @DomName('ShadowRoot.resetStyleInheritance')
   bool resetStyleInheritance;
 
-  /// @domName ShadowRoot.cloneNode; @docsEditable true
   @JSName('cloneNode')
+  @DocsEditable @DomName('ShadowRoot.cloneNode')
   Node clone(bool deep) native;
 
-  /// @domName ShadowRoot.getElementById; @docsEditable true
+  @DocsEditable @DomName('ShadowRoot.elementFromPoint')
+  Element elementFromPoint(int x, int y) native;
+
   @JSName('getElementById')
+  @DocsEditable @DomName('ShadowRoot.getElementById')
   Element $dom_getElementById(String elementId) native;
 
-  /// @domName ShadowRoot.getElementsByClassName; @docsEditable true
   @JSName('getElementsByClassName')
+  @DocsEditable @DomName('ShadowRoot.getElementsByClassName')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> $dom_getElementsByClassName(String className) native;
 
-  /// @domName ShadowRoot.getElementsByTagName; @docsEditable true
   @JSName('getElementsByTagName')
+  @DocsEditable @DomName('ShadowRoot.getElementsByTagName')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> $dom_getElementsByTagName(String tagName) native;
 
-  /// @domName ShadowRoot.getSelection; @docsEditable true
+  @DocsEditable @DomName('ShadowRoot.getSelection')
   DomSelection getSelection() native;
 
   static bool get supported =>
@@ -17569,10 +17640,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SharedWorker; @docsEditable true
+
+@DocsEditable
+@DomName('SharedWorker')
 class SharedWorker extends AbstractWorker native "*SharedWorker" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory SharedWorker(String scriptURL, [String name]) {
     if (!?name) {
       return SharedWorker._create(scriptURL);
@@ -17586,7 +17659,7 @@
     return JS('SharedWorker', 'new SharedWorker(#,#)', scriptURL, name);
   }
 
-  /// @domName SharedWorker.port; @docsEditable true
+  @DocsEditable @DomName('SharedWorker.port')
   final MessagePort port;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17594,27 +17667,30 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SharedWorkerContext; @docsEditable true
+
+@DocsEditable
+@DomName('SharedWorkerContext')
 class SharedWorkerContext extends WorkerContext native "*SharedWorkerContext" {
 
   static const EventStreamProvider<Event> connectEvent = const EventStreamProvider<Event>('connect');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   SharedWorkerContextEvents get on =>
     new SharedWorkerContextEvents(this);
 
-  /// @domName SharedWorkerContext.name; @docsEditable true
+  @DocsEditable @DomName('SharedWorkerContext.name')
   final String name;
 
   Stream<Event> get onConnect => connectEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class SharedWorkerContextEvents extends WorkerContextEvents {
-  /// @docsEditable true
+  @DocsEditable
   SharedWorkerContextEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get connect => this['connect'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17622,19 +17698,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SourceBuffer; @docsEditable true
+
+@DocsEditable
+@DomName('SourceBuffer')
 class SourceBuffer native "*SourceBuffer" {
 
-  /// @domName SourceBuffer.buffered; @docsEditable true
+  @DocsEditable @DomName('SourceBuffer.buffered')
   final TimeRanges buffered;
 
-  /// @domName SourceBuffer.timestampOffset; @docsEditable true
+  @DocsEditable @DomName('SourceBuffer.timestampOffset')
   num timestampOffset;
 
-  /// @domName SourceBuffer.abort; @docsEditable true
+  @DocsEditable @DomName('SourceBuffer.abort')
   void abort() native;
 
-  /// @domName SourceBuffer.append; @docsEditable true
+  @DocsEditable @DomName('SourceBuffer.append')
   void append(Uint8Array data) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17642,10 +17720,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SourceBufferList; @docsEditable true
+
+@DocsEditable
+@DomName('SourceBufferList')
 class SourceBufferList extends EventTarget implements JavaScriptIndexingBehavior, List<SourceBuffer> native "*SourceBufferList" {
 
-  /// @domName SourceBufferList.length; @docsEditable true
+  @DocsEditable @DomName('SourceBufferList.length')
   int get length => JS("int", "#.length", this);
 
   SourceBuffer operator[](int index) => JS("SourceBuffer", "#[#]", this, index);
@@ -17666,50 +17746,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SourceBuffer)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(SourceBuffer element) => Collections.contains(this, element);
+  bool contains(SourceBuffer element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(SourceBuffer element)) => Collections.forEach(this, f);
+  void forEach(void f(SourceBuffer element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(SourceBuffer element)) => new MappedList<SourceBuffer, dynamic>(this, f);
+  List mappedBy(f(SourceBuffer element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<SourceBuffer> where(bool f(SourceBuffer element)) => new WhereIterable<SourceBuffer>(this, f);
+  Iterable<SourceBuffer> where(bool f(SourceBuffer element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(SourceBuffer element)) => Collections.every(this, f);
+  bool every(bool f(SourceBuffer element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(SourceBuffer element)) => Collections.any(this, f);
+  bool any(bool f(SourceBuffer element)) => IterableMixinWorkaround.any(this, f);
 
   List<SourceBuffer> toList() => new List<SourceBuffer>.from(this);
   Set<SourceBuffer> toSet() => new Set<SourceBuffer>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<SourceBuffer> take(int n) => new ListView<SourceBuffer>(this, 0, n);
+  List<SourceBuffer> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<SourceBuffer> takeWhile(bool test(SourceBuffer value)) {
-    return new TakeWhileIterable<SourceBuffer>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<SourceBuffer> skip(int n) => new ListView<SourceBuffer>(this, n, null);
+  List<SourceBuffer> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<SourceBuffer> skipWhile(bool test(SourceBuffer value)) {
-    return new SkipWhileIterable<SourceBuffer>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   SourceBuffer firstMatching(bool test(SourceBuffer value), { SourceBuffer orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   SourceBuffer lastMatching(bool test(SourceBuffer value), {SourceBuffer orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   SourceBuffer singleMatching(bool test(SourceBuffer value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   SourceBuffer elementAt(int index) {
@@ -17767,16 +17847,36 @@
     throw new StateError("More than one element");
   }
 
-  SourceBuffer min([int compare(SourceBuffer a, SourceBuffer b)]) => Collections.min(this, compare);
+  SourceBuffer min([int compare(SourceBuffer a, SourceBuffer b)]) => IterableMixinWorkaround.min(this, compare);
 
-  SourceBuffer max([int compare(SourceBuffer a, SourceBuffer b)]) => Collections.max(this, compare);
+  SourceBuffer max([int compare(SourceBuffer a, SourceBuffer b)]) => IterableMixinWorkaround.max(this, compare);
 
   SourceBuffer removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   SourceBuffer removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(SourceBuffer element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(SourceBuffer element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<SourceBuffer> from, [int startFrom]) {
@@ -17796,19 +17896,19 @@
 
   // -- end List<SourceBuffer> mixins.
 
-  /// @domName SourceBufferList.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('SourceBufferList.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName SourceBufferList.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('SourceBufferList.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native;
 
-  /// @domName SourceBufferList.item; @docsEditable true
+  @DocsEditable @DomName('SourceBufferList.item')
   SourceBuffer item(int index) native;
 
-  /// @domName SourceBufferList.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('SourceBufferList.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17816,19 +17916,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLSourceElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLSourceElement')
 class SourceElement extends Element native "*HTMLSourceElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory SourceElement() => document.$dom_createElement("source");
 
-  /// @domName HTMLSourceElement.media; @docsEditable true
+  @DocsEditable @DomName('HTMLSourceElement.media')
   String media;
 
-  /// @domName HTMLSourceElement.src; @docsEditable true
+  @DocsEditable @DomName('HTMLSourceElement.src')
   String src;
 
-  /// @domName HTMLSourceElement.type; @docsEditable true
+  @DocsEditable @DomName('HTMLSourceElement.type')
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17836,10 +17938,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLSpanElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLSpanElement')
 class SpanElement extends Element native "*HTMLSpanElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory SpanElement() => document.$dom_createElement("span");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17847,17 +17951,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechGrammar; @docsEditable true
+
+@DocsEditable
+@DomName('SpeechGrammar')
 class SpeechGrammar native "*SpeechGrammar" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory SpeechGrammar() => SpeechGrammar._create();
   static SpeechGrammar _create() => JS('SpeechGrammar', 'new SpeechGrammar()');
 
-  /// @domName SpeechGrammar.src; @docsEditable true
+  @DocsEditable @DomName('SpeechGrammar.src')
   String src;
 
-  /// @domName SpeechGrammar.weight; @docsEditable true
+  @DocsEditable @DomName('SpeechGrammar.weight')
   num weight;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17865,14 +17971,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechGrammarList; @docsEditable true
+
+@DocsEditable
+@DomName('SpeechGrammarList')
 class SpeechGrammarList implements JavaScriptIndexingBehavior, List<SpeechGrammar> native "*SpeechGrammarList" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory SpeechGrammarList() => SpeechGrammarList._create();
   static SpeechGrammarList _create() => JS('SpeechGrammarList', 'new SpeechGrammarList()');
 
-  /// @domName SpeechGrammarList.length; @docsEditable true
+  @DocsEditable @DomName('SpeechGrammarList.length')
   int get length => JS("int", "#.length", this);
 
   SpeechGrammar operator[](int index) => JS("SpeechGrammar", "#[#]", this, index);
@@ -17893,50 +18001,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechGrammar)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(SpeechGrammar element) => Collections.contains(this, element);
+  bool contains(SpeechGrammar element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(SpeechGrammar element)) => Collections.forEach(this, f);
+  void forEach(void f(SpeechGrammar element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(SpeechGrammar element)) => new MappedList<SpeechGrammar, dynamic>(this, f);
+  List mappedBy(f(SpeechGrammar element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<SpeechGrammar> where(bool f(SpeechGrammar element)) => new WhereIterable<SpeechGrammar>(this, f);
+  Iterable<SpeechGrammar> where(bool f(SpeechGrammar element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(SpeechGrammar element)) => Collections.every(this, f);
+  bool every(bool f(SpeechGrammar element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(SpeechGrammar element)) => Collections.any(this, f);
+  bool any(bool f(SpeechGrammar element)) => IterableMixinWorkaround.any(this, f);
 
   List<SpeechGrammar> toList() => new List<SpeechGrammar>.from(this);
   Set<SpeechGrammar> toSet() => new Set<SpeechGrammar>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<SpeechGrammar> take(int n) => new ListView<SpeechGrammar>(this, 0, n);
+  List<SpeechGrammar> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<SpeechGrammar> takeWhile(bool test(SpeechGrammar value)) {
-    return new TakeWhileIterable<SpeechGrammar>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<SpeechGrammar> skip(int n) => new ListView<SpeechGrammar>(this, n, null);
+  List<SpeechGrammar> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<SpeechGrammar> skipWhile(bool test(SpeechGrammar value)) {
-    return new SkipWhileIterable<SpeechGrammar>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   SpeechGrammar firstMatching(bool test(SpeechGrammar value), { SpeechGrammar orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   SpeechGrammar lastMatching(bool test(SpeechGrammar value), {SpeechGrammar orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   SpeechGrammar singleMatching(bool test(SpeechGrammar value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   SpeechGrammar elementAt(int index) {
@@ -17994,16 +18102,36 @@
     throw new StateError("More than one element");
   }
 
-  SpeechGrammar min([int compare(SpeechGrammar a, SpeechGrammar b)]) => Collections.min(this, compare);
+  SpeechGrammar min([int compare(SpeechGrammar a, SpeechGrammar b)]) => IterableMixinWorkaround.min(this, compare);
 
-  SpeechGrammar max([int compare(SpeechGrammar a, SpeechGrammar b)]) => Collections.max(this, compare);
+  SpeechGrammar max([int compare(SpeechGrammar a, SpeechGrammar b)]) => IterableMixinWorkaround.max(this, compare);
 
   SpeechGrammar removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   SpeechGrammar removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(SpeechGrammar element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(SpeechGrammar element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<SpeechGrammar> from, [int startFrom]) {
@@ -18023,13 +18151,13 @@
 
   // -- end List<SpeechGrammar> mixins.
 
-  /// @domName SpeechGrammarList.addFromString; @docsEditable true
+  @DocsEditable @DomName('SpeechGrammarList.addFromString')
   void addFromString(String string, [num weight]) native;
 
-  /// @domName SpeechGrammarList.addFromUri; @docsEditable true
+  @DocsEditable @DomName('SpeechGrammarList.addFromUri')
   void addFromUri(String src, [num weight]) native;
 
-  /// @domName SpeechGrammarList.item; @docsEditable true
+  @DocsEditable @DomName('SpeechGrammarList.item')
   SpeechGrammar item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18037,10 +18165,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechInputEvent; @docsEditable true
+
+@DocsEditable
+@DomName('SpeechInputEvent')
 class SpeechInputEvent extends Event native "*SpeechInputEvent" {
 
-  /// @domName SpeechInputEvent.results; @docsEditable true
+  @DocsEditable @DomName('SpeechInputEvent.results')
   @Returns('_SpeechInputResultList') @Creates('_SpeechInputResultList')
   final List<SpeechInputResult> results;
 }
@@ -18049,13 +18179,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechInputResult; @docsEditable true
+
+@DocsEditable
+@DomName('SpeechInputResult')
 class SpeechInputResult native "*SpeechInputResult" {
 
-  /// @domName SpeechInputResult.confidence; @docsEditable true
+  @DocsEditable @DomName('SpeechInputResult.confidence')
   final num confidence;
 
-  /// @domName SpeechInputResult.utterance; @docsEditable true
+  @DocsEditable @DomName('SpeechInputResult.utterance')
   final String utterance;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18063,7 +18195,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechRecognition; @docsEditable true
+
+@DocsEditable
+@DomName('SpeechRecognition')
 class SpeechRecognition extends EventTarget native "*SpeechRecognition" {
 
   static const EventStreamProvider<Event> audioEndEvent = const EventStreamProvider<Event>('audioend');
@@ -18088,48 +18222,49 @@
 
   static const EventStreamProvider<Event> startEvent = const EventStreamProvider<Event>('start');
 
-  ///@docsEditable true
+  @DocsEditable
   factory SpeechRecognition() => SpeechRecognition._create();
   static SpeechRecognition _create() => JS('SpeechRecognition', 'new SpeechRecognition()');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   SpeechRecognitionEvents get on =>
     new SpeechRecognitionEvents(this);
 
-  /// @domName SpeechRecognition.continuous; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognition.continuous')
   bool continuous;
 
-  /// @domName SpeechRecognition.grammars; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognition.grammars')
   SpeechGrammarList grammars;
 
-  /// @domName SpeechRecognition.interimResults; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognition.interimResults')
   bool interimResults;
 
-  /// @domName SpeechRecognition.lang; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognition.lang')
   String lang;
 
-  /// @domName SpeechRecognition.maxAlternatives; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognition.maxAlternatives')
   int maxAlternatives;
 
-  /// @domName SpeechRecognition.abort; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognition.abort')
   void abort() native;
 
-  /// @domName SpeechRecognition.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('SpeechRecognition.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName SpeechRecognition.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('SpeechRecognition.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName SpeechRecognition.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('SpeechRecognition.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName SpeechRecognition.start; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognition.start')
   void start() native;
 
-  /// @domName SpeechRecognition.stop; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognition.stop')
   void stop() native;
 
   Stream<Event> get onAudioEnd => audioEndEvent.forTarget(this);
@@ -18155,42 +18290,42 @@
   Stream<Event> get onStart => startEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class SpeechRecognitionEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   SpeechRecognitionEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get audioEnd => this['audioend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get audioStart => this['audiostart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get end => this['end'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get noMatch => this['nomatch'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get result => this['result'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get soundEnd => this['soundend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get soundStart => this['soundstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get speechEnd => this['speechend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get speechStart => this['speechstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get start => this['start'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18198,13 +18333,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechRecognitionAlternative; @docsEditable true
+
+@DocsEditable
+@DomName('SpeechRecognitionAlternative')
 class SpeechRecognitionAlternative native "*SpeechRecognitionAlternative" {
 
-  /// @domName SpeechRecognitionAlternative.confidence; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognitionAlternative.confidence')
   final num confidence;
 
-  /// @domName SpeechRecognitionAlternative.transcript; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognitionAlternative.transcript')
   final String transcript;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18212,13 +18349,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechRecognitionError; @docsEditable true
+
+@DocsEditable
+@DomName('SpeechRecognitionError')
 class SpeechRecognitionError extends Event native "*SpeechRecognitionError" {
 
-  /// @domName SpeechRecognitionError.error; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognitionError.error')
   final String error;
 
-  /// @domName SpeechRecognitionError.message; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognitionError.message')
   final String message;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18226,20 +18365,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechRecognitionEvent; @docsEditable true
+
+@DocsEditable
+@DomName('SpeechRecognitionEvent')
 class SpeechRecognitionEvent extends Event native "*SpeechRecognitionEvent" {
 
-  /// @domName SpeechRecognitionEvent.result; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognitionEvent.result')
   final SpeechRecognitionResult result;
 
-  /// @domName SpeechRecognitionEvent.resultHistory; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognitionEvent.resultHistory')
   @Returns('_SpeechRecognitionResultList') @Creates('_SpeechRecognitionResultList')
   final List<SpeechRecognitionResult> resultHistory;
 
-  /// @domName SpeechRecognitionEvent.resultIndex; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognitionEvent.resultIndex')
   final int resultIndex;
 
-  /// @domName SpeechRecognitionEvent.results; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognitionEvent.results')
   @Returns('_SpeechRecognitionResultList') @Creates('_SpeechRecognitionResultList')
   final List<SpeechRecognitionResult> results;
 }
@@ -18248,16 +18389,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechRecognitionResult; @docsEditable true
+
+@DocsEditable
+@DomName('SpeechRecognitionResult')
 class SpeechRecognitionResult native "*SpeechRecognitionResult" {
 
-  /// @domName SpeechRecognitionResult.isFinal; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognitionResult.isFinal')
   final bool isFinal;
 
-  /// @domName SpeechRecognitionResult.length; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognitionResult.length')
   final int length;
 
-  /// @domName SpeechRecognitionResult.item; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognitionResult.item')
   SpeechRecognitionAlternative item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18265,7 +18408,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SQLError; @docsEditable true
+
+@DocsEditable
+@DomName('SQLError')
 class SqlError native "*SQLError" {
 
   static const int CONSTRAINT_ERR = 6;
@@ -18284,10 +18429,10 @@
 
   static const int VERSION_ERR = 2;
 
-  /// @domName SQLError.code; @docsEditable true
+  @DocsEditable @DomName('SQLError.code')
   final int code;
 
-  /// @domName SQLError.message; @docsEditable true
+  @DocsEditable @DomName('SQLError.message')
   final String message;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18295,7 +18440,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SQLException; @docsEditable true
+
+@DocsEditable
+@DomName('SQLException')
 class SqlException native "*SQLException" {
 
   static const int CONSTRAINT_ERR = 6;
@@ -18314,10 +18461,10 @@
 
   static const int VERSION_ERR = 2;
 
-  /// @domName SQLException.code; @docsEditable true
+  @DocsEditable @DomName('SQLException.code')
   final int code;
 
-  /// @domName SQLException.message; @docsEditable true
+  @DocsEditable @DomName('SQLException.message')
   final String message;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18325,16 +18472,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SQLResultSet; @docsEditable true
+
+@DocsEditable
+@DomName('SQLResultSet')
 class SqlResultSet native "*SQLResultSet" {
 
-  /// @domName SQLResultSet.insertId; @docsEditable true
+  @DocsEditable @DomName('SQLResultSet.insertId')
   final int insertId;
 
-  /// @domName SQLResultSet.rows; @docsEditable true
+  @DocsEditable @DomName('SQLResultSet.rows')
   final SqlResultSetRowList rows;
 
-  /// @domName SQLResultSet.rowsAffected; @docsEditable true
+  @DocsEditable @DomName('SQLResultSet.rowsAffected')
   final int rowsAffected;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18342,10 +18491,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SQLResultSetRowList; @docsEditable true
+
+@DocsEditable
+@DomName('SQLResultSetRowList')
 class SqlResultSetRowList implements JavaScriptIndexingBehavior, List<Map> native "*SQLResultSetRowList" {
 
-  /// @domName SQLResultSetRowList.length; @docsEditable true
+  @DocsEditable @DomName('SQLResultSetRowList.length')
   int get length => JS("int", "#.length", this);
 
   Map operator[](int index) => JS("Map", "#[#]", this, index);
@@ -18366,50 +18517,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Map)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Map element) => Collections.contains(this, element);
+  bool contains(Map element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Map element)) => Collections.forEach(this, f);
+  void forEach(void f(Map element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Map element)) => new MappedList<Map, dynamic>(this, f);
+  List mappedBy(f(Map element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Map> where(bool f(Map element)) => new WhereIterable<Map>(this, f);
+  Iterable<Map> where(bool f(Map element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Map element)) => Collections.every(this, f);
+  bool every(bool f(Map element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Map element)) => Collections.any(this, f);
+  bool any(bool f(Map element)) => IterableMixinWorkaround.any(this, f);
 
   List<Map> toList() => new List<Map>.from(this);
   Set<Map> toSet() => new Set<Map>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Map> take(int n) => new ListView<Map>(this, 0, n);
+  List<Map> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Map> takeWhile(bool test(Map value)) {
-    return new TakeWhileIterable<Map>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Map> skip(int n) => new ListView<Map>(this, n, null);
+  List<Map> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Map> skipWhile(bool test(Map value)) {
-    return new SkipWhileIterable<Map>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Map firstMatching(bool test(Map value), { Map orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Map lastMatching(bool test(Map value), {Map orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Map singleMatching(bool test(Map value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Map elementAt(int index) {
@@ -18467,16 +18618,36 @@
     throw new StateError("More than one element");
   }
 
-  Map min([int compare(Map a, Map b)]) => Collections.min(this, compare);
+  Map min([int compare(Map a, Map b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Map max([int compare(Map a, Map b)]) => Collections.max(this, compare);
+  Map max([int compare(Map a, Map b)]) => IterableMixinWorkaround.max(this, compare);
 
   Map removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Map removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Map element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Map element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Map> from, [int startFrom]) {
@@ -18496,12 +18667,11 @@
 
   // -- end List<Map> mixins.
 
-  /// @domName SQLResultSetRowList.item; @docsEditable true
   Map item(int index) {
     return convertNativeToDart_Dictionary(_item_1(index));
   }
   @JSName('item')
-  @Creates('=Object')
+  @DocsEditable @DomName('SQLResultSetRowList.item') @Creates('=Object')
   _item_1(index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18509,10 +18679,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SQLTransaction; @docsEditable true
+
+@DocsEditable
+@DomName('SQLTransaction')
 class SqlTransaction native "*SQLTransaction" {
 
-  /// @domName SQLTransaction.executeSql; @docsEditable true
+  @DocsEditable @DomName('SQLTransaction.executeSql')
   void executeSql(String sqlStatement, List arguments, [SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18520,10 +18692,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SQLTransactionSync; @docsEditable true
+
+@DocsEditable
+@DomName('SQLTransactionSync')
 class SqlTransactionSync native "*SQLTransactionSync" {
 
-  /// @domName SQLTransactionSync.executeSql; @docsEditable true
+  @DocsEditable @DomName('SQLTransactionSync.executeSql')
   SqlResultSet executeSql(String sqlStatement, List arguments) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18531,7 +18705,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Storage
+@DocsEditable
+@DomName('Storage')
 class Storage implements Map<String, String>  native "*Storage" {
 
   // TODO(nweiz): update this when maps support lazy iteration
@@ -18581,28 +18756,28 @@
 
   bool get isEmpty => $dom_key(0) == null;
 
-  /// @domName Storage.length; @docsEditable true
   @JSName('length')
+  @DocsEditable @DomName('Storage.length')
   final int $dom_length;
 
-  /// @domName Storage.clear; @docsEditable true
   @JSName('clear')
+  @DocsEditable @DomName('Storage.clear')
   void $dom_clear() native;
 
-  /// @domName Storage.getItem; @docsEditable true
   @JSName('getItem')
+  @DocsEditable @DomName('Storage.getItem')
   String $dom_getItem(String key) native;
 
-  /// @domName Storage.key; @docsEditable true
   @JSName('key')
+  @DocsEditable @DomName('Storage.key')
   String $dom_key(int index) native;
 
-  /// @domName Storage.removeItem; @docsEditable true
   @JSName('removeItem')
+  @DocsEditable @DomName('Storage.removeItem')
   void $dom_removeItem(String key) native;
 
-  /// @domName Storage.setItem; @docsEditable true
   @JSName('setItem')
+  @DocsEditable @DomName('Storage.setItem')
   void $dom_setItem(String key, String data) native;
 
 }
@@ -18611,25 +18786,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName StorageEvent; @docsEditable true
+
+@DocsEditable
+@DomName('StorageEvent')
 class StorageEvent extends Event native "*StorageEvent" {
 
-  /// @domName StorageEvent.key; @docsEditable true
+  @DocsEditable @DomName('StorageEvent.key')
   final String key;
 
-  /// @domName StorageEvent.newValue; @docsEditable true
+  @DocsEditable @DomName('StorageEvent.newValue')
   final String newValue;
 
-  /// @domName StorageEvent.oldValue; @docsEditable true
+  @DocsEditable @DomName('StorageEvent.oldValue')
   final String oldValue;
 
-  /// @domName StorageEvent.storageArea; @docsEditable true
+  @DocsEditable @DomName('StorageEvent.storageArea')
   final Storage storageArea;
 
-  /// @domName StorageEvent.url; @docsEditable true
+  @DocsEditable @DomName('StorageEvent.url')
   final String url;
 
-  /// @domName StorageEvent.initStorageEvent; @docsEditable true
+  @DocsEditable @DomName('StorageEvent.initStorageEvent')
   void initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18637,17 +18814,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName StorageInfo; @docsEditable true
+
+@DocsEditable
+@DomName('StorageInfo')
 class StorageInfo native "*StorageInfo" {
 
   static const int PERSISTENT = 1;
 
   static const int TEMPORARY = 0;
 
-  /// @domName StorageInfo.queryUsageAndQuota; @docsEditable true
+  @DocsEditable @DomName('StorageInfo.queryUsageAndQuota')
   void queryUsageAndQuota(int storageType, [StorageInfoUsageCallback usageCallback, StorageInfoErrorCallback errorCallback]) native;
 
-  /// @domName StorageInfo.requestQuota; @docsEditable true
+  @DocsEditable @DomName('StorageInfo.requestQuota')
   void requestQuota(int storageType, int newQuotaInBytes, [StorageInfoQuotaCallback quotaCallback, StorageInfoErrorCallback errorCallback]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18687,25 +18866,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLStyleElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLStyleElement')
 class StyleElement extends Element native "*HTMLStyleElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory StyleElement() => document.$dom_createElement("style");
 
-  /// @domName HTMLStyleElement.disabled; @docsEditable true
+  @DocsEditable @DomName('HTMLStyleElement.disabled')
   bool disabled;
 
-  /// @domName HTMLStyleElement.media; @docsEditable true
+  @DocsEditable @DomName('HTMLStyleElement.media')
   String media;
 
-  /// @domName HTMLStyleElement.scoped; @docsEditable true
+  @DocsEditable @DomName('HTMLStyleElement.scoped')
   bool scoped;
 
-  /// @domName HTMLStyleElement.sheet; @docsEditable true
+  @DocsEditable @DomName('HTMLStyleElement.sheet')
   final StyleSheet sheet;
 
-  /// @domName HTMLStyleElement.type; @docsEditable true
+  @DocsEditable @DomName('HTMLStyleElement.type')
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18713,13 +18894,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName StyleMedia; @docsEditable true
+
+@DocsEditable
+@DomName('StyleMedia')
 class StyleMedia native "*StyleMedia" {
 
-  /// @domName StyleMedia.type; @docsEditable true
+  @DocsEditable @DomName('StyleMedia.type')
   final String type;
 
-  /// @domName StyleMedia.matchMedium; @docsEditable true
+  @DocsEditable @DomName('StyleMedia.matchMedium')
   bool matchMedium(String mediaquery) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18727,28 +18910,30 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName StyleSheet; @docsEditable true
+
+@DocsEditable
+@DomName('StyleSheet')
 class StyleSheet native "*StyleSheet" {
 
-  /// @domName StyleSheet.disabled; @docsEditable true
+  @DocsEditable @DomName('StyleSheet.disabled')
   bool disabled;
 
-  /// @domName StyleSheet.href; @docsEditable true
+  @DocsEditable @DomName('StyleSheet.href')
   final String href;
 
-  /// @domName StyleSheet.media; @docsEditable true
+  @DocsEditable @DomName('StyleSheet.media')
   final MediaList media;
 
-  /// @domName StyleSheet.ownerNode; @docsEditable true
+  @DocsEditable @DomName('StyleSheet.ownerNode')
   final Node ownerNode;
 
-  /// @domName StyleSheet.parentStyleSheet; @docsEditable true
+  @DocsEditable @DomName('StyleSheet.parentStyleSheet')
   final StyleSheet parentStyleSheet;
 
-  /// @domName StyleSheet.title; @docsEditable true
+  @DocsEditable @DomName('StyleSheet.title')
   final String title;
 
-  /// @domName StyleSheet.type; @docsEditable true
+  @DocsEditable @DomName('StyleSheet.type')
   final String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18756,10 +18941,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTableCaptionElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLTableCaptionElement')
 class TableCaptionElement extends Element native "*HTMLTableCaptionElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory TableCaptionElement() => document.$dom_createElement("caption");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18767,22 +18954,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTableCellElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLTableCellElement')
 class TableCellElement extends Element native "*HTMLTableCellElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory TableCellElement() => document.$dom_createElement("td");
 
-  /// @domName HTMLTableCellElement.cellIndex; @docsEditable true
+  @DocsEditable @DomName('HTMLTableCellElement.cellIndex')
   final int cellIndex;
 
-  /// @domName HTMLTableCellElement.colSpan; @docsEditable true
+  @DocsEditable @DomName('HTMLTableCellElement.colSpan')
   int colSpan;
 
-  /// @domName HTMLTableCellElement.headers; @docsEditable true
+  @DocsEditable @DomName('HTMLTableCellElement.headers')
   String headers;
 
-  /// @domName HTMLTableCellElement.rowSpan; @docsEditable true
+  @DocsEditable @DomName('HTMLTableCellElement.rowSpan')
   int rowSpan;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18790,13 +18979,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTableColElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLTableColElement')
 class TableColElement extends Element native "*HTMLTableColElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory TableColElement() => document.$dom_createElement("col");
 
-  /// @domName HTMLTableColElement.span; @docsEditable true
+  @DocsEditable @DomName('HTMLTableColElement.span')
   int span;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18804,52 +18995,53 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTableElement
+@DocsEditable
+@DomName('HTMLTableElement')
 class TableElement extends Element native "*HTMLTableElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory TableElement() => document.$dom_createElement("table");
 
-  /// @domName HTMLTableElement.border; @docsEditable true
+  @DocsEditable @DomName('HTMLTableElement.border')
   String border;
 
-  /// @domName HTMLTableElement.caption; @docsEditable true
+  @DocsEditable @DomName('HTMLTableElement.caption')
   TableCaptionElement caption;
 
-  /// @domName HTMLTableElement.rows; @docsEditable true
+  @DocsEditable @DomName('HTMLTableElement.rows')
   final HtmlCollection rows;
 
-  /// @domName HTMLTableElement.tBodies; @docsEditable true
+  @DocsEditable @DomName('HTMLTableElement.tBodies')
   final HtmlCollection tBodies;
 
-  /// @domName HTMLTableElement.tFoot; @docsEditable true
+  @DocsEditable @DomName('HTMLTableElement.tFoot')
   TableSectionElement tFoot;
 
-  /// @domName HTMLTableElement.tHead; @docsEditable true
+  @DocsEditable @DomName('HTMLTableElement.tHead')
   TableSectionElement tHead;
 
-  /// @domName HTMLTableElement.createCaption; @docsEditable true
+  @DocsEditable @DomName('HTMLTableElement.createCaption')
   Element createCaption() native;
 
-  /// @domName HTMLTableElement.createTFoot; @docsEditable true
+  @DocsEditable @DomName('HTMLTableElement.createTFoot')
   Element createTFoot() native;
 
-  /// @domName HTMLTableElement.createTHead; @docsEditable true
+  @DocsEditable @DomName('HTMLTableElement.createTHead')
   Element createTHead() native;
 
-  /// @domName HTMLTableElement.deleteCaption; @docsEditable true
+  @DocsEditable @DomName('HTMLTableElement.deleteCaption')
   void deleteCaption() native;
 
-  /// @domName HTMLTableElement.deleteRow; @docsEditable true
+  @DocsEditable @DomName('HTMLTableElement.deleteRow')
   void deleteRow(int index) native;
 
-  /// @domName HTMLTableElement.deleteTFoot; @docsEditable true
+  @DocsEditable @DomName('HTMLTableElement.deleteTFoot')
   void deleteTFoot() native;
 
-  /// @domName HTMLTableElement.deleteTHead; @docsEditable true
+  @DocsEditable @DomName('HTMLTableElement.deleteTHead')
   void deleteTHead() native;
 
-  /// @domName HTMLTableElement.insertRow; @docsEditable true
+  @DocsEditable @DomName('HTMLTableElement.insertRow')
   Element insertRow(int index) native;
 
 
@@ -18870,25 +19062,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTableRowElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLTableRowElement')
 class TableRowElement extends Element native "*HTMLTableRowElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory TableRowElement() => document.$dom_createElement("tr");
 
-  /// @domName HTMLTableRowElement.cells; @docsEditable true
+  @DocsEditable @DomName('HTMLTableRowElement.cells')
   final HtmlCollection cells;
 
-  /// @domName HTMLTableRowElement.rowIndex; @docsEditable true
+  @DocsEditable @DomName('HTMLTableRowElement.rowIndex')
   final int rowIndex;
 
-  /// @domName HTMLTableRowElement.sectionRowIndex; @docsEditable true
+  @DocsEditable @DomName('HTMLTableRowElement.sectionRowIndex')
   final int sectionRowIndex;
 
-  /// @domName HTMLTableRowElement.deleteCell; @docsEditable true
+  @DocsEditable @DomName('HTMLTableRowElement.deleteCell')
   void deleteCell(int index) native;
 
-  /// @domName HTMLTableRowElement.insertCell; @docsEditable true
+  @DocsEditable @DomName('HTMLTableRowElement.insertCell')
   Element insertCell(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18896,19 +19090,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTableSectionElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLTableSectionElement')
 class TableSectionElement extends Element native "*HTMLTableSectionElement" {
 
-  /// @domName HTMLTableSectionElement.chOff; @docsEditable true
-  String chOff;
-
-  /// @domName HTMLTableSectionElement.rows; @docsEditable true
+  @DocsEditable @DomName('HTMLTableSectionElement.rows')
   final HtmlCollection rows;
 
-  /// @domName HTMLTableSectionElement.deleteRow; @docsEditable true
+  @DocsEditable @DomName('HTMLTableSectionElement.deleteRow')
   void deleteRow(int index) native;
 
-  /// @domName HTMLTableSectionElement.insertRow; @docsEditable true
+  @DocsEditable @DomName('HTMLTableSectionElement.insertRow')
   Element insertRow(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18918,17 +19111,18 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Text
+@DocsEditable
+@DomName('Text')
 class Text extends CharacterData native "*Text" {
   factory Text(String data) => _TextFactoryProvider.createText(data);
 
-  /// @domName Text.wholeText; @docsEditable true
+  @DocsEditable @DomName('Text.wholeText')
   final String wholeText;
 
-  /// @domName Text.replaceWholeText; @docsEditable true
+  @DocsEditable @DomName('Text.replaceWholeText')
   Text replaceWholeText(String content) native;
 
-  /// @domName Text.splitText; @docsEditable true
+  @DocsEditable @DomName('Text.splitText')
   Text splitText(int offset) native;
 
 }
@@ -18937,95 +19131,97 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTextAreaElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLTextAreaElement')
 class TextAreaElement extends Element native "*HTMLTextAreaElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory TextAreaElement() => document.$dom_createElement("textarea");
 
-  /// @domName HTMLTextAreaElement.autofocus; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.autofocus')
   bool autofocus;
 
-  /// @domName HTMLTextAreaElement.cols; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.cols')
   int cols;
 
-  /// @domName HTMLTextAreaElement.defaultValue; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.defaultValue')
   String defaultValue;
 
-  /// @domName HTMLTextAreaElement.dirName; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.dirName')
   String dirName;
 
-  /// @domName HTMLTextAreaElement.disabled; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.disabled')
   bool disabled;
 
-  /// @domName HTMLTextAreaElement.form; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.form')
   final FormElement form;
 
-  /// @domName HTMLTextAreaElement.labels; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.labels')
   @Returns('NodeList') @Creates('NodeList')
   final List<Node> labels;
 
-  /// @domName HTMLTextAreaElement.maxLength; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.maxLength')
   int maxLength;
 
-  /// @domName HTMLTextAreaElement.name; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.name')
   String name;
 
-  /// @domName HTMLTextAreaElement.placeholder; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.placeholder')
   String placeholder;
 
-  /// @domName HTMLTextAreaElement.readOnly; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLTextAreaElement.required; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.required')
   bool required;
 
-  /// @domName HTMLTextAreaElement.rows; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.rows')
   int rows;
 
-  /// @domName HTMLTextAreaElement.selectionDirection; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.selectionDirection')
   String selectionDirection;
 
-  /// @domName HTMLTextAreaElement.selectionEnd; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.selectionEnd')
   int selectionEnd;
 
-  /// @domName HTMLTextAreaElement.selectionStart; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.selectionStart')
   int selectionStart;
 
-  /// @domName HTMLTextAreaElement.textLength; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.textLength')
   final int textLength;
 
-  /// @domName HTMLTextAreaElement.type; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.type')
   final String type;
 
-  /// @domName HTMLTextAreaElement.validationMessage; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.validationMessage')
   final String validationMessage;
 
-  /// @domName HTMLTextAreaElement.validity; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.validity')
   final ValidityState validity;
 
-  /// @domName HTMLTextAreaElement.value; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.value')
   String value;
 
-  /// @domName HTMLTextAreaElement.willValidate; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.willValidate')
   final bool willValidate;
 
-  /// @domName HTMLTextAreaElement.wrap; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.wrap')
   String wrap;
 
-  /// @domName HTMLTextAreaElement.checkValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.checkValidity')
   bool checkValidity() native;
 
-  /// @domName HTMLTextAreaElement.select; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.select')
   void select() native;
 
-  /// @domName HTMLTextAreaElement.setCustomValidity; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.setCustomValidity')
   void setCustomValidity(String error) native;
 
-  /// @domName HTMLTextAreaElement.setRangeText; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.setRangeText')
   void setRangeText(String replacement, [int start, int end, String selectionMode]) native;
 
-  /// @domName HTMLTextAreaElement.setSelectionRange; @docsEditable true
+  @DocsEditable @DomName('HTMLTextAreaElement.setSelectionRange')
   void setSelectionRange(int start, int end, [String direction]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19033,13 +19229,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TextEvent; @docsEditable true
+
+@DocsEditable
+@DomName('TextEvent')
 class TextEvent extends UIEvent native "*TextEvent" {
 
-  /// @domName TextEvent.data; @docsEditable true
+  @DocsEditable @DomName('TextEvent.data')
   final String data;
 
-  /// @domName TextEvent.initTextEvent; @docsEditable true
+  @DocsEditable @DomName('TextEvent.initTextEvent')
   void initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19047,10 +19245,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TextMetrics; @docsEditable true
+
+@DocsEditable
+@DomName('TextMetrics')
 class TextMetrics native "*TextMetrics" {
 
-  /// @domName TextMetrics.width; @docsEditable true
+  @DocsEditable @DomName('TextMetrics.width')
   final num width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19058,60 +19258,63 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TextTrack; @docsEditable true
+
+@DocsEditable
+@DomName('TextTrack')
 class TextTrack extends EventTarget native "*TextTrack" {
 
   static const EventStreamProvider<Event> cueChangeEvent = const EventStreamProvider<Event>('cuechange');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   TextTrackEvents get on =>
     new TextTrackEvents(this);
 
-  /// @domName TextTrack.activeCues; @docsEditable true
+  @DocsEditable @DomName('TextTrack.activeCues')
   final TextTrackCueList activeCues;
 
-  /// @domName TextTrack.cues; @docsEditable true
+  @DocsEditable @DomName('TextTrack.cues')
   final TextTrackCueList cues;
 
-  /// @domName TextTrack.kind; @docsEditable true
+  @DocsEditable @DomName('TextTrack.kind')
   final String kind;
 
-  /// @domName TextTrack.label; @docsEditable true
+  @DocsEditable @DomName('TextTrack.label')
   final String label;
 
-  /// @domName TextTrack.language; @docsEditable true
+  @DocsEditable @DomName('TextTrack.language')
   final String language;
 
-  /// @domName TextTrack.mode; @docsEditable true
+  @DocsEditable @DomName('TextTrack.mode')
   String mode;
 
-  /// @domName TextTrack.addCue; @docsEditable true
+  @DocsEditable @DomName('TextTrack.addCue')
   void addCue(TextTrackCue cue) native;
 
-  /// @domName TextTrack.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('TextTrack.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName TextTrack.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('TextTrack.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName TextTrack.removeCue; @docsEditable true
+  @DocsEditable @DomName('TextTrack.removeCue')
   void removeCue(TextTrackCue cue) native;
 
-  /// @domName TextTrack.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('TextTrack.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   Stream<Event> get onCueChange => cueChangeEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class TextTrackEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   TextTrackEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get cueChange => this['cuechange'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19119,71 +19322,74 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TextTrackCue; @docsEditable true
+
+@DocsEditable
+@DomName('TextTrackCue')
 class TextTrackCue extends EventTarget native "*TextTrackCue" {
 
   static const EventStreamProvider<Event> enterEvent = const EventStreamProvider<Event>('enter');
 
   static const EventStreamProvider<Event> exitEvent = const EventStreamProvider<Event>('exit');
 
-  ///@docsEditable true
+  @DocsEditable
   factory TextTrackCue(num startTime, num endTime, String text) => TextTrackCue._create(startTime, endTime, text);
   static TextTrackCue _create(num startTime, num endTime, String text) => JS('TextTrackCue', 'new TextTrackCue(#,#,#)', startTime, endTime, text);
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   TextTrackCueEvents get on =>
     new TextTrackCueEvents(this);
 
-  /// @domName TextTrackCue.align; @docsEditable true
+  @DocsEditable @DomName('TextTrackCue.align')
   String align;
 
-  /// @domName TextTrackCue.endTime; @docsEditable true
+  @DocsEditable @DomName('TextTrackCue.endTime')
   num endTime;
 
-  /// @domName TextTrackCue.id; @docsEditable true
+  @DocsEditable @DomName('TextTrackCue.id')
   String id;
 
-  /// @domName TextTrackCue.line; @docsEditable true
+  @DocsEditable @DomName('TextTrackCue.line')
   int line;
 
-  /// @domName TextTrackCue.pauseOnExit; @docsEditable true
+  @DocsEditable @DomName('TextTrackCue.pauseOnExit')
   bool pauseOnExit;
 
-  /// @domName TextTrackCue.position; @docsEditable true
+  @DocsEditable @DomName('TextTrackCue.position')
   int position;
 
-  /// @domName TextTrackCue.size; @docsEditable true
+  @DocsEditable @DomName('TextTrackCue.size')
   int size;
 
-  /// @domName TextTrackCue.snapToLines; @docsEditable true
+  @DocsEditable @DomName('TextTrackCue.snapToLines')
   bool snapToLines;
 
-  /// @domName TextTrackCue.startTime; @docsEditable true
+  @DocsEditable @DomName('TextTrackCue.startTime')
   num startTime;
 
-  /// @domName TextTrackCue.text; @docsEditable true
+  @DocsEditable @DomName('TextTrackCue.text')
   String text;
 
-  /// @domName TextTrackCue.track; @docsEditable true
+  @DocsEditable @DomName('TextTrackCue.track')
   final TextTrack track;
 
-  /// @domName TextTrackCue.vertical; @docsEditable true
+  @DocsEditable @DomName('TextTrackCue.vertical')
   String vertical;
 
-  /// @domName TextTrackCue.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('TextTrackCue.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName TextTrackCue.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('TextTrackCue.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName TextTrackCue.getCueAsHTML; @docsEditable true
   @JSName('getCueAsHTML')
+  @DocsEditable @DomName('TextTrackCue.getCueAsHTML')
   DocumentFragment getCueAsHtml() native;
 
-  /// @domName TextTrackCue.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('TextTrackCue.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   Stream<Event> get onEnter => enterEvent.forTarget(this);
@@ -19191,15 +19397,15 @@
   Stream<Event> get onExit => exitEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class TextTrackCueEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   TextTrackCueEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get enter => this['enter'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get exit => this['exit'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19207,10 +19413,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TextTrackCueList; @docsEditable true
+
+@DocsEditable
+@DomName('TextTrackCueList')
 class TextTrackCueList implements List<TextTrackCue>, JavaScriptIndexingBehavior native "*TextTrackCueList" {
 
-  /// @domName TextTrackCueList.length; @docsEditable true
+  @DocsEditable @DomName('TextTrackCueList.length')
   int get length => JS("int", "#.length", this);
 
   TextTrackCue operator[](int index) => JS("TextTrackCue", "#[#]", this, index);
@@ -19231,50 +19439,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, TextTrackCue)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(TextTrackCue element) => Collections.contains(this, element);
+  bool contains(TextTrackCue element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(TextTrackCue element)) => Collections.forEach(this, f);
+  void forEach(void f(TextTrackCue element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(TextTrackCue element)) => new MappedList<TextTrackCue, dynamic>(this, f);
+  List mappedBy(f(TextTrackCue element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<TextTrackCue> where(bool f(TextTrackCue element)) => new WhereIterable<TextTrackCue>(this, f);
+  Iterable<TextTrackCue> where(bool f(TextTrackCue element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(TextTrackCue element)) => Collections.every(this, f);
+  bool every(bool f(TextTrackCue element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(TextTrackCue element)) => Collections.any(this, f);
+  bool any(bool f(TextTrackCue element)) => IterableMixinWorkaround.any(this, f);
 
   List<TextTrackCue> toList() => new List<TextTrackCue>.from(this);
   Set<TextTrackCue> toSet() => new Set<TextTrackCue>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<TextTrackCue> take(int n) => new ListView<TextTrackCue>(this, 0, n);
+  List<TextTrackCue> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<TextTrackCue> takeWhile(bool test(TextTrackCue value)) {
-    return new TakeWhileIterable<TextTrackCue>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<TextTrackCue> skip(int n) => new ListView<TextTrackCue>(this, n, null);
+  List<TextTrackCue> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<TextTrackCue> skipWhile(bool test(TextTrackCue value)) {
-    return new SkipWhileIterable<TextTrackCue>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   TextTrackCue firstMatching(bool test(TextTrackCue value), { TextTrackCue orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   TextTrackCue lastMatching(bool test(TextTrackCue value), {TextTrackCue orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   TextTrackCue singleMatching(bool test(TextTrackCue value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   TextTrackCue elementAt(int index) {
@@ -19332,16 +19540,36 @@
     throw new StateError("More than one element");
   }
 
-  TextTrackCue min([int compare(TextTrackCue a, TextTrackCue b)]) => Collections.min(this, compare);
+  TextTrackCue min([int compare(TextTrackCue a, TextTrackCue b)]) => IterableMixinWorkaround.min(this, compare);
 
-  TextTrackCue max([int compare(TextTrackCue a, TextTrackCue b)]) => Collections.max(this, compare);
+  TextTrackCue max([int compare(TextTrackCue a, TextTrackCue b)]) => IterableMixinWorkaround.max(this, compare);
 
   TextTrackCue removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   TextTrackCue removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(TextTrackCue element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(TextTrackCue element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<TextTrackCue> from, [int startFrom]) {
@@ -19361,10 +19589,10 @@
 
   // -- end List<TextTrackCue> mixins.
 
-  /// @domName TextTrackCueList.getCueById; @docsEditable true
+  @DocsEditable @DomName('TextTrackCueList.getCueById')
   TextTrackCue getCueById(String id) native;
 
-  /// @domName TextTrackCueList.item; @docsEditable true
+  @DocsEditable @DomName('TextTrackCueList.item')
   TextTrackCue item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19372,16 +19600,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TextTrackList; @docsEditable true
+
+@DocsEditable
+@DomName('TextTrackList')
 class TextTrackList extends EventTarget implements JavaScriptIndexingBehavior, List<TextTrack> native "*TextTrackList" {
 
   static const EventStreamProvider<TrackEvent> addTrackEvent = const EventStreamProvider<TrackEvent>('addtrack');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   TextTrackListEvents get on =>
     new TextTrackListEvents(this);
 
-  /// @domName TextTrackList.length; @docsEditable true
+  @DocsEditable @DomName('TextTrackList.length')
   int get length => JS("int", "#.length", this);
 
   TextTrack operator[](int index) => JS("TextTrack", "#[#]", this, index);
@@ -19402,50 +19633,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, TextTrack)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(TextTrack element) => Collections.contains(this, element);
+  bool contains(TextTrack element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(TextTrack element)) => Collections.forEach(this, f);
+  void forEach(void f(TextTrack element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(TextTrack element)) => new MappedList<TextTrack, dynamic>(this, f);
+  List mappedBy(f(TextTrack element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<TextTrack> where(bool f(TextTrack element)) => new WhereIterable<TextTrack>(this, f);
+  Iterable<TextTrack> where(bool f(TextTrack element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(TextTrack element)) => Collections.every(this, f);
+  bool every(bool f(TextTrack element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(TextTrack element)) => Collections.any(this, f);
+  bool any(bool f(TextTrack element)) => IterableMixinWorkaround.any(this, f);
 
   List<TextTrack> toList() => new List<TextTrack>.from(this);
   Set<TextTrack> toSet() => new Set<TextTrack>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<TextTrack> take(int n) => new ListView<TextTrack>(this, 0, n);
+  List<TextTrack> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<TextTrack> takeWhile(bool test(TextTrack value)) {
-    return new TakeWhileIterable<TextTrack>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<TextTrack> skip(int n) => new ListView<TextTrack>(this, n, null);
+  List<TextTrack> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<TextTrack> skipWhile(bool test(TextTrack value)) {
-    return new SkipWhileIterable<TextTrack>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   TextTrack firstMatching(bool test(TextTrack value), { TextTrack orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   TextTrack lastMatching(bool test(TextTrack value), {TextTrack orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   TextTrack singleMatching(bool test(TextTrack value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   TextTrack elementAt(int index) {
@@ -19503,16 +19734,36 @@
     throw new StateError("More than one element");
   }
 
-  TextTrack min([int compare(TextTrack a, TextTrack b)]) => Collections.min(this, compare);
+  TextTrack min([int compare(TextTrack a, TextTrack b)]) => IterableMixinWorkaround.min(this, compare);
 
-  TextTrack max([int compare(TextTrack a, TextTrack b)]) => Collections.max(this, compare);
+  TextTrack max([int compare(TextTrack a, TextTrack b)]) => IterableMixinWorkaround.max(this, compare);
 
   TextTrack removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   TextTrack removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(TextTrack element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(TextTrack element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<TextTrack> from, [int startFrom]) {
@@ -19532,30 +19783,30 @@
 
   // -- end List<TextTrack> mixins.
 
-  /// @domName TextTrackList.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('TextTrackList.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName TextTrackList.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('TextTrackList.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName TextTrackList.item; @docsEditable true
+  @DocsEditable @DomName('TextTrackList.item')
   TextTrack item(int index) native;
 
-  /// @domName TextTrackList.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('TextTrackList.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   Stream<TrackEvent> get onAddTrack => addTrackEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class TextTrackListEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   TextTrackListEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get addTrack => this['addtrack'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19563,16 +19814,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TimeRanges; @docsEditable true
+
+@DocsEditable
+@DomName('TimeRanges')
 class TimeRanges native "*TimeRanges" {
 
-  /// @domName TimeRanges.length; @docsEditable true
+  @DocsEditable @DomName('TimeRanges.length')
   final int length;
 
-  /// @domName TimeRanges.end; @docsEditable true
+  @DocsEditable @DomName('TimeRanges.end')
   num end(int index) native;
 
-  /// @domName TimeRanges.start; @docsEditable true
+  @DocsEditable @DomName('TimeRanges.start')
   num start(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19588,10 +19841,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTitleElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLTitleElement')
 class TitleElement extends Element native "*HTMLTitleElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory TitleElement() => document.$dom_createElement("title");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19599,46 +19854,47 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Touch; @docsEditable true
+
+@DocsEditable
+@DomName('Touch')
 class Touch native "*Touch" {
 
-  /// @domName Touch.clientX; @docsEditable true
+  @DocsEditable @DomName('Touch.clientX')
   final int clientX;
 
-  /// @domName Touch.clientY; @docsEditable true
+  @DocsEditable @DomName('Touch.clientY')
   final int clientY;
 
-  /// @domName Touch.identifier; @docsEditable true
+  @DocsEditable @DomName('Touch.identifier')
   final int identifier;
 
-  /// @domName Touch.pageX; @docsEditable true
+  @DocsEditable @DomName('Touch.pageX')
   final int pageX;
 
-  /// @domName Touch.pageY; @docsEditable true
+  @DocsEditable @DomName('Touch.pageY')
   final int pageY;
 
-  /// @domName Touch.screenX; @docsEditable true
+  @DocsEditable @DomName('Touch.screenX')
   final int screenX;
 
-  /// @domName Touch.screenY; @docsEditable true
+  @DocsEditable @DomName('Touch.screenY')
   final int screenY;
 
-  /// @domName Touch.target; @docsEditable true
   EventTarget get target => _convertNativeToDart_EventTarget(this._target);
   @JSName('target')
-  @Creates('Element|Document') @Returns('Element|Document')
+  @DocsEditable @DomName('Touch.target') @Creates('Element|Document') @Returns('Element|Document')
   final dynamic _target;
 
-  /// @domName Touch.webkitForce; @docsEditable true
+  @DocsEditable @DomName('Touch.webkitForce')
   final num webkitForce;
 
-  /// @domName Touch.webkitRadiusX; @docsEditable true
+  @DocsEditable @DomName('Touch.webkitRadiusX')
   final int webkitRadiusX;
 
-  /// @domName Touch.webkitRadiusY; @docsEditable true
+  @DocsEditable @DomName('Touch.webkitRadiusY')
   final int webkitRadiusY;
 
-  /// @domName Touch.webkitRotationAngle; @docsEditable true
+  @DocsEditable @DomName('Touch.webkitRotationAngle')
   final num webkitRotationAngle;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19646,31 +19902,33 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TouchEvent; @docsEditable true
+
+@DocsEditable
+@DomName('TouchEvent')
 class TouchEvent extends UIEvent native "*TouchEvent" {
 
-  /// @domName TouchEvent.altKey; @docsEditable true
+  @DocsEditable @DomName('TouchEvent.altKey')
   final bool altKey;
 
-  /// @domName TouchEvent.changedTouches; @docsEditable true
+  @DocsEditable @DomName('TouchEvent.changedTouches')
   final TouchList changedTouches;
 
-  /// @domName TouchEvent.ctrlKey; @docsEditable true
+  @DocsEditable @DomName('TouchEvent.ctrlKey')
   final bool ctrlKey;
 
-  /// @domName TouchEvent.metaKey; @docsEditable true
+  @DocsEditable @DomName('TouchEvent.metaKey')
   final bool metaKey;
 
-  /// @domName TouchEvent.shiftKey; @docsEditable true
+  @DocsEditable @DomName('TouchEvent.shiftKey')
   final bool shiftKey;
 
-  /// @domName TouchEvent.targetTouches; @docsEditable true
+  @DocsEditable @DomName('TouchEvent.targetTouches')
   final TouchList targetTouches;
 
-  /// @domName TouchEvent.touches; @docsEditable true
+  @DocsEditable @DomName('TouchEvent.touches')
   final TouchList touches;
 
-  /// @domName TouchEvent.initTouchEvent; @docsEditable true
+  @DocsEditable @DomName('TouchEvent.initTouchEvent')
   void initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19678,10 +19936,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TouchList; @docsEditable true
+
+@DocsEditable
+@DomName('TouchList')
 class TouchList implements JavaScriptIndexingBehavior, List<Touch> native "*TouchList" {
 
-  /// @domName TouchList.length; @docsEditable true
+  @DocsEditable @DomName('TouchList.length')
   int get length => JS("int", "#.length", this);
 
   Touch operator[](int index) => JS("Touch", "#[#]", this, index);
@@ -19702,50 +19962,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Touch)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Touch element) => Collections.contains(this, element);
+  bool contains(Touch element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Touch element)) => Collections.forEach(this, f);
+  void forEach(void f(Touch element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Touch element)) => new MappedList<Touch, dynamic>(this, f);
+  List mappedBy(f(Touch element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Touch> where(bool f(Touch element)) => new WhereIterable<Touch>(this, f);
+  Iterable<Touch> where(bool f(Touch element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Touch element)) => Collections.every(this, f);
+  bool every(bool f(Touch element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Touch element)) => Collections.any(this, f);
+  bool any(bool f(Touch element)) => IterableMixinWorkaround.any(this, f);
 
   List<Touch> toList() => new List<Touch>.from(this);
   Set<Touch> toSet() => new Set<Touch>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Touch> take(int n) => new ListView<Touch>(this, 0, n);
+  List<Touch> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Touch> takeWhile(bool test(Touch value)) {
-    return new TakeWhileIterable<Touch>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Touch> skip(int n) => new ListView<Touch>(this, n, null);
+  List<Touch> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Touch> skipWhile(bool test(Touch value)) {
-    return new SkipWhileIterable<Touch>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Touch firstMatching(bool test(Touch value), { Touch orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Touch lastMatching(bool test(Touch value), {Touch orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Touch singleMatching(bool test(Touch value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Touch elementAt(int index) {
@@ -19803,16 +20063,36 @@
     throw new StateError("More than one element");
   }
 
-  Touch min([int compare(Touch a, Touch b)]) => Collections.min(this, compare);
+  Touch min([int compare(Touch a, Touch b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Touch max([int compare(Touch a, Touch b)]) => Collections.max(this, compare);
+  Touch max([int compare(Touch a, Touch b)]) => IterableMixinWorkaround.max(this, compare);
 
   Touch removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Touch removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Touch element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Touch element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Touch> from, [int startFrom]) {
@@ -19832,7 +20112,7 @@
 
   // -- end List<Touch> mixins.
 
-  /// @domName TouchList.item; @docsEditable true
+  @DocsEditable @DomName('TouchList.item')
   Touch item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19840,13 +20120,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTrackElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLTrackElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
 class TrackElement extends Element native "*HTMLTrackElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory TrackElement() => document.$dom_createElement("track");
 
   /// Checks if this type is supported on the current platform.
@@ -19860,26 +20142,26 @@
 
   static const int NONE = 0;
 
-  /// @domName HTMLTrackElement.defaultValue; @docsEditable true
   @JSName('default')
+  @DocsEditable @DomName('HTMLTrackElement.default')
   bool defaultValue;
 
-  /// @domName HTMLTrackElement.kind; @docsEditable true
+  @DocsEditable @DomName('HTMLTrackElement.kind')
   String kind;
 
-  /// @domName HTMLTrackElement.label; @docsEditable true
+  @DocsEditable @DomName('HTMLTrackElement.label')
   String label;
 
-  /// @domName HTMLTrackElement.readyState; @docsEditable true
+  @DocsEditable @DomName('HTMLTrackElement.readyState')
   final int readyState;
 
-  /// @domName HTMLTrackElement.src; @docsEditable true
+  @DocsEditable @DomName('HTMLTrackElement.src')
   String src;
 
-  /// @domName HTMLTrackElement.srclang; @docsEditable true
+  @DocsEditable @DomName('HTMLTrackElement.srclang')
   String srclang;
 
-  /// @domName HTMLTrackElement.track; @docsEditable true
+  @DocsEditable @DomName('HTMLTrackElement.track')
   final TextTrack track;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19887,10 +20169,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TrackEvent; @docsEditable true
+
+@DocsEditable
+@DomName('TrackEvent')
 class TrackEvent extends Event native "*TrackEvent" {
 
-  /// @domName TrackEvent.track; @docsEditable true
+  @DocsEditable @DomName('TrackEvent.track')
   final Object track;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19898,13 +20182,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitTransitionEvent; @docsEditable true
+
+@DocsEditable
+@DomName('WebKitTransitionEvent')
 class TransitionEvent extends Event native "*WebKitTransitionEvent" {
 
-  /// @domName WebKitTransitionEvent.elapsedTime; @docsEditable true
+  @DocsEditable @DomName('WebKitTransitionEvent.elapsedTime')
   final num elapsedTime;
 
-  /// @domName WebKitTransitionEvent.propertyName; @docsEditable true
+  @DocsEditable @DomName('WebKitTransitionEvent.propertyName')
   final String propertyName;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19912,43 +20198,45 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TreeWalker; @docsEditable true
+
+@DocsEditable
+@DomName('TreeWalker')
 class TreeWalker native "*TreeWalker" {
 
-  /// @domName TreeWalker.currentNode; @docsEditable true
+  @DocsEditable @DomName('TreeWalker.currentNode')
   Node currentNode;
 
-  /// @domName TreeWalker.expandEntityReferences; @docsEditable true
+  @DocsEditable @DomName('TreeWalker.expandEntityReferences')
   final bool expandEntityReferences;
 
-  /// @domName TreeWalker.filter; @docsEditable true
+  @DocsEditable @DomName('TreeWalker.filter')
   final NodeFilter filter;
 
-  /// @domName TreeWalker.root; @docsEditable true
+  @DocsEditable @DomName('TreeWalker.root')
   final Node root;
 
-  /// @domName TreeWalker.whatToShow; @docsEditable true
+  @DocsEditable @DomName('TreeWalker.whatToShow')
   final int whatToShow;
 
-  /// @domName TreeWalker.firstChild; @docsEditable true
+  @DocsEditable @DomName('TreeWalker.firstChild')
   Node firstChild() native;
 
-  /// @domName TreeWalker.lastChild; @docsEditable true
+  @DocsEditable @DomName('TreeWalker.lastChild')
   Node lastChild() native;
 
-  /// @domName TreeWalker.nextNode; @docsEditable true
+  @DocsEditable @DomName('TreeWalker.nextNode')
   Node nextNode() native;
 
-  /// @domName TreeWalker.nextSibling; @docsEditable true
+  @DocsEditable @DomName('TreeWalker.nextSibling')
   Node nextSibling() native;
 
-  /// @domName TreeWalker.parentNode; @docsEditable true
+  @DocsEditable @DomName('TreeWalker.parentNode')
   Node parentNode() native;
 
-  /// @domName TreeWalker.previousNode; @docsEditable true
+  @DocsEditable @DomName('TreeWalker.previousNode')
   Node previousNode() native;
 
-  /// @domName TreeWalker.previousSibling; @docsEditable true
+  @DocsEditable @DomName('TreeWalker.previousSibling')
   Node previousSibling() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19958,7 +20246,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName UIEvent; @docsEditable true
+@DocsEditable
+@DomName('UIEvent')
 class UIEvent extends Event native "*UIEvent" {
   // In JS, canBubble and cancelable are technically required parameters to
   // init*Event. In practice, though, if they aren't provided they simply
@@ -19973,40 +20262,39 @@
     return e;
   }
 
-  /// @domName UIEvent.charCode; @docsEditable true
   @JSName('charCode')
+  @DocsEditable @DomName('UIEvent.charCode')
   final int $dom_charCode;
 
-  /// @domName UIEvent.detail; @docsEditable true
+  @DocsEditable @DomName('UIEvent.detail')
   final int detail;
 
-  /// @domName UIEvent.keyCode; @docsEditable true
   @JSName('keyCode')
+  @DocsEditable @DomName('UIEvent.keyCode')
   final int $dom_keyCode;
 
-  /// @domName UIEvent.layerX; @docsEditable true
+  @DocsEditable @DomName('UIEvent.layerX')
   final int layerX;
 
-  /// @domName UIEvent.layerY; @docsEditable true
+  @DocsEditable @DomName('UIEvent.layerY')
   final int layerY;
 
-  /// @domName UIEvent.pageX; @docsEditable true
+  @DocsEditable @DomName('UIEvent.pageX')
   final int pageX;
 
-  /// @domName UIEvent.pageY; @docsEditable true
+  @DocsEditable @DomName('UIEvent.pageY')
   final int pageY;
 
-  /// @domName UIEvent.view; @docsEditable true
   WindowBase get view => _convertNativeToDart_Window(this._view);
   @JSName('view')
-  @Creates('Window|=Object') @Returns('Window|=Object')
+  @DocsEditable @DomName('UIEvent.view') @Creates('Window|=Object') @Returns('Window|=Object')
   final dynamic _view;
 
-  /// @domName UIEvent.which; @docsEditable true
+  @DocsEditable @DomName('UIEvent.which')
   final int which;
 
-  /// @domName UIEvent.initUIEvent; @docsEditable true
   @JSName('initUIEvent')
+  @DocsEditable @DomName('UIEvent.initUIEvent')
   void $dom_initUIEvent(String type, bool canBubble, bool cancelable, Window view, int detail) native;
 
 }
@@ -20015,10 +20303,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLUListElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLUListElement')
 class UListElement extends Element native "*HTMLUListElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory UListElement() => document.$dom_createElement("ul");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20026,7 +20316,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Uint16Array; @docsEditable true
+
+@DocsEditable
+@DomName('Uint16Array')
 class Uint16Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Uint16Array" {
 
   factory Uint16Array(int length) =>
@@ -20035,12 +20327,12 @@
   factory Uint16Array.fromList(List<int> list) =>
     _TypedArrayFactoryProvider.createUint16Array_fromList(list);
 
-  factory Uint16Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) =>
+  factory Uint16Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createUint16Array_fromBuffer(buffer, byteOffset, length);
 
   static const int BYTES_PER_ELEMENT = 2;
 
-  /// @domName Uint16Array.length; @docsEditable true
+  @DocsEditable @DomName('Uint16Array.length')
   int get length => JS("int", "#.length", this);
 
   int operator[](int index) => JS("int", "#[#]", this, index);
@@ -20058,50 +20350,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(int element) => Collections.contains(this, element);
+  bool contains(int element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(int element)) => Collections.forEach(this, f);
+  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(int element)) => new MappedList<int, dynamic>(this, f);
+  List mappedBy(f(int element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<int> where(bool f(int element)) => new WhereIterable<int>(this, f);
+  Iterable<int> where(bool f(int element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(int element)) => Collections.every(this, f);
+  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(int element)) => Collections.any(this, f);
+  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);
 
   List<int> toList() => new List<int>.from(this);
   Set<int> toSet() => new Set<int>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<int> take(int n) => new ListView<int>(this, 0, n);
+  List<int> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<int> takeWhile(bool test(int value)) {
-    return new TakeWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<int> skip(int n) => new ListView<int>(this, n, null);
+  List<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<int> skipWhile(bool test(int value)) {
-    return new SkipWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   int firstMatching(bool test(int value), { int orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   int lastMatching(bool test(int value), {int orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   int singleMatching(bool test(int value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   int elementAt(int index) {
@@ -20159,16 +20451,36 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) => Collections.min(this, compare);
+  int min([int compare(int a, int b)]) => IterableMixinWorkaround.min(this, compare);
 
-  int max([int compare(int a, int b)]) => Collections.max(this, compare);
+  int max([int compare(int a, int b)]) => IterableMixinWorkaround.max(this, compare);
 
   int removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
@@ -20188,11 +20500,11 @@
 
   // -- end List<int> mixins.
 
-  /// @domName Uint16Array.setElements; @docsEditable true
   @JSName('set')
+  @DocsEditable @DomName('Uint16Array.set')
   void setElements(Object array, [int offset]) native;
 
-  /// @domName Uint16Array.subarray; @docsEditable true
+  @DocsEditable @DomName('Uint16Array.subarray')
   Uint16Array subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20200,7 +20512,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Uint32Array; @docsEditable true
+
+@DocsEditable
+@DomName('Uint32Array')
 class Uint32Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Uint32Array" {
 
   factory Uint32Array(int length) =>
@@ -20209,12 +20523,12 @@
   factory Uint32Array.fromList(List<int> list) =>
     _TypedArrayFactoryProvider.createUint32Array_fromList(list);
 
-  factory Uint32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) =>
+  factory Uint32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createUint32Array_fromBuffer(buffer, byteOffset, length);
 
   static const int BYTES_PER_ELEMENT = 4;
 
-  /// @domName Uint32Array.length; @docsEditable true
+  @DocsEditable @DomName('Uint32Array.length')
   int get length => JS("int", "#.length", this);
 
   int operator[](int index) => JS("int", "#[#]", this, index);
@@ -20232,50 +20546,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(int element) => Collections.contains(this, element);
+  bool contains(int element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(int element)) => Collections.forEach(this, f);
+  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(int element)) => new MappedList<int, dynamic>(this, f);
+  List mappedBy(f(int element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<int> where(bool f(int element)) => new WhereIterable<int>(this, f);
+  Iterable<int> where(bool f(int element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(int element)) => Collections.every(this, f);
+  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(int element)) => Collections.any(this, f);
+  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);
 
   List<int> toList() => new List<int>.from(this);
   Set<int> toSet() => new Set<int>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<int> take(int n) => new ListView<int>(this, 0, n);
+  List<int> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<int> takeWhile(bool test(int value)) {
-    return new TakeWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<int> skip(int n) => new ListView<int>(this, n, null);
+  List<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<int> skipWhile(bool test(int value)) {
-    return new SkipWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   int firstMatching(bool test(int value), { int orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   int lastMatching(bool test(int value), {int orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   int singleMatching(bool test(int value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   int elementAt(int index) {
@@ -20333,16 +20647,36 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) => Collections.min(this, compare);
+  int min([int compare(int a, int b)]) => IterableMixinWorkaround.min(this, compare);
 
-  int max([int compare(int a, int b)]) => Collections.max(this, compare);
+  int max([int compare(int a, int b)]) => IterableMixinWorkaround.max(this, compare);
 
   int removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
@@ -20362,11 +20696,11 @@
 
   // -- end List<int> mixins.
 
-  /// @domName Uint32Array.setElements; @docsEditable true
   @JSName('set')
+  @DocsEditable @DomName('Uint32Array.set')
   void setElements(Object array, [int offset]) native;
 
-  /// @domName Uint32Array.subarray; @docsEditable true
+  @DocsEditable @DomName('Uint32Array.subarray')
   Uint32Array subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20374,7 +20708,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Uint8Array; @docsEditable true
+
+@DocsEditable
+@DomName('Uint8Array')
 class Uint8Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Uint8Array" {
 
   factory Uint8Array(int length) =>
@@ -20383,12 +20719,12 @@
   factory Uint8Array.fromList(List<int> list) =>
     _TypedArrayFactoryProvider.createUint8Array_fromList(list);
 
-  factory Uint8Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) =>
+  factory Uint8Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createUint8Array_fromBuffer(buffer, byteOffset, length);
 
   static const int BYTES_PER_ELEMENT = 1;
 
-  /// @domName Uint8Array.length; @docsEditable true
+  @DocsEditable @DomName('Uint8Array.length')
   int get length => JS("int", "#.length", this);
 
   int operator[](int index) => JS("int", "#[#]", this, index);
@@ -20406,50 +20742,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(int element) => Collections.contains(this, element);
+  bool contains(int element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(int element)) => Collections.forEach(this, f);
+  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(int element)) => new MappedList<int, dynamic>(this, f);
+  List mappedBy(f(int element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<int> where(bool f(int element)) => new WhereIterable<int>(this, f);
+  Iterable<int> where(bool f(int element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(int element)) => Collections.every(this, f);
+  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(int element)) => Collections.any(this, f);
+  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);
 
   List<int> toList() => new List<int>.from(this);
   Set<int> toSet() => new Set<int>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<int> take(int n) => new ListView<int>(this, 0, n);
+  List<int> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<int> takeWhile(bool test(int value)) {
-    return new TakeWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<int> skip(int n) => new ListView<int>(this, n, null);
+  List<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<int> skipWhile(bool test(int value)) {
-    return new SkipWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   int firstMatching(bool test(int value), { int orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   int lastMatching(bool test(int value), {int orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   int singleMatching(bool test(int value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   int elementAt(int index) {
@@ -20507,16 +20843,36 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) => Collections.min(this, compare);
+  int min([int compare(int a, int b)]) => IterableMixinWorkaround.min(this, compare);
 
-  int max([int compare(int a, int b)]) => Collections.max(this, compare);
+  int max([int compare(int a, int b)]) => IterableMixinWorkaround.max(this, compare);
 
   int removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
@@ -20536,11 +20892,11 @@
 
   // -- end List<int> mixins.
 
-  /// @domName Uint8Array.setElements; @docsEditable true
   @JSName('set')
+  @DocsEditable @DomName('Uint8Array.set')
   void setElements(Object array, [int offset]) native;
 
-  /// @domName Uint8Array.subarray; @docsEditable true
+  @DocsEditable @DomName('Uint8Array.subarray')
   Uint8Array subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20548,8 +20904,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Uint8ClampedArray; @docsEditable true
-class Uint8ClampedArray extends Uint8Array native "*Uint8ClampedArray" {
+
+@DocsEditable
+@DomName('Uint8ClampedArray')
+class Uint8ClampedArray extends Uint8Array implements JavaScriptIndexingBehavior, List<int> native "*Uint8ClampedArray" {
 
   factory Uint8ClampedArray(int length) =>
     _TypedArrayFactoryProvider.createUint8ClampedArray(length);
@@ -20557,17 +20915,182 @@
   factory Uint8ClampedArray.fromList(List<int> list) =>
     _TypedArrayFactoryProvider.createUint8ClampedArray_fromList(list);
 
-  factory Uint8ClampedArray.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) =>
+  factory Uint8ClampedArray.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createUint8ClampedArray_fromBuffer(buffer, byteOffset, length);
 
   // Use implementation from Uint8Array.
   // final int length;
 
-  /// @domName Uint8ClampedArray.setElements; @docsEditable true
+  int operator[](int index) => JS("int", "#[#]", this, index);
+
+  void operator[]=(int index, int value) { JS("void", "#[#] = #", this, index, value); }  // -- start List<int> mixins.
+  // int is the element type.
+
+  // From Iterable<int>:
+
+  Iterator<int> get iterator {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new FixedSizeListIterator<int>(this);
+  }
+
+  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  }
+
+  bool contains(int element) => IterableMixinWorkaround.contains(this, element);
+
+  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
+
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
+
+  List mappedBy(f(int element)) => IterableMixinWorkaround.mappedByList(this, f);
+
+  Iterable<int> where(bool f(int element)) => IterableMixinWorkaround.where(this, f);
+
+  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);
+
+  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);
+
+  List<int> toList() => new List<int>.from(this);
+  Set<int> toSet() => new Set<int>.from(this);
+
+  bool get isEmpty => this.length == 0;
+
+  List<int> take(int n) => IterableMixinWorkaround.takeList(this, n);
+
+  Iterable<int> takeWhile(bool test(int value)) {
+    return IterableMixinWorkaround.takeWhile(this, test);
+  }
+
+  List<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);
+
+  Iterable<int> skipWhile(bool test(int value)) {
+    return IterableMixinWorkaround.skipWhile(this, test);
+  }
+
+  int firstMatching(bool test(int value), { int orElse() }) {
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
+  }
+
+  int lastMatching(bool test(int value), {int orElse()}) {
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
+  }
+
+  int singleMatching(bool test(int value)) {
+    return IterableMixinWorkaround.singleMatching(this, test);
+  }
+
+  int elementAt(int index) {
+    return this[index];
+  }
+
+  // From Collection<int>:
+
+  void add(int value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(int value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Iterable<int> iterable) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  // From List<int>:
+  void set length(int value) {
+    throw new UnsupportedError("Cannot resize immutable List.");
+  }
+
+  void clear() {
+    throw new UnsupportedError("Cannot clear immutable List.");
+  }
+
+  void sort([int compare(int a, int b)]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(int element, [int start = 0]) =>
+      Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(int element, [int start]) {
+    if (start == null) start = length - 1;
+    return Lists.lastIndexOf(this, element, start);
+  }
+
+  int get first {
+    if (this.length > 0) return this[0];
+    throw new StateError("No elements");
+  }
+
+  int get last {
+    if (this.length > 0) return this[this.length - 1];
+    throw new StateError("No elements");
+  }
+
+  int get single {
+    if (length == 1) return this[0];
+    if (length == 0) throw new StateError("No elements");
+    throw new StateError("More than one element");
+  }
+
+  int min([int compare(int a, int b)]) => IterableMixinWorkaround.min(this, compare);
+
+  int max([int compare(int a, int b)]) => IterableMixinWorkaround.max(this, compare);
+
+  int removeAt(int pos) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  int removeLast() {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [int initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<int> getRange(int start, int rangeLength) =>
+      Lists.getRange(this, start, rangeLength, <int>[]);
+
+  // -- end List<int> mixins.
+
   @JSName('set')
+  @DocsEditable @DomName('Uint8ClampedArray.set')
   void setElements(Object array, [int offset]) native;
 
-  /// @domName Uint8ClampedArray.subarray; @docsEditable true
+  @DocsEditable @DomName('Uint8ClampedArray.subarray')
   Uint8ClampedArray subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20575,7 +21098,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLUnknownElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLUnknownElement')
 class UnknownElement extends Element native "*HTMLUnknownElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20583,7 +21108,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName URL
+@DocsEditable
+@DomName('URL')
 class Url native "*URL" {
 
   static String createObjectUrl(blob_OR_source_OR_stream) =>
@@ -20601,37 +21127,39 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ValidityState; @docsEditable true
+
+@DocsEditable
+@DomName('ValidityState')
 class ValidityState native "*ValidityState" {
 
-  /// @domName ValidityState.badInput; @docsEditable true
+  @DocsEditable @DomName('ValidityState.badInput')
   final bool badInput;
 
-  /// @domName ValidityState.customError; @docsEditable true
+  @DocsEditable @DomName('ValidityState.customError')
   final bool customError;
 
-  /// @domName ValidityState.patternMismatch; @docsEditable true
+  @DocsEditable @DomName('ValidityState.patternMismatch')
   final bool patternMismatch;
 
-  /// @domName ValidityState.rangeOverflow; @docsEditable true
+  @DocsEditable @DomName('ValidityState.rangeOverflow')
   final bool rangeOverflow;
 
-  /// @domName ValidityState.rangeUnderflow; @docsEditable true
+  @DocsEditable @DomName('ValidityState.rangeUnderflow')
   final bool rangeUnderflow;
 
-  /// @domName ValidityState.stepMismatch; @docsEditable true
+  @DocsEditable @DomName('ValidityState.stepMismatch')
   final bool stepMismatch;
 
-  /// @domName ValidityState.tooLong; @docsEditable true
+  @DocsEditable @DomName('ValidityState.tooLong')
   final bool tooLong;
 
-  /// @domName ValidityState.typeMismatch; @docsEditable true
+  @DocsEditable @DomName('ValidityState.typeMismatch')
   final bool typeMismatch;
 
-  /// @domName ValidityState.valid; @docsEditable true
+  @DocsEditable @DomName('ValidityState.valid')
   final bool valid;
 
-  /// @domName ValidityState.valueMissing; @docsEditable true
+  @DocsEditable @DomName('ValidityState.valueMissing')
   final bool valueMissing;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20639,49 +21167,51 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLVideoElement; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLVideoElement')
 class VideoElement extends MediaElement native "*HTMLVideoElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory VideoElement() => document.$dom_createElement("video");
 
-  /// @domName HTMLVideoElement.height; @docsEditable true
+  @DocsEditable @DomName('HTMLVideoElement.height')
   int height;
 
-  /// @domName HTMLVideoElement.poster; @docsEditable true
+  @DocsEditable @DomName('HTMLVideoElement.poster')
   String poster;
 
-  /// @domName HTMLVideoElement.videoHeight; @docsEditable true
+  @DocsEditable @DomName('HTMLVideoElement.videoHeight')
   final int videoHeight;
 
-  /// @domName HTMLVideoElement.videoWidth; @docsEditable true
+  @DocsEditable @DomName('HTMLVideoElement.videoWidth')
   final int videoWidth;
 
-  /// @domName HTMLVideoElement.webkitDecodedFrameCount; @docsEditable true
+  @DocsEditable @DomName('HTMLVideoElement.webkitDecodedFrameCount')
   final int webkitDecodedFrameCount;
 
-  /// @domName HTMLVideoElement.webkitDisplayingFullscreen; @docsEditable true
+  @DocsEditable @DomName('HTMLVideoElement.webkitDisplayingFullscreen')
   final bool webkitDisplayingFullscreen;
 
-  /// @domName HTMLVideoElement.webkitDroppedFrameCount; @docsEditable true
+  @DocsEditable @DomName('HTMLVideoElement.webkitDroppedFrameCount')
   final int webkitDroppedFrameCount;
 
-  /// @domName HTMLVideoElement.webkitSupportsFullscreen; @docsEditable true
+  @DocsEditable @DomName('HTMLVideoElement.webkitSupportsFullscreen')
   final bool webkitSupportsFullscreen;
 
-  /// @domName HTMLVideoElement.width; @docsEditable true
+  @DocsEditable @DomName('HTMLVideoElement.width')
   int width;
 
-  /// @domName HTMLVideoElement.webkitEnterFullScreen; @docsEditable true
+  @DocsEditable @DomName('HTMLVideoElement.webkitEnterFullScreen')
   void webkitEnterFullScreen() native;
 
-  /// @domName HTMLVideoElement.webkitEnterFullscreen; @docsEditable true
+  @DocsEditable @DomName('HTMLVideoElement.webkitEnterFullscreen')
   void webkitEnterFullscreen() native;
 
-  /// @domName HTMLVideoElement.webkitExitFullScreen; @docsEditable true
+  @DocsEditable @DomName('HTMLVideoElement.webkitExitFullScreen')
   void webkitExitFullScreen() native;
 
-  /// @domName HTMLVideoElement.webkitExitFullscreen; @docsEditable true
+  @DocsEditable @DomName('HTMLVideoElement.webkitExitFullscreen')
   void webkitExitFullscreen() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20697,16 +21227,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLActiveInfo; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLActiveInfo')
 class WebGLActiveInfo native "*WebGLActiveInfo" {
 
-  /// @domName WebGLActiveInfo.name; @docsEditable true
+  @DocsEditable @DomName('WebGLActiveInfo.name')
   final String name;
 
-  /// @domName WebGLActiveInfo.size; @docsEditable true
+  @DocsEditable @DomName('WebGLActiveInfo.size')
   final int size;
 
-  /// @domName WebGLActiveInfo.type; @docsEditable true
+  @DocsEditable @DomName('WebGLActiveInfo.type')
   final int type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20714,7 +21246,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLBuffer; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLBuffer')
 class WebGLBuffer native "*WebGLBuffer" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20722,7 +21256,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLCompressedTextureS3TC; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLCompressedTextureS3TC')
 class WebGLCompressedTextureS3TC native "*WebGLCompressedTextureS3TC" {
 
   static const int COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;
@@ -20738,25 +21274,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLContextAttributes; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLContextAttributes')
 class WebGLContextAttributes native "*WebGLContextAttributes" {
 
-  /// @domName WebGLContextAttributes.alpha; @docsEditable true
+  @DocsEditable @DomName('WebGLContextAttributes.alpha')
   bool alpha;
 
-  /// @domName WebGLContextAttributes.antialias; @docsEditable true
+  @DocsEditable @DomName('WebGLContextAttributes.antialias')
   bool antialias;
 
-  /// @domName WebGLContextAttributes.depth; @docsEditable true
+  @DocsEditable @DomName('WebGLContextAttributes.depth')
   bool depth;
 
-  /// @domName WebGLContextAttributes.premultipliedAlpha; @docsEditable true
+  @DocsEditable @DomName('WebGLContextAttributes.premultipliedAlpha')
   bool premultipliedAlpha;
 
-  /// @domName WebGLContextAttributes.preserveDrawingBuffer; @docsEditable true
+  @DocsEditable @DomName('WebGLContextAttributes.preserveDrawingBuffer')
   bool preserveDrawingBuffer;
 
-  /// @domName WebGLContextAttributes.stencil; @docsEditable true
+  @DocsEditable @DomName('WebGLContextAttributes.stencil')
   bool stencil;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20764,10 +21302,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLContextEvent; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLContextEvent')
 class WebGLContextEvent extends Event native "*WebGLContextEvent" {
 
-  /// @domName WebGLContextEvent.statusMessage; @docsEditable true
+  @DocsEditable @DomName('WebGLContextEvent.statusMessage')
   final String statusMessage;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20775,7 +21315,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLDebugRendererInfo; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLDebugRendererInfo')
 class WebGLDebugRendererInfo native "*WebGLDebugRendererInfo" {
 
   static const int UNMASKED_RENDERER_WEBGL = 0x9246;
@@ -20787,10 +21329,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLDebugShaders; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLDebugShaders')
 class WebGLDebugShaders native "*WebGLDebugShaders" {
 
-  /// @domName WebGLDebugShaders.getTranslatedShaderSource; @docsEditable true
+  @DocsEditable @DomName('WebGLDebugShaders.getTranslatedShaderSource')
   String getTranslatedShaderSource(WebGLShader shader) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20798,7 +21342,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLDepthTexture; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLDepthTexture')
 class WebGLDepthTexture native "*WebGLDepthTexture" {
 
   static const int UNSIGNED_INT_24_8_WEBGL = 0x84FA;
@@ -20808,7 +21354,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLFramebuffer; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLFramebuffer')
 class WebGLFramebuffer native "*WebGLFramebuffer" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20816,13 +21364,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLLoseContext; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLLoseContext')
 class WebGLLoseContext native "*WebGLLoseContext" {
 
-  /// @domName WebGLLoseContext.loseContext; @docsEditable true
+  @DocsEditable @DomName('WebGLLoseContext.loseContext')
   void loseContext() native;
 
-  /// @domName WebGLLoseContext.restoreContext; @docsEditable true
+  @DocsEditable @DomName('WebGLLoseContext.restoreContext')
   void restoreContext() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20830,7 +21380,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLProgram; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLProgram')
 class WebGLProgram native "*WebGLProgram" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20838,7 +21390,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLRenderbuffer; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLRenderbuffer')
 class WebGLRenderbuffer native "*WebGLRenderbuffer" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20846,7 +21400,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLRenderingContext; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLRenderingContext')
 class WebGLRenderingContext extends CanvasRenderingContext native "*WebGLRenderingContext" {
 
   static const int ACTIVE_ATTRIBUTES = 0x8B89;
@@ -21439,319 +21995,318 @@
 
   static const int ZERO = 0;
 
-  /// @domName WebGLRenderingContext.drawingBufferHeight; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.drawingBufferHeight')
   final int drawingBufferHeight;
 
-  /// @domName WebGLRenderingContext.drawingBufferWidth; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.drawingBufferWidth')
   final int drawingBufferWidth;
 
-  /// @domName WebGLRenderingContext.activeTexture; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.activeTexture')
   void activeTexture(int texture) native;
 
-  /// @domName WebGLRenderingContext.attachShader; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.attachShader')
   void attachShader(WebGLProgram program, WebGLShader shader) native;
 
-  /// @domName WebGLRenderingContext.bindAttribLocation; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.bindAttribLocation')
   void bindAttribLocation(WebGLProgram program, int index, String name) native;
 
-  /// @domName WebGLRenderingContext.bindBuffer; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.bindBuffer')
   void bindBuffer(int target, WebGLBuffer buffer) native;
 
-  /// @domName WebGLRenderingContext.bindFramebuffer; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.bindFramebuffer')
   void bindFramebuffer(int target, WebGLFramebuffer framebuffer) native;
 
-  /// @domName WebGLRenderingContext.bindRenderbuffer; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.bindRenderbuffer')
   void bindRenderbuffer(int target, WebGLRenderbuffer renderbuffer) native;
 
-  /// @domName WebGLRenderingContext.bindTexture; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.bindTexture')
   void bindTexture(int target, WebGLTexture texture) native;
 
-  /// @domName WebGLRenderingContext.blendColor; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.blendColor')
   void blendColor(num red, num green, num blue, num alpha) native;
 
-  /// @domName WebGLRenderingContext.blendEquation; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.blendEquation')
   void blendEquation(int mode) native;
 
-  /// @domName WebGLRenderingContext.blendEquationSeparate; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.blendEquationSeparate')
   void blendEquationSeparate(int modeRGB, int modeAlpha) native;
 
-  /// @domName WebGLRenderingContext.blendFunc; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.blendFunc')
   void blendFunc(int sfactor, int dfactor) native;
 
-  /// @domName WebGLRenderingContext.blendFuncSeparate; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.blendFuncSeparate')
   void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) native;
 
-  /// @domName WebGLRenderingContext.bufferData; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.bufferData')
   void bufferData(int target, data_OR_size, int usage) native;
 
-  /// @domName WebGLRenderingContext.bufferSubData; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.bufferSubData')
   void bufferSubData(int target, int offset, data) native;
 
-  /// @domName WebGLRenderingContext.checkFramebufferStatus; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.checkFramebufferStatus')
   int checkFramebufferStatus(int target) native;
 
-  /// @domName WebGLRenderingContext.clear; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.clear')
   void clear(int mask) native;
 
-  /// @domName WebGLRenderingContext.clearColor; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.clearColor')
   void clearColor(num red, num green, num blue, num alpha) native;
 
-  /// @domName WebGLRenderingContext.clearDepth; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.clearDepth')
   void clearDepth(num depth) native;
 
-  /// @domName WebGLRenderingContext.clearStencil; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.clearStencil')
   void clearStencil(int s) native;
 
-  /// @domName WebGLRenderingContext.colorMask; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.colorMask')
   void colorMask(bool red, bool green, bool blue, bool alpha) native;
 
-  /// @domName WebGLRenderingContext.compileShader; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.compileShader')
   void compileShader(WebGLShader shader) native;
 
-  /// @domName WebGLRenderingContext.compressedTexImage2D; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.compressedTexImage2D')
   void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, ArrayBufferView data) native;
 
-  /// @domName WebGLRenderingContext.compressedTexSubImage2D; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.compressedTexSubImage2D')
   void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, ArrayBufferView data) native;
 
-  /// @domName WebGLRenderingContext.copyTexImage2D; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.copyTexImage2D')
   void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) native;
 
-  /// @domName WebGLRenderingContext.copyTexSubImage2D; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.copyTexSubImage2D')
   void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) native;
 
-  /// @domName WebGLRenderingContext.createBuffer; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.createBuffer')
   WebGLBuffer createBuffer() native;
 
-  /// @domName WebGLRenderingContext.createFramebuffer; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.createFramebuffer')
   WebGLFramebuffer createFramebuffer() native;
 
-  /// @domName WebGLRenderingContext.createProgram; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.createProgram')
   WebGLProgram createProgram() native;
 
-  /// @domName WebGLRenderingContext.createRenderbuffer; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.createRenderbuffer')
   WebGLRenderbuffer createRenderbuffer() native;
 
-  /// @domName WebGLRenderingContext.createShader; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.createShader')
   WebGLShader createShader(int type) native;
 
-  /// @domName WebGLRenderingContext.createTexture; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.createTexture')
   WebGLTexture createTexture() native;
 
-  /// @domName WebGLRenderingContext.cullFace; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.cullFace')
   void cullFace(int mode) native;
 
-  /// @domName WebGLRenderingContext.deleteBuffer; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.deleteBuffer')
   void deleteBuffer(WebGLBuffer buffer) native;
 
-  /// @domName WebGLRenderingContext.deleteFramebuffer; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.deleteFramebuffer')
   void deleteFramebuffer(WebGLFramebuffer framebuffer) native;
 
-  /// @domName WebGLRenderingContext.deleteProgram; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.deleteProgram')
   void deleteProgram(WebGLProgram program) native;
 
-  /// @domName WebGLRenderingContext.deleteRenderbuffer; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.deleteRenderbuffer')
   void deleteRenderbuffer(WebGLRenderbuffer renderbuffer) native;
 
-  /// @domName WebGLRenderingContext.deleteShader; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.deleteShader')
   void deleteShader(WebGLShader shader) native;
 
-  /// @domName WebGLRenderingContext.deleteTexture; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.deleteTexture')
   void deleteTexture(WebGLTexture texture) native;
 
-  /// @domName WebGLRenderingContext.depthFunc; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.depthFunc')
   void depthFunc(int func) native;
 
-  /// @domName WebGLRenderingContext.depthMask; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.depthMask')
   void depthMask(bool flag) native;
 
-  /// @domName WebGLRenderingContext.depthRange; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.depthRange')
   void depthRange(num zNear, num zFar) native;
 
-  /// @domName WebGLRenderingContext.detachShader; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.detachShader')
   void detachShader(WebGLProgram program, WebGLShader shader) native;
 
-  /// @domName WebGLRenderingContext.disable; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.disable')
   void disable(int cap) native;
 
-  /// @domName WebGLRenderingContext.disableVertexAttribArray; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.disableVertexAttribArray')
   void disableVertexAttribArray(int index) native;
 
-  /// @domName WebGLRenderingContext.drawArrays; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.drawArrays')
   void drawArrays(int mode, int first, int count) native;
 
-  /// @domName WebGLRenderingContext.drawElements; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.drawElements')
   void drawElements(int mode, int count, int type, int offset) native;
 
-  /// @domName WebGLRenderingContext.enable; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.enable')
   void enable(int cap) native;
 
-  /// @domName WebGLRenderingContext.enableVertexAttribArray; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.enableVertexAttribArray')
   void enableVertexAttribArray(int index) native;
 
-  /// @domName WebGLRenderingContext.finish; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.finish')
   void finish() native;
 
-  /// @domName WebGLRenderingContext.flush; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.flush')
   void flush() native;
 
-  /// @domName WebGLRenderingContext.framebufferRenderbuffer; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.framebufferRenderbuffer')
   void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, WebGLRenderbuffer renderbuffer) native;
 
-  /// @domName WebGLRenderingContext.framebufferTexture2D; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.framebufferTexture2D')
   void framebufferTexture2D(int target, int attachment, int textarget, WebGLTexture texture, int level) native;
 
-  /// @domName WebGLRenderingContext.frontFace; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.frontFace')
   void frontFace(int mode) native;
 
-  /// @domName WebGLRenderingContext.generateMipmap; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.generateMipmap')
   void generateMipmap(int target) native;
 
-  /// @domName WebGLRenderingContext.getActiveAttrib; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getActiveAttrib')
   WebGLActiveInfo getActiveAttrib(WebGLProgram program, int index) native;
 
-  /// @domName WebGLRenderingContext.getActiveUniform; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getActiveUniform')
   WebGLActiveInfo getActiveUniform(WebGLProgram program, int index) native;
 
-  /// @domName WebGLRenderingContext.getAttachedShaders; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getAttachedShaders')
   void getAttachedShaders(WebGLProgram program) native;
 
-  /// @domName WebGLRenderingContext.getAttribLocation; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getAttribLocation')
   int getAttribLocation(WebGLProgram program, String name) native;
 
-  /// @domName WebGLRenderingContext.getBufferParameter; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getBufferParameter')
   Object getBufferParameter(int target, int pname) native;
 
-  /// @domName WebGLRenderingContext.getContextAttributes; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getContextAttributes')
   WebGLContextAttributes getContextAttributes() native;
 
-  /// @domName WebGLRenderingContext.getError; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getError')
   int getError() native;
 
-  /// @domName WebGLRenderingContext.getExtension; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getExtension')
   Object getExtension(String name) native;
 
-  /// @domName WebGLRenderingContext.getFramebufferAttachmentParameter; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getFramebufferAttachmentParameter')
   Object getFramebufferAttachmentParameter(int target, int attachment, int pname) native;
 
-  /// @domName WebGLRenderingContext.getParameter; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getParameter')
   Object getParameter(int pname) native;
 
-  /// @domName WebGLRenderingContext.getProgramInfoLog; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getProgramInfoLog')
   String getProgramInfoLog(WebGLProgram program) native;
 
-  /// @domName WebGLRenderingContext.getProgramParameter; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getProgramParameter')
   Object getProgramParameter(WebGLProgram program, int pname) native;
 
-  /// @domName WebGLRenderingContext.getRenderbufferParameter; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getRenderbufferParameter')
   Object getRenderbufferParameter(int target, int pname) native;
 
-  /// @domName WebGLRenderingContext.getShaderInfoLog; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getShaderInfoLog')
   String getShaderInfoLog(WebGLShader shader) native;
 
-  /// @domName WebGLRenderingContext.getShaderParameter; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getShaderParameter')
   Object getShaderParameter(WebGLShader shader, int pname) native;
 
-  /// @domName WebGLRenderingContext.getShaderPrecisionFormat; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getShaderPrecisionFormat')
   WebGLShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) native;
 
-  /// @domName WebGLRenderingContext.getShaderSource; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getShaderSource')
   String getShaderSource(WebGLShader shader) native;
 
-  /// @domName WebGLRenderingContext.getSupportedExtensions; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getSupportedExtensions')
   List<String> getSupportedExtensions() native;
 
-  /// @domName WebGLRenderingContext.getTexParameter; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getTexParameter')
   Object getTexParameter(int target, int pname) native;
 
-  /// @domName WebGLRenderingContext.getUniform; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getUniform')
   Object getUniform(WebGLProgram program, WebGLUniformLocation location) native;
 
-  /// @domName WebGLRenderingContext.getUniformLocation; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getUniformLocation')
   WebGLUniformLocation getUniformLocation(WebGLProgram program, String name) native;
 
-  /// @domName WebGLRenderingContext.getVertexAttrib; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getVertexAttrib')
   Object getVertexAttrib(int index, int pname) native;
 
-  /// @domName WebGLRenderingContext.getVertexAttribOffset; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.getVertexAttribOffset')
   int getVertexAttribOffset(int index, int pname) native;
 
-  /// @domName WebGLRenderingContext.hint; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.hint')
   void hint(int target, int mode) native;
 
-  /// @domName WebGLRenderingContext.isBuffer; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.isBuffer')
   bool isBuffer(WebGLBuffer buffer) native;
 
-  /// @domName WebGLRenderingContext.isContextLost; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.isContextLost')
   bool isContextLost() native;
 
-  /// @domName WebGLRenderingContext.isEnabled; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.isEnabled')
   bool isEnabled(int cap) native;
 
-  /// @domName WebGLRenderingContext.isFramebuffer; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.isFramebuffer')
   bool isFramebuffer(WebGLFramebuffer framebuffer) native;
 
-  /// @domName WebGLRenderingContext.isProgram; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.isProgram')
   bool isProgram(WebGLProgram program) native;
 
-  /// @domName WebGLRenderingContext.isRenderbuffer; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.isRenderbuffer')
   bool isRenderbuffer(WebGLRenderbuffer renderbuffer) native;
 
-  /// @domName WebGLRenderingContext.isShader; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.isShader')
   bool isShader(WebGLShader shader) native;
 
-  /// @domName WebGLRenderingContext.isTexture; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.isTexture')
   bool isTexture(WebGLTexture texture) native;
 
-  /// @domName WebGLRenderingContext.lineWidth; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.lineWidth')
   void lineWidth(num width) native;
 
-  /// @domName WebGLRenderingContext.linkProgram; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.linkProgram')
   void linkProgram(WebGLProgram program) native;
 
-  /// @domName WebGLRenderingContext.pixelStorei; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.pixelStorei')
   void pixelStorei(int pname, int param) native;
 
-  /// @domName WebGLRenderingContext.polygonOffset; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.polygonOffset')
   void polygonOffset(num factor, num units) native;
 
-  /// @domName WebGLRenderingContext.readPixels; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.readPixels')
   void readPixels(int x, int y, int width, int height, int format, int type, ArrayBufferView pixels) native;
 
-  /// @domName WebGLRenderingContext.releaseShaderCompiler; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.releaseShaderCompiler')
   void releaseShaderCompiler() native;
 
-  /// @domName WebGLRenderingContext.renderbufferStorage; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.renderbufferStorage')
   void renderbufferStorage(int target, int internalformat, int width, int height) native;
 
-  /// @domName WebGLRenderingContext.sampleCoverage; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.sampleCoverage')
   void sampleCoverage(num value, bool invert) native;
 
-  /// @domName WebGLRenderingContext.scissor; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.scissor')
   void scissor(int x, int y, int width, int height) native;
 
-  /// @domName WebGLRenderingContext.shaderSource; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.shaderSource')
   void shaderSource(WebGLShader shader, String string) native;
 
-  /// @domName WebGLRenderingContext.stencilFunc; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.stencilFunc')
   void stencilFunc(int func, int ref, int mask) native;
 
-  /// @domName WebGLRenderingContext.stencilFuncSeparate; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.stencilFuncSeparate')
   void stencilFuncSeparate(int face, int func, int ref, int mask) native;
 
-  /// @domName WebGLRenderingContext.stencilMask; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.stencilMask')
   void stencilMask(int mask) native;
 
-  /// @domName WebGLRenderingContext.stencilMaskSeparate; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.stencilMaskSeparate')
   void stencilMaskSeparate(int face, int mask) native;
 
-  /// @domName WebGLRenderingContext.stencilOp; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.stencilOp')
   void stencilOp(int fail, int zfail, int zpass) native;
 
-  /// @domName WebGLRenderingContext.stencilOpSeparate; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.stencilOpSeparate')
   void stencilOpSeparate(int face, int fail, int zfail, int zpass) native;
 
-  /// @domName WebGLRenderingContext.texImage2D; @docsEditable true
   void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, ArrayBufferView pixels]) {
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null)) {
       _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
@@ -21789,23 +22344,27 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('texImage2D')
+  @DocsEditable @DomName('WebGLRenderingContext.texImage2D')
   void _texImage2D_1(target, level, internalformat, width, height, int border, format, type, ArrayBufferView pixels) native;
   @JSName('texImage2D')
+  @DocsEditable @DomName('WebGLRenderingContext.texImage2D')
   void _texImage2D_2(target, level, internalformat, format, type, pixels) native;
   @JSName('texImage2D')
+  @DocsEditable @DomName('WebGLRenderingContext.texImage2D')
   void _texImage2D_3(target, level, internalformat, format, type, ImageElement image) native;
   @JSName('texImage2D')
+  @DocsEditable @DomName('WebGLRenderingContext.texImage2D')
   void _texImage2D_4(target, level, internalformat, format, type, CanvasElement canvas) native;
   @JSName('texImage2D')
+  @DocsEditable @DomName('WebGLRenderingContext.texImage2D')
   void _texImage2D_5(target, level, internalformat, format, type, VideoElement video) native;
 
-  /// @domName WebGLRenderingContext.texParameterf; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.texParameterf')
   void texParameterf(int target, int pname, num param) native;
 
-  /// @domName WebGLRenderingContext.texParameteri; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.texParameteri')
   void texParameteri(int target, int pname, int param) native;
 
-  /// @domName WebGLRenderingContext.texSubImage2D; @docsEditable true
   void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, ArrayBufferView pixels]) {
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null)) {
       _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
@@ -21839,107 +22398,112 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('texSubImage2D')
+  @DocsEditable @DomName('WebGLRenderingContext.texSubImage2D')
   void _texSubImage2D_1(target, level, xoffset, yoffset, width, height, int format, type, ArrayBufferView pixels) native;
   @JSName('texSubImage2D')
+  @DocsEditable @DomName('WebGLRenderingContext.texSubImage2D')
   void _texSubImage2D_2(target, level, xoffset, yoffset, format, type, pixels) native;
   @JSName('texSubImage2D')
+  @DocsEditable @DomName('WebGLRenderingContext.texSubImage2D')
   void _texSubImage2D_3(target, level, xoffset, yoffset, format, type, ImageElement image) native;
   @JSName('texSubImage2D')
+  @DocsEditable @DomName('WebGLRenderingContext.texSubImage2D')
   void _texSubImage2D_4(target, level, xoffset, yoffset, format, type, CanvasElement canvas) native;
   @JSName('texSubImage2D')
+  @DocsEditable @DomName('WebGLRenderingContext.texSubImage2D')
   void _texSubImage2D_5(target, level, xoffset, yoffset, format, type, VideoElement video) native;
 
-  /// @domName WebGLRenderingContext.uniform1f; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniform1f')
   void uniform1f(WebGLUniformLocation location, num x) native;
 
-  /// @domName WebGLRenderingContext.uniform1fv; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniform1fv')
   void uniform1fv(WebGLUniformLocation location, Float32Array v) native;
 
-  /// @domName WebGLRenderingContext.uniform1i; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniform1i')
   void uniform1i(WebGLUniformLocation location, int x) native;
 
-  /// @domName WebGLRenderingContext.uniform1iv; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniform1iv')
   void uniform1iv(WebGLUniformLocation location, Int32Array v) native;
 
-  /// @domName WebGLRenderingContext.uniform2f; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniform2f')
   void uniform2f(WebGLUniformLocation location, num x, num y) native;
 
-  /// @domName WebGLRenderingContext.uniform2fv; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniform2fv')
   void uniform2fv(WebGLUniformLocation location, Float32Array v) native;
 
-  /// @domName WebGLRenderingContext.uniform2i; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniform2i')
   void uniform2i(WebGLUniformLocation location, int x, int y) native;
 
-  /// @domName WebGLRenderingContext.uniform2iv; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniform2iv')
   void uniform2iv(WebGLUniformLocation location, Int32Array v) native;
 
-  /// @domName WebGLRenderingContext.uniform3f; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniform3f')
   void uniform3f(WebGLUniformLocation location, num x, num y, num z) native;
 
-  /// @domName WebGLRenderingContext.uniform3fv; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniform3fv')
   void uniform3fv(WebGLUniformLocation location, Float32Array v) native;
 
-  /// @domName WebGLRenderingContext.uniform3i; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniform3i')
   void uniform3i(WebGLUniformLocation location, int x, int y, int z) native;
 
-  /// @domName WebGLRenderingContext.uniform3iv; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniform3iv')
   void uniform3iv(WebGLUniformLocation location, Int32Array v) native;
 
-  /// @domName WebGLRenderingContext.uniform4f; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniform4f')
   void uniform4f(WebGLUniformLocation location, num x, num y, num z, num w) native;
 
-  /// @domName WebGLRenderingContext.uniform4fv; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniform4fv')
   void uniform4fv(WebGLUniformLocation location, Float32Array v) native;
 
-  /// @domName WebGLRenderingContext.uniform4i; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniform4i')
   void uniform4i(WebGLUniformLocation location, int x, int y, int z, int w) native;
 
-  /// @domName WebGLRenderingContext.uniform4iv; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniform4iv')
   void uniform4iv(WebGLUniformLocation location, Int32Array v) native;
 
-  /// @domName WebGLRenderingContext.uniformMatrix2fv; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniformMatrix2fv')
   void uniformMatrix2fv(WebGLUniformLocation location, bool transpose, Float32Array array) native;
 
-  /// @domName WebGLRenderingContext.uniformMatrix3fv; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniformMatrix3fv')
   void uniformMatrix3fv(WebGLUniformLocation location, bool transpose, Float32Array array) native;
 
-  /// @domName WebGLRenderingContext.uniformMatrix4fv; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.uniformMatrix4fv')
   void uniformMatrix4fv(WebGLUniformLocation location, bool transpose, Float32Array array) native;
 
-  /// @domName WebGLRenderingContext.useProgram; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.useProgram')
   void useProgram(WebGLProgram program) native;
 
-  /// @domName WebGLRenderingContext.validateProgram; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.validateProgram')
   void validateProgram(WebGLProgram program) native;
 
-  /// @domName WebGLRenderingContext.vertexAttrib1f; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.vertexAttrib1f')
   void vertexAttrib1f(int indx, num x) native;
 
-  /// @domName WebGLRenderingContext.vertexAttrib1fv; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.vertexAttrib1fv')
   void vertexAttrib1fv(int indx, Float32Array values) native;
 
-  /// @domName WebGLRenderingContext.vertexAttrib2f; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.vertexAttrib2f')
   void vertexAttrib2f(int indx, num x, num y) native;
 
-  /// @domName WebGLRenderingContext.vertexAttrib2fv; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.vertexAttrib2fv')
   void vertexAttrib2fv(int indx, Float32Array values) native;
 
-  /// @domName WebGLRenderingContext.vertexAttrib3f; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.vertexAttrib3f')
   void vertexAttrib3f(int indx, num x, num y, num z) native;
 
-  /// @domName WebGLRenderingContext.vertexAttrib3fv; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.vertexAttrib3fv')
   void vertexAttrib3fv(int indx, Float32Array values) native;
 
-  /// @domName WebGLRenderingContext.vertexAttrib4f; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.vertexAttrib4f')
   void vertexAttrib4f(int indx, num x, num y, num z, num w) native;
 
-  /// @domName WebGLRenderingContext.vertexAttrib4fv; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.vertexAttrib4fv')
   void vertexAttrib4fv(int indx, Float32Array values) native;
 
-  /// @domName WebGLRenderingContext.vertexAttribPointer; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.vertexAttribPointer')
   void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) native;
 
-  /// @domName WebGLRenderingContext.viewport; @docsEditable true
+  @DocsEditable @DomName('WebGLRenderingContext.viewport')
   void viewport(int x, int y, int width, int height) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21947,7 +22511,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLShader; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLShader')
 class WebGLShader native "*WebGLShader" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21955,16 +22521,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLShaderPrecisionFormat; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLShaderPrecisionFormat')
 class WebGLShaderPrecisionFormat native "*WebGLShaderPrecisionFormat" {
 
-  /// @domName WebGLShaderPrecisionFormat.precision; @docsEditable true
+  @DocsEditable @DomName('WebGLShaderPrecisionFormat.precision')
   final int precision;
 
-  /// @domName WebGLShaderPrecisionFormat.rangeMax; @docsEditable true
+  @DocsEditable @DomName('WebGLShaderPrecisionFormat.rangeMax')
   final int rangeMax;
 
-  /// @domName WebGLShaderPrecisionFormat.rangeMin; @docsEditable true
+  @DocsEditable @DomName('WebGLShaderPrecisionFormat.rangeMin')
   final int rangeMin;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21972,7 +22540,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLTexture; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLTexture')
 class WebGLTexture native "*WebGLTexture" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21980,7 +22550,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLUniformLocation; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLUniformLocation')
 class WebGLUniformLocation native "*WebGLUniformLocation" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21988,7 +22560,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLVertexArrayObjectOES; @docsEditable true
+
+@DocsEditable
+@DomName('WebGLVertexArrayObjectOES')
 class WebGLVertexArrayObject native "*WebGLVertexArrayObjectOES" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21996,7 +22570,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitCSSFilterValue; @docsEditable true
+
+@DocsEditable
+@DomName('WebKitCSSFilterValue')
 class WebKitCssFilterValue extends _CssValueList native "*WebKitCSSFilterValue" {
 
   static const int CSS_FILTER_BLUR = 10;
@@ -22023,7 +22599,7 @@
 
   static const int CSS_FILTER_SEPIA = 3;
 
-  /// @domName WebKitCSSFilterValue.operationType; @docsEditable true
+  @DocsEditable @DomName('WebKitCSSFilterValue.operationType')
   final int operationType;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22031,7 +22607,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitCSSMixFunctionValue; @docsEditable true
+
+@DocsEditable
+@DomName('WebKitCSSMixFunctionValue')
 class WebKitCssMixFunctionValue extends _CssValueList native "*WebKitCSSMixFunctionValue" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22039,40 +22617,42 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitNamedFlow; @docsEditable true
+
+@DocsEditable
+@DomName('WebKitNamedFlow')
 class WebKitNamedFlow extends EventTarget native "*WebKitNamedFlow" {
 
-  /// @domName WebKitNamedFlow.firstEmptyRegionIndex; @docsEditable true
+  @DocsEditable @DomName('WebKitNamedFlow.firstEmptyRegionIndex')
   final int firstEmptyRegionIndex;
 
-  /// @domName WebKitNamedFlow.name; @docsEditable true
+  @DocsEditable @DomName('WebKitNamedFlow.name')
   final String name;
 
-  /// @domName WebKitNamedFlow.overset; @docsEditable true
+  @DocsEditable @DomName('WebKitNamedFlow.overset')
   final bool overset;
 
-  /// @domName WebKitNamedFlow.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('WebKitNamedFlow.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName WebKitNamedFlow.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('WebKitNamedFlow.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native;
 
-  /// @domName WebKitNamedFlow.getContent; @docsEditable true
+  @DocsEditable @DomName('WebKitNamedFlow.getContent')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> getContent() native;
 
-  /// @domName WebKitNamedFlow.getRegions; @docsEditable true
+  @DocsEditable @DomName('WebKitNamedFlow.getRegions')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> getRegions() native;
 
-  /// @domName WebKitNamedFlow.getRegionsByContent; @docsEditable true
+  @DocsEditable @DomName('WebKitNamedFlow.getRegionsByContent')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> getRegionsByContent(Node contentNode) native;
 
-  /// @domName WebKitNamedFlow.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('WebKitNamedFlow.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22080,7 +22660,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebSocket; @docsEditable true
+
+@DocsEditable
+@DomName('WebSocket')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -22095,14 +22677,15 @@
 
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
 
-  ///@docsEditable true
+  @DocsEditable
   factory WebSocket(String url) => WebSocket._create(url);
   static WebSocket _create(String url) => JS('WebSocket', 'new WebSocket(#)', url);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', 'typeof window.WebSocket != "undefined"');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   WebSocketEvents get on =>
     new WebSocketEvents(this);
 
@@ -22114,44 +22697,44 @@
 
   static const int OPEN = 1;
 
-  /// @domName WebSocket.URL; @docsEditable true
   @JSName('URL')
+  @DocsEditable @DomName('WebSocket.URL')
   final String Url;
 
-  /// @domName WebSocket.binaryType; @docsEditable true
+  @DocsEditable @DomName('WebSocket.binaryType')
   String binaryType;
 
-  /// @domName WebSocket.bufferedAmount; @docsEditable true
+  @DocsEditable @DomName('WebSocket.bufferedAmount')
   final int bufferedAmount;
 
-  /// @domName WebSocket.extensions; @docsEditable true
+  @DocsEditable @DomName('WebSocket.extensions')
   final String extensions;
 
-  /// @domName WebSocket.protocol; @docsEditable true
+  @DocsEditable @DomName('WebSocket.protocol')
   final String protocol;
 
-  /// @domName WebSocket.readyState; @docsEditable true
+  @DocsEditable @DomName('WebSocket.readyState')
   final int readyState;
 
-  /// @domName WebSocket.url; @docsEditable true
+  @DocsEditable @DomName('WebSocket.url')
   final String url;
 
-  /// @domName WebSocket.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('WebSocket.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName WebSocket.close; @docsEditable true
+  @DocsEditable @DomName('WebSocket.close')
   void close([int code, String reason]) native;
 
-  /// @domName WebSocket.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('WebSocket.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName WebSocket.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('WebSocket.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName WebSocket.send; @docsEditable true
+  @DocsEditable @DomName('WebSocket.send')
   void send(data) native;
 
   Stream<CloseEvent> get onClose => closeEvent.forTarget(this);
@@ -22163,21 +22746,21 @@
   Stream<Event> get onOpen => openEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class WebSocketEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   WebSocketEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get close => this['close'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get message => this['message'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get open => this['open'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22185,17 +22768,80 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WheelEvent
+@DocsEditable
+@DomName('WheelEvent')
 class WheelEvent extends MouseEvent native "*WheelEvent" {
 
-  /// @domName WheelEvent.webkitDirectionInvertedFromDevice; @docsEditable true
+  factory WheelEvent(String type, Window view, int wheelDeltaX, int wheelDeltaY,
+      int detail, int screenX, int screenY, int clientX, int clientY,
+      int button,
+      [bool canBubble = true, bool cancelable = true, bool ctrlKey = false,
+      bool altKey = false, bool shiftKey = false, bool metaKey = false,
+      EventTarget relatedTarget = null]) {
+
+    var eventType = 'WheelEvent';
+    if (_Device.isFirefox) {
+      eventType = 'MouseScrollEvents';
+    }
+    final event = document.$dom_createEvent(eventType);
+    if (event._hasInitWheelEvent) {
+      var modifiers = [];
+      if (ctrlKey) {
+        modifiers.push('Control');
+      }
+      if (altKey) {
+        modifiers.push('Alt');
+      }
+      if (shiftKey) {
+        modifiers.push('Shift');
+      }
+      if (metaKey) {
+        modifiers.push('Meta');
+      }
+      event._initWheelEvent(type, canBubble, cancelable, view, detail, screenX,
+          screenY, clientX, clientY, button, relatedTarget, modifiers.join(' '),
+          wheelDeltaX, wheelDeltaY, 0, 0);
+    } else if (event._hasInitMouseScrollEvent) {
+      var axis = 0;
+      var detail = 0;
+      if (wheelDeltaX != 0 && wheelDeltaY != 0) {
+        throw UnsupportedError(
+            'Cannot modify wheelDeltaX and wheelDeltaY simultaneously');
+      }
+      if (wheelDeltaY != 0) {
+        detail = wheelDeltaY;
+        axis = JS('int', 'MouseScrollEvent.VERTICAL_AXIS');
+      } else if (wheelDeltaX != 0) {
+        detail = wheelDeltaX;
+        axis = JS('int', 'MouseScrollEvent.HORIZONTAL_AXIS');
+      }
+      event._initMouseScrollEvent(type, canBubble, cancelable, view, detail,
+          screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
+          metaKey, button, relatedTarget, axis);
+    } else {
+      // Fallthrough for Dartium.
+      event.$dom_initMouseEvent(type, canBubble, cancelable, view, detail,
+          screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
+          metaKey, button, relatedTarget);
+      event.$dom_initWebKitWheelEvent(wheelDeltaX,
+          wheelDeltaY ~/ 120, // Chrome does an auto-convert to pixels.
+          view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
+          metaKey);
+    }
+
+    return event;
+  }
+
+
+  @DocsEditable @DomName('WheelEvent.webkitDirectionInvertedFromDevice')
   final bool webkitDirectionInvertedFromDevice;
 
-  /// @domName WheelEvent.initWebKitWheelEvent; @docsEditable true
-  void initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native;
+  @JSName('initWebKitWheelEvent')
+  @DocsEditable @DomName('WheelEvent.initWebKitWheelEvent')
+  void $dom_initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native;
 
 
-  /** @domName WheelEvent.deltaY */
+  @DomName('WheelEvent.deltaY')
   num get deltaY {
     if (JS('bool', '#.deltaY !== undefined', this)) {
       // W3C WheelEvent
@@ -22223,7 +22869,7 @@
         'deltaY is not supported');
   }
 
-  /** @domName WheelEvent.deltaX */
+  @DomName('WheelEvent.deltaX')
   num get deltaX {
     if (JS('bool', '#.deltaX !== undefined', this)) {
       // W3C WheelEvent
@@ -22237,7 +22883,8 @@
 
       // Handle DOMMouseScroll case where it uses detail and the axis to
       // differentiate.
-      if (JS('bool', '#.axis !== undefined && #.axis == MouseScrollEvent.HORIZONTAL_AXIS', this, this)) {
+      if (JS('bool', '#.axis !== undefined && '
+        '#.axis == MouseScrollEvent.HORIZONTAL_AXIS', this, this)) {
         var detail = this._detail;
         // Firefox is normally the number of lines to scale (normally 3)
         // so multiply it by 40 to get pixels to move, matching IE & WebKit.
@@ -22267,13 +22914,57 @@
   num get _detail => JS('num', '#.detail', this);
   int get _deltaMode => JS('int', '#.deltaMode', this);
 
+  bool get _hasInitMouseScrollEvent =>
+      JS('bool', '!!(#.initMouseScrollEvent)', this);
+
+  @JSName('initMouseScrollEvent')
+  void _initMouseScrollEvent(
+      String type,
+      bool canBubble,
+      bool cancelable,
+      Window view,
+      int detail,
+      int screenX,
+      int screenY,
+      int clientX,
+      int clientY,
+      bool ctrlKey,
+      bool altKey,
+      bool shiftKey,
+      bool metaKey,
+      int button,
+      EventTarget relatedTarget,
+      int axis) native;
+
+  bool get _hasInitWheelEvent =>
+      JS('bool', '!!(#.initWheelEvent)', this);
+  @JSName('initWheelEvent')
+  void _initWheelEvent(
+      String eventType,
+      bool canBubble,
+      bool cancelable,
+      Window view,
+      int detail,
+      int screenX,
+      int screenY,
+      int clientX,
+      int clientY,
+      int button,
+      EventTarget relatedTarget,
+      String modifiersList,
+      int deltaX,
+      int deltaY,
+      int deltaZ,
+      int deltaMode) native;
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Window
+@DocsEditable
+@DomName('Window')
 class Window extends EventTarget implements WindowBase native "@*DOMWindow" {
 
   Document get document => JS('Document', '#.document', this);
@@ -22349,7 +23040,7 @@
     _addMeasurementFrameCallback(callback);
   }
 
-  /** @domName DOMWindow.requestAnimationFrame */
+  @DomName('DOMWindow.requestAnimationFrame')
   int requestAnimationFrame(RequestAnimationFrameCallback callback) {
     _ensureRequestAnimationFrame();
     return _requestAnimationFrame(callback);
@@ -22426,92 +23117,22 @@
     document.documentElement.attributes['dart-port:$name'] = json.stringify(serialized);
   }
 
-  /// @domName Window.console; @docsEditable true
+  @DomName('Window.console')
   Console get console => Console.safeConsole;
 
 
   static const EventStreamProvider<Event> contentLoadedEvent = const EventStreamProvider<Event>('DOMContentLoaded');
 
-  static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
-
   static const EventStreamProvider<Event> beforeUnloadEvent = const EventStreamProvider<Event>('beforeunload');
 
-  static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
-
-  static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');
-
-  static const EventStreamProvider<Event> canPlayThroughEvent = const EventStreamProvider<Event>('canplaythrough');
-
-  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
-
-  static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
-
-  static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
-
-  static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
-
   static const EventStreamProvider<DeviceMotionEvent> deviceMotionEvent = const EventStreamProvider<DeviceMotionEvent>('devicemotion');
 
   static const EventStreamProvider<DeviceOrientationEvent> deviceOrientationEvent = const EventStreamProvider<DeviceOrientationEvent>('deviceorientation');
 
-  static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
-
-  static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
-
-  static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
-
-  static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
-
-  static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
-
-  static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
-
-  static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
-
-  static const EventStreamProvider<Event> durationChangeEvent = const EventStreamProvider<Event>('durationchange');
-
-  static const EventStreamProvider<Event> emptiedEvent = const EventStreamProvider<Event>('emptied');
-
-  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
-
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
-
-  static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
-
   static const EventStreamProvider<HashChangeEvent> hashChangeEvent = const EventStreamProvider<HashChangeEvent>('hashchange');
 
-  static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
-
-  static const EventStreamProvider<Event> invalidEvent = const EventStreamProvider<Event>('invalid');
-
-  static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
-
-  static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
-
-  static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
-
-  static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
-
-  static const EventStreamProvider<Event> loadedDataEvent = const EventStreamProvider<Event>('loadeddata');
-
-  static const EventStreamProvider<Event> loadedMetadataEvent = const EventStreamProvider<Event>('loadedmetadata');
-
-  static const EventStreamProvider<Event> loadStartEvent = const EventStreamProvider<Event>('loadstart');
-
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
-  static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
-
-  static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
-
-  static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
-
-  static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
-
-  static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
-
-  static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
-
   static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');
 
   static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');
@@ -22520,65 +23141,22 @@
 
   static const EventStreamProvider<Event> pageShowEvent = const EventStreamProvider<Event>('pageshow');
 
-  static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
-
-  static const EventStreamProvider<Event> playEvent = const EventStreamProvider<Event>('play');
-
-  static const EventStreamProvider<Event> playingEvent = const EventStreamProvider<Event>('playing');
-
   static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
 
-  static const EventStreamProvider<Event> progressEvent = const EventStreamProvider<Event>('progress');
-
-  static const EventStreamProvider<Event> rateChangeEvent = const EventStreamProvider<Event>('ratechange');
-
-  static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
-
   static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
 
-  static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
-
-  static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
-
-  static const EventStreamProvider<Event> seekedEvent = const EventStreamProvider<Event>('seeked');
-
-  static const EventStreamProvider<Event> seekingEvent = const EventStreamProvider<Event>('seeking');
-
-  static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
-
-  static const EventStreamProvider<Event> stalledEvent = const EventStreamProvider<Event>('stalled');
-
   static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');
 
-  static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
-
-  static const EventStreamProvider<Event> suspendEvent = const EventStreamProvider<Event>('suspend');
-
-  static const EventStreamProvider<Event> timeUpdateEvent = const EventStreamProvider<Event>('timeupdate');
-
-  static const EventStreamProvider<TouchEvent> touchCancelEvent = const EventStreamProvider<TouchEvent>('touchcancel');
-
-  static const EventStreamProvider<TouchEvent> touchEndEvent = const EventStreamProvider<TouchEvent>('touchend');
-
-  static const EventStreamProvider<TouchEvent> touchMoveEvent = const EventStreamProvider<TouchEvent>('touchmove');
-
-  static const EventStreamProvider<TouchEvent> touchStartEvent = const EventStreamProvider<TouchEvent>('touchstart');
-
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
 
-  static const EventStreamProvider<Event> volumeChangeEvent = const EventStreamProvider<Event>('volumechange');
-
-  static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
-
   static const EventStreamProvider<AnimationEvent> animationEndEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationEnd');
 
   static const EventStreamProvider<AnimationEvent> animationIterationEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationIteration');
 
   static const EventStreamProvider<AnimationEvent> animationStartEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationStart');
 
-  static const EventStreamProvider<TransitionEvent> transitionEndEvent = const EventStreamProvider<TransitionEvent>('webkitTransitionEnd');
-
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   WindowEvents get on =>
     new WindowEvents(this);
 
@@ -22586,212 +23164,205 @@
 
   static const int TEMPORARY = 0;
 
-  /// @domName Window.applicationCache; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.applicationCache')
   final ApplicationCache applicationCache;
 
-  /// @domName Window.closed; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.closed')
   final bool closed;
 
-  /// @domName Window.crypto; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.crypto')
   final Crypto crypto;
 
-  /// @domName Window.defaultStatus; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.defaultStatus')
   String defaultStatus;
 
-  /// @domName Window.defaultstatus; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.defaultstatus')
   String defaultstatus;
 
-  /// @domName Window.devicePixelRatio; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.devicePixelRatio')
   final num devicePixelRatio;
 
-  /// @domName Window.event; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.event')
   final Event event;
 
-  /// @domName Window.history; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.history')
   final History history;
 
-  /// @domName Window.innerHeight; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.innerHeight')
   final int innerHeight;
 
-  /// @domName Window.innerWidth; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.innerWidth')
   final int innerWidth;
 
-  /// @domName Window.localStorage; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.localStorage')
   final Storage localStorage;
 
-  /// @domName Window.locationbar; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.locationbar')
   final BarInfo locationbar;
 
-  /// @domName Window.menubar; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.menubar')
   final BarInfo menubar;
 
-  /// @domName Window.name; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.name')
   String name;
 
-  /// @domName Window.navigator; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.navigator')
   final Navigator navigator;
 
-  /// @domName Window.offscreenBuffering; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.offscreenBuffering')
   final bool offscreenBuffering;
 
-  /// @domName Window.opener; @docsEditable true
   WindowBase get opener => _convertNativeToDart_Window(this._opener);
   @JSName('opener')
-  @Creates('Window|=Object') @Returns('Window|=Object')
+  @DocsEditable @DomName('DOMWindow.opener') @Creates('Window|=Object') @Returns('Window|=Object')
   final dynamic _opener;
 
-  /// @domName Window.outerHeight; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.outerHeight')
   final int outerHeight;
 
-  /// @domName Window.outerWidth; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.outerWidth')
   final int outerWidth;
 
-  /// @domName DOMWindow.pagePopupController; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.pagePopupController')
   final PagePopupController pagePopupController;
 
-  /// @domName Window.pageXOffset; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.pageXOffset')
   final int pageXOffset;
 
-  /// @domName Window.pageYOffset; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.pageYOffset')
   final int pageYOffset;
 
-  /// @domName Window.parent; @docsEditable true
   WindowBase get parent => _convertNativeToDart_Window(this._parent);
   @JSName('parent')
-  @Creates('Window|=Object') @Returns('Window|=Object')
+  @DocsEditable @DomName('DOMWindow.parent') @Creates('Window|=Object') @Returns('Window|=Object')
   final dynamic _parent;
 
-  /// @domName Window.performance; @docsEditable true
-  @SupportedBrowser(SupportedBrowser.CHROME) @SupportedBrowser(SupportedBrowser.FIREFOX) @SupportedBrowser(SupportedBrowser.IE)
+  @DocsEditable @DomName('DOMWindow.performance') @SupportedBrowser(SupportedBrowser.CHROME) @SupportedBrowser(SupportedBrowser.FIREFOX) @SupportedBrowser(SupportedBrowser.IE)
   final Performance performance;
 
-  /// @domName Window.personalbar; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.personalbar')
   final BarInfo personalbar;
 
-  /// @domName Window.screen; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.screen')
   final Screen screen;
 
-  /// @domName Window.screenLeft; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.screenLeft')
   final int screenLeft;
 
-  /// @domName Window.screenTop; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.screenTop')
   final int screenTop;
 
-  /// @domName Window.screenX; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.screenX')
   final int screenX;
 
-  /// @domName Window.screenY; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.screenY')
   final int screenY;
 
-  /// @domName Window.scrollX; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.scrollX')
   final int scrollX;
 
-  /// @domName Window.scrollY; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.scrollY')
   final int scrollY;
 
-  /// @domName Window.scrollbars; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.scrollbars')
   final BarInfo scrollbars;
 
-  /// @domName Window.self; @docsEditable true
   WindowBase get self => _convertNativeToDart_Window(this._self);
   @JSName('self')
-  @Creates('Window|=Object') @Returns('Window|=Object')
+  @DocsEditable @DomName('DOMWindow.self') @Creates('Window|=Object') @Returns('Window|=Object')
   final dynamic _self;
 
-  /// @domName Window.sessionStorage; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.sessionStorage')
   final Storage sessionStorage;
 
-  /// @domName Window.status; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.status')
   String status;
 
-  /// @domName Window.statusbar; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.statusbar')
   final BarInfo statusbar;
 
-  /// @domName Window.styleMedia; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.styleMedia')
   final StyleMedia styleMedia;
 
-  /// @domName Window.toolbar; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.toolbar')
   final BarInfo toolbar;
 
-  /// @domName Window.top; @docsEditable true
   WindowBase get top => _convertNativeToDart_Window(this._top);
   @JSName('top')
-  @Creates('Window|=Object') @Returns('Window|=Object')
+  @DocsEditable @DomName('DOMWindow.top') @Creates('Window|=Object') @Returns('Window|=Object')
   final dynamic _top;
 
-  /// @domName DOMWindow.webkitNotifications; @docsEditable true
-  final NotificationCenter webkitNotifications;
+  @JSName('webkitNotifications')
+  @DocsEditable @DomName('DOMWindow.webkitNotifications') @SupportedBrowser(SupportedBrowser.CHROME) @SupportedBrowser(SupportedBrowser.SAFARI) @Experimental()
+  final NotificationCenter notifications;
 
-  /// @domName DOMWindow.webkitStorageInfo; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.webkitStorageInfo')
   final StorageInfo webkitStorageInfo;
 
-  /// @domName Window.window; @docsEditable true
   WindowBase get window => _convertNativeToDart_Window(this._window);
   @JSName('window')
-  @Creates('Window|=Object') @Returns('Window|=Object')
+  @DocsEditable @DomName('DOMWindow.window') @Creates('Window|=Object') @Returns('Window|=Object')
   final dynamic _window;
 
-  /// @domName Window.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('DOMWindow.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName Window.alert; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.alert')
   void alert(String message) native;
 
-  /// @domName Window.atob; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.atob')
   String atob(String string) native;
 
-  /// @domName Window.btoa; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.btoa')
   String btoa(String string) native;
 
-  /// @domName Window.captureEvents; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.captureEvents')
   void captureEvents() native;
 
-  /// @domName Window.clearInterval; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.clearInterval')
   void clearInterval(int handle) native;
 
-  /// @domName Window.clearTimeout; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.clearTimeout')
   void clearTimeout(int handle) native;
 
-  /// @domName Window.close; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.close')
   void close() native;
 
-  /// @domName Window.confirm; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.confirm')
   bool confirm(String message) native;
 
-  /// @domName Window.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('DOMWindow.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName Window.find; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.find')
   bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) native;
 
-  /// @domName Window.getComputedStyle; @docsEditable true
   @JSName('getComputedStyle')
+  @DocsEditable @DomName('DOMWindow.getComputedStyle')
   CssStyleDeclaration $dom_getComputedStyle(Element element, String pseudoElement) native;
 
-  /// @domName Window.getMatchedCSSRules; @docsEditable true
   @JSName('getMatchedCSSRules')
+  @DocsEditable @DomName('DOMWindow.getMatchedCSSRules')
   @Returns('_CssRuleList') @Creates('_CssRuleList')
   List<CssRule> getMatchedCssRules(Element element, String pseudoElement) native;
 
-  /// @domName Window.getSelection; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.getSelection')
   DomSelection getSelection() native;
 
-  /// @domName Window.matchMedia; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.matchMedia')
   MediaQueryList matchMedia(String query) native;
 
-  /// @domName Window.moveBy; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.moveBy')
   void moveBy(num x, num y) native;
 
-  /// @domName Window.moveTo; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.moveTo')
   void moveTo(num x, num y) native;
 
-  /// @domName DOMWindow.openDatabase; @docsEditable true
-  @Creates('Database') @Creates('DatabaseSync')
+  @DocsEditable @DomName('DOMWindow.openDatabase') @Creates('Database') @Creates('DatabaseSync')
   Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
 
-  /// @domName Window.postMessage; @docsEditable true
   void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) {
     if (?message &&
         !?messagePorts) {
@@ -22807,144 +23378,128 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('postMessage')
+  @DocsEditable @DomName('DOMWindow.postMessage')
   void _postMessage_1(message, targetOrigin) native;
   @JSName('postMessage')
+  @DocsEditable @DomName('DOMWindow.postMessage')
   void _postMessage_2(message, targetOrigin, List messagePorts) native;
 
-  /// @domName Window.print; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.print')
   void print() native;
 
-  /// @domName Window.releaseEvents; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.releaseEvents')
   void releaseEvents() native;
 
-  /// @domName Window.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('DOMWindow.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName Window.resizeBy; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.resizeBy')
   void resizeBy(num x, num y) native;
 
-  /// @domName Window.resizeTo; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.resizeTo')
   void resizeTo(num width, num height) native;
 
-  /// @domName Window.scroll; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.scroll')
   void scroll(int x, int y) native;
 
-  /// @domName Window.scrollBy; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.scrollBy')
   void scrollBy(int x, int y) native;
 
-  /// @domName Window.scrollTo; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.scrollTo')
   void scrollTo(int x, int y) native;
 
-  /// @domName Window.setInterval; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.setInterval')
   int setInterval(TimeoutHandler handler, int timeout) native;
 
-  /// @domName Window.setTimeout; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.setTimeout')
   int setTimeout(TimeoutHandler handler, int timeout) native;
 
-  /// @domName Window.showModalDialog; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.showModalDialog')
   Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) native;
 
-  /// @domName Window.stop; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.stop')
   void stop() native;
 
-  /// @domName Window.webkitConvertPointFromNodeToPage; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.webkitConvertPointFromNodeToPage')
   Point webkitConvertPointFromNodeToPage(Node node, Point p) native;
 
-  /// @domName Window.webkitConvertPointFromPageToNode; @docsEditable true
+  @DocsEditable @DomName('DOMWindow.webkitConvertPointFromPageToNode')
   Point webkitConvertPointFromPageToNode(Node node, Point p) native;
 
-  /// @domName DOMWindow.webkitRequestFileSystem; @docsEditable true
   @JSName('webkitRequestFileSystem')
-  @SupportedBrowser(SupportedBrowser.CHROME) @Experimental()
+  @DocsEditable @DomName('DOMWindow.webkitRequestFileSystem') @SupportedBrowser(SupportedBrowser.CHROME) @Experimental()
   void requestFileSystem(int type, int size, FileSystemCallback successCallback, [ErrorCallback errorCallback]) native;
 
-  /// @domName DOMWindow.webkitResolveLocalFileSystemURL; @docsEditable true
   @JSName('webkitResolveLocalFileSystemURL')
-  @SupportedBrowser(SupportedBrowser.CHROME) @Experimental()
+  @DocsEditable @DomName('DOMWindow.webkitResolveLocalFileSystemURL') @SupportedBrowser(SupportedBrowser.CHROME) @Experimental()
   void resolveLocalFileSystemUrl(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native;
 
   Stream<Event> get onContentLoaded => contentLoadedEvent.forTarget(this);
 
-  Stream<Event> get onAbort => abortEvent.forTarget(this);
+  Stream<Event> get onAbort => Element.abortEvent.forTarget(this);
 
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
-  Stream<Event> get onBlur => blurEvent.forTarget(this);
+  Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
-  Stream<Event> get onCanPlay => canPlayEvent.forTarget(this);
+  Stream<Event> get onChange => Element.changeEvent.forTarget(this);
 
-  Stream<Event> get onCanPlayThrough => canPlayThroughEvent.forTarget(this);
+  Stream<MouseEvent> get onClick => Element.clickEvent.forTarget(this);
 
-  Stream<Event> get onChange => changeEvent.forTarget(this);
+  Stream<MouseEvent> get onContextMenu => Element.contextMenuEvent.forTarget(this);
 
-  Stream<MouseEvent> get onClick => clickEvent.forTarget(this);
-
-  Stream<MouseEvent> get onContextMenu => contextMenuEvent.forTarget(this);
-
-  Stream<Event> get onDoubleClick => doubleClickEvent.forTarget(this);
+  Stream<Event> get onDoubleClick => Element.doubleClickEvent.forTarget(this);
 
   Stream<DeviceMotionEvent> get onDeviceMotion => deviceMotionEvent.forTarget(this);
 
   Stream<DeviceOrientationEvent> get onDeviceOrientation => deviceOrientationEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDrag => dragEvent.forTarget(this);
+  Stream<MouseEvent> get onDrag => Element.dragEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragEnd => dragEndEvent.forTarget(this);
+  Stream<MouseEvent> get onDragEnd => Element.dragEndEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragEnter => dragEnterEvent.forTarget(this);
+  Stream<MouseEvent> get onDragEnter => Element.dragEnterEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragLeave => dragLeaveEvent.forTarget(this);
+  Stream<MouseEvent> get onDragLeave => Element.dragLeaveEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragOver => dragOverEvent.forTarget(this);
+  Stream<MouseEvent> get onDragOver => Element.dragOverEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragStart => dragStartEvent.forTarget(this);
+  Stream<MouseEvent> get onDragStart => Element.dragStartEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDrop => dropEvent.forTarget(this);
+  Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
-  Stream<Event> get onDurationChange => durationChangeEvent.forTarget(this);
+  Stream<Event> get onError => Element.errorEvent.forTarget(this);
 
-  Stream<Event> get onEmptied => emptiedEvent.forTarget(this);
-
-  Stream<Event> get onEnded => endedEvent.forTarget(this);
-
-  Stream<Event> get onError => errorEvent.forTarget(this);
-
-  Stream<Event> get onFocus => focusEvent.forTarget(this);
+  Stream<Event> get onFocus => Element.focusEvent.forTarget(this);
 
   Stream<HashChangeEvent> get onHashChange => hashChangeEvent.forTarget(this);
 
-  Stream<Event> get onInput => inputEvent.forTarget(this);
+  Stream<Event> get onInput => Element.inputEvent.forTarget(this);
 
-  Stream<Event> get onInvalid => invalidEvent.forTarget(this);
+  Stream<Event> get onInvalid => Element.invalidEvent.forTarget(this);
 
-  Stream<KeyboardEvent> get onKeyDown => keyDownEvent.forTarget(this);
+  Stream<KeyboardEvent> get onKeyDown => Element.keyDownEvent.forTarget(this);
 
-  Stream<KeyboardEvent> get onKeyPress => keyPressEvent.forTarget(this);
+  Stream<KeyboardEvent> get onKeyPress => Element.keyPressEvent.forTarget(this);
 
-  Stream<KeyboardEvent> get onKeyUp => keyUpEvent.forTarget(this);
+  Stream<KeyboardEvent> get onKeyUp => Element.keyUpEvent.forTarget(this);
 
-  Stream<Event> get onLoad => loadEvent.forTarget(this);
-
-  Stream<Event> get onLoadedData => loadedDataEvent.forTarget(this);
-
-  Stream<Event> get onLoadedMetadata => loadedMetadataEvent.forTarget(this);
-
-  Stream<Event> get onLoadStart => loadStartEvent.forTarget(this);
+  Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseDown => mouseDownEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseMove => mouseMoveEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseOut => mouseOutEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseOut => Element.mouseOutEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseOver => mouseOverEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseOver => Element.mouseOverEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseUp => mouseUpEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseUp => Element.mouseUpEvent.forTarget(this);
 
-  Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
+  Stream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent.forTarget(this);
 
   Stream<Event> get onOffline => offlineEvent.forTarget(this);
 
@@ -22954,291 +23509,267 @@
 
   Stream<Event> get onPageShow => pageShowEvent.forTarget(this);
 
-  Stream<Event> get onPause => pauseEvent.forTarget(this);
-
-  Stream<Event> get onPlay => playEvent.forTarget(this);
-
-  Stream<Event> get onPlaying => playingEvent.forTarget(this);
-
   Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);
 
-  Stream<Event> get onProgress => progressEvent.forTarget(this);
-
-  Stream<Event> get onRateChange => rateChangeEvent.forTarget(this);
-
-  Stream<Event> get onReset => resetEvent.forTarget(this);
+  Stream<Event> get onReset => Element.resetEvent.forTarget(this);
 
   Stream<Event> get onResize => resizeEvent.forTarget(this);
 
-  Stream<Event> get onScroll => scrollEvent.forTarget(this);
+  Stream<Event> get onScroll => Element.scrollEvent.forTarget(this);
 
-  Stream<Event> get onSearch => searchEvent.forTarget(this);
+  Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
-  Stream<Event> get onSeeked => seekedEvent.forTarget(this);
-
-  Stream<Event> get onSeeking => seekingEvent.forTarget(this);
-
-  Stream<Event> get onSelect => selectEvent.forTarget(this);
-
-  Stream<Event> get onStalled => stalledEvent.forTarget(this);
+  Stream<Event> get onSelect => Element.selectEvent.forTarget(this);
 
   Stream<StorageEvent> get onStorage => storageEvent.forTarget(this);
 
-  Stream<Event> get onSubmit => submitEvent.forTarget(this);
+  Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
-  Stream<Event> get onSuspend => suspendEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
 
-  Stream<Event> get onTimeUpdate => timeUpdateEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
-  Stream<TouchEvent> get onTouchCancel => touchCancelEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
-  Stream<TouchEvent> get onTouchEnd => touchEndEvent.forTarget(this);
-
-  Stream<TouchEvent> get onTouchMove => touchMoveEvent.forTarget(this);
-
-  Stream<TouchEvent> get onTouchStart => touchStartEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
   Stream<Event> get onUnload => unloadEvent.forTarget(this);
 
-  Stream<Event> get onVolumeChange => volumeChangeEvent.forTarget(this);
-
-  Stream<Event> get onWaiting => waitingEvent.forTarget(this);
-
   Stream<AnimationEvent> get onAnimationEnd => animationEndEvent.forTarget(this);
 
   Stream<AnimationEvent> get onAnimationIteration => animationIterationEvent.forTarget(this);
 
   Stream<AnimationEvent> get onAnimationStart => animationStartEvent.forTarget(this);
 
-  Stream<TransitionEvent> get onTransitionEnd => transitionEndEvent.forTarget(this);
+  Stream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent.forTarget(this);
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class WindowEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   WindowEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get contentLoaded => this['DOMContentLoaded'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get beforeUnload => this['beforeunload'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get blur => this['blur'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get canPlay => this['canplay'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get canPlayThrough => this['canplaythrough'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get change => this['change'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get click => this['click'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get contextMenu => this['contextmenu'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get doubleClick => this['dblclick'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get deviceMotion => this['devicemotion'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get deviceOrientation => this['deviceorientation'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get drag => this['drag'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragEnd => this['dragend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragEnter => this['dragenter'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragLeave => this['dragleave'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragOver => this['dragover'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragStart => this['dragstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get drop => this['drop'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get durationChange => this['durationchange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get emptied => this['emptied'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get ended => this['ended'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get focus => this['focus'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get hashChange => this['hashchange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get input => this['input'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get invalid => this['invalid'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyDown => this['keydown'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyPress => this['keypress'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyUp => this['keyup'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get load => this['load'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadedData => this['loadeddata'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadedMetadata => this['loadedmetadata'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadStart => this['loadstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get message => this['message'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseDown => this['mousedown'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseMove => this['mousemove'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseOut => this['mouseout'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseOver => this['mouseover'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseUp => this['mouseup'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseWheel => this['mousewheel'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get offline => this['offline'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get online => this['online'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get pageHide => this['pagehide'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get pageShow => this['pageshow'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get pause => this['pause'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get play => this['play'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get playing => this['playing'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get popState => this['popstate'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get progress => this['progress'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get rateChange => this['ratechange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get reset => this['reset'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get resize => this['resize'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get scroll => this['scroll'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get search => this['search'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get seeked => this['seeked'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get seeking => this['seeking'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get select => this['select'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get stalled => this['stalled'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get storage => this['storage'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get submit => this['submit'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get suspend => this['suspend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get timeUpdate => this['timeupdate'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchCancel => this['touchcancel'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchEnd => this['touchend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchMove => this['touchmove'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchStart => this['touchstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get unload => this['unload'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get volumeChange => this['volumechange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get waiting => this['waiting'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get animationEnd => this['webkitAnimationEnd'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get animationIteration => this['webkitAnimationIteration'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get animationStart => this['webkitAnimationStart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get transitionEnd => this['webkitTransitionEnd'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23246,20 +23777,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Worker; @docsEditable true
+
+@DocsEditable
+@DomName('Worker')
 class Worker extends AbstractWorker native "*Worker" {
 
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
-  ///@docsEditable true
+  @DocsEditable
   factory Worker(String scriptUrl) => Worker._create(scriptUrl);
   static Worker _create(String scriptUrl) => JS('Worker', 'new Worker(#)', scriptUrl);
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   WorkerEvents get on =>
     new WorkerEvents(this);
 
-  /// @domName Worker.postMessage; @docsEditable true
   void postMessage(/*SerializedScriptValue*/ message, [List messagePorts]) {
     if (?messagePorts) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
@@ -23271,22 +23804,24 @@
     return;
   }
   @JSName('postMessage')
+  @DocsEditable @DomName('Worker.postMessage')
   void _postMessage_1(message, List messagePorts) native;
   @JSName('postMessage')
+  @DocsEditable @DomName('Worker.postMessage')
   void _postMessage_2(message) native;
 
-  /// @domName Worker.terminate; @docsEditable true
+  @DocsEditable @DomName('Worker.terminate')
   void terminate() native;
 
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class WorkerEvents extends AbstractWorkerEvents {
-  /// @docsEditable true
+  @DocsEditable
   WorkerEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get message => this['message'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23294,12 +23829,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WorkerContext
+@DocsEditable
+@DomName('WorkerContext')
 class WorkerContext extends EventTarget native "*WorkerContext" {
 
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   WorkerContextEvents get on =>
     new WorkerContextEvents(this);
 
@@ -23307,72 +23844,68 @@
 
   static const int TEMPORARY = 0;
 
-  /// @domName WorkerContext.location; @docsEditable true
+  @DocsEditable @DomName('WorkerContext.location')
   final WorkerLocation location;
 
-  /// @domName WorkerContext.navigator; @docsEditable true
+  @DocsEditable @DomName('WorkerContext.navigator')
   final WorkerNavigator navigator;
 
-  /// @domName WorkerContext.self; @docsEditable true
+  @DocsEditable @DomName('WorkerContext.self')
   final WorkerContext self;
 
-  /// @domName WorkerContext.webkitNotifications; @docsEditable true
+  @DocsEditable @DomName('WorkerContext.webkitNotifications')
   final NotificationCenter webkitNotifications;
 
-  /// @domName WorkerContext.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('WorkerContext.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName WorkerContext.clearInterval; @docsEditable true
+  @DocsEditable @DomName('WorkerContext.clearInterval')
   void clearInterval(int handle) native;
 
-  /// @domName WorkerContext.clearTimeout; @docsEditable true
+  @DocsEditable @DomName('WorkerContext.clearTimeout')
   void clearTimeout(int handle) native;
 
-  /// @domName WorkerContext.close; @docsEditable true
+  @DocsEditable @DomName('WorkerContext.close')
   void close() native;
 
-  /// @domName WorkerContext.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('WorkerContext.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName WorkerContext.importScripts; @docsEditable true
+  @DocsEditable @DomName('WorkerContext.importScripts')
   void importScripts() native;
 
-  /// @domName WorkerContext.openDatabase; @docsEditable true
+  @DocsEditable @DomName('WorkerContext.openDatabase')
   Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
 
-  /// @domName WorkerContext.openDatabaseSync; @docsEditable true
+  @DocsEditable @DomName('WorkerContext.openDatabaseSync')
   DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
 
-  /// @domName WorkerContext.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('WorkerContext.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName WorkerContext.setInterval; @docsEditable true
+  @DocsEditable @DomName('WorkerContext.setInterval')
   int setInterval(TimeoutHandler handler, int timeout) native;
 
-  /// @domName WorkerContext.setTimeout; @docsEditable true
+  @DocsEditable @DomName('WorkerContext.setTimeout')
   int setTimeout(TimeoutHandler handler, int timeout) native;
 
-  /// @domName WorkerContext.webkitRequestFileSystem; @docsEditable true
   @JSName('webkitRequestFileSystem')
-  @SupportedBrowser(SupportedBrowser.CHROME) @Experimental()
+  @DocsEditable @DomName('WorkerContext.webkitRequestFileSystem') @SupportedBrowser(SupportedBrowser.CHROME) @Experimental()
   void requestFileSystem(int type, int size, [FileSystemCallback successCallback, ErrorCallback errorCallback]) native;
 
-  /// @domName WorkerContext.webkitRequestFileSystemSync; @docsEditable true
   @JSName('webkitRequestFileSystemSync')
-  @SupportedBrowser(SupportedBrowser.CHROME) @Experimental()
+  @DocsEditable @DomName('WorkerContext.webkitRequestFileSystemSync') @SupportedBrowser(SupportedBrowser.CHROME) @Experimental()
   FileSystemSync requestFileSystemSync(int type, int size) native;
 
-  /// @domName WorkerContext.webkitResolveLocalFileSystemSyncURL; @docsEditable true
   @JSName('webkitResolveLocalFileSystemSyncURL')
-  @SupportedBrowser(SupportedBrowser.CHROME) @Experimental()
+  @DocsEditable @DomName('WorkerContext.webkitResolveLocalFileSystemSyncURL') @SupportedBrowser(SupportedBrowser.CHROME) @Experimental()
   EntrySync resolveLocalFileSystemSyncUrl(String url) native;
 
-  /// @domName WorkerContext.webkitResolveLocalFileSystemURL; @docsEditable true
   @JSName('webkitResolveLocalFileSystemURL')
-  @SupportedBrowser(SupportedBrowser.CHROME) @Experimental()
+  @DocsEditable @DomName('WorkerContext.webkitResolveLocalFileSystemURL') @SupportedBrowser(SupportedBrowser.CHROME) @Experimental()
   void resolveLocalFileSystemUrl(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native;
 
   Stream<Event> get onError => errorEvent.forTarget(this);
@@ -23394,12 +23927,12 @@
          this, this, this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class WorkerContextEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   WorkerContextEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23407,34 +23940,36 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WorkerLocation; @docsEditable true
+
+@DocsEditable
+@DomName('WorkerLocation')
 class WorkerLocation native "*WorkerLocation" {
 
-  /// @domName WorkerLocation.hash; @docsEditable true
+  @DocsEditable @DomName('WorkerLocation.hash')
   final String hash;
 
-  /// @domName WorkerLocation.host; @docsEditable true
+  @DocsEditable @DomName('WorkerLocation.host')
   final String host;
 
-  /// @domName WorkerLocation.hostname; @docsEditable true
+  @DocsEditable @DomName('WorkerLocation.hostname')
   final String hostname;
 
-  /// @domName WorkerLocation.href; @docsEditable true
+  @DocsEditable @DomName('WorkerLocation.href')
   final String href;
 
-  /// @domName WorkerLocation.pathname; @docsEditable true
+  @DocsEditable @DomName('WorkerLocation.pathname')
   final String pathname;
 
-  /// @domName WorkerLocation.port; @docsEditable true
+  @DocsEditable @DomName('WorkerLocation.port')
   final String port;
 
-  /// @domName WorkerLocation.protocol; @docsEditable true
+  @DocsEditable @DomName('WorkerLocation.protocol')
   final String protocol;
 
-  /// @domName WorkerLocation.search; @docsEditable true
+  @DocsEditable @DomName('WorkerLocation.search')
   final String search;
 
-  /// @domName WorkerLocation.toString; @docsEditable true
+  @DocsEditable @DomName('WorkerLocation.toString')
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23442,22 +23977,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WorkerNavigator; @docsEditable true
+
+@DocsEditable
+@DomName('WorkerNavigator')
 class WorkerNavigator native "*WorkerNavigator" {
 
-  /// @domName WorkerNavigator.appName; @docsEditable true
+  @DocsEditable @DomName('WorkerNavigator.appName')
   final String appName;
 
-  /// @domName WorkerNavigator.appVersion; @docsEditable true
+  @DocsEditable @DomName('WorkerNavigator.appVersion')
   final String appVersion;
 
-  /// @domName WorkerNavigator.onLine; @docsEditable true
+  @DocsEditable @DomName('WorkerNavigator.onLine')
   final bool onLine;
 
-  /// @domName WorkerNavigator.platform; @docsEditable true
+  @DocsEditable @DomName('WorkerNavigator.platform')
   final String platform;
 
-  /// @domName WorkerNavigator.userAgent; @docsEditable true
+  @DocsEditable @DomName('WorkerNavigator.userAgent')
   final String userAgent;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23465,20 +24002,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XPathEvaluator; @docsEditable true
+
+@DocsEditable
+@DomName('XPathEvaluator')
 class XPathEvaluator native "*XPathEvaluator" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory XPathEvaluator() => XPathEvaluator._create();
   static XPathEvaluator _create() => JS('XPathEvaluator', 'new XPathEvaluator()');
 
-  /// @domName XPathEvaluator.createExpression; @docsEditable true
+  @DocsEditable @DomName('XPathEvaluator.createExpression')
   XPathExpression createExpression(String expression, XPathNSResolver resolver) native;
 
-  /// @domName XPathEvaluator.createNSResolver; @docsEditable true
+  @DocsEditable @DomName('XPathEvaluator.createNSResolver')
   XPathNSResolver createNSResolver(Node nodeResolver) native;
 
-  /// @domName XPathEvaluator.evaluate; @docsEditable true
+  @DocsEditable @DomName('XPathEvaluator.evaluate')
   XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23486,23 +24025,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XPathException; @docsEditable true
+
+@DocsEditable
+@DomName('XPathException')
 class XPathException native "*XPathException" {
 
   static const int INVALID_EXPRESSION_ERR = 51;
 
   static const int TYPE_ERR = 52;
 
-  /// @domName XPathException.code; @docsEditable true
+  @DocsEditable @DomName('XPathException.code')
   final int code;
 
-  /// @domName XPathException.message; @docsEditable true
+  @DocsEditable @DomName('XPathException.message')
   final String message;
 
-  /// @domName XPathException.name; @docsEditable true
+  @DocsEditable @DomName('XPathException.name')
   final String name;
 
-  /// @domName XPathException.toString; @docsEditable true
+  @DocsEditable @DomName('XPathException.toString')
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23510,10 +24051,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XPathExpression; @docsEditable true
+
+@DocsEditable
+@DomName('XPathExpression')
 class XPathExpression native "*XPathExpression" {
 
-  /// @domName XPathExpression.evaluate; @docsEditable true
+  @DocsEditable @DomName('XPathExpression.evaluate')
   XPathResult evaluate(Node contextNode, int type, XPathResult inResult) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23521,11 +24064,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XPathNSResolver; @docsEditable true
+
+@DocsEditable
+@DomName('XPathNSResolver')
 class XPathNSResolver native "*XPathNSResolver" {
 
-  /// @domName XPathNSResolver.lookupNamespaceURI; @docsEditable true
   @JSName('lookupNamespaceURI')
+  @DocsEditable @DomName('XPathNSResolver.lookupNamespaceURI')
   String lookupNamespaceUri(String prefix) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23533,7 +24078,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XPathResult; @docsEditable true
+
+@DocsEditable
+@DomName('XPathResult')
 class XPathResult native "*XPathResult" {
 
   static const int ANY_TYPE = 0;
@@ -23556,31 +24103,31 @@
 
   static const int UNORDERED_NODE_SNAPSHOT_TYPE = 6;
 
-  /// @domName XPathResult.booleanValue; @docsEditable true
+  @DocsEditable @DomName('XPathResult.booleanValue')
   final bool booleanValue;
 
-  /// @domName XPathResult.invalidIteratorState; @docsEditable true
+  @DocsEditable @DomName('XPathResult.invalidIteratorState')
   final bool invalidIteratorState;
 
-  /// @domName XPathResult.numberValue; @docsEditable true
+  @DocsEditable @DomName('XPathResult.numberValue')
   final num numberValue;
 
-  /// @domName XPathResult.resultType; @docsEditable true
+  @DocsEditable @DomName('XPathResult.resultType')
   final int resultType;
 
-  /// @domName XPathResult.singleNodeValue; @docsEditable true
+  @DocsEditable @DomName('XPathResult.singleNodeValue')
   final Node singleNodeValue;
 
-  /// @domName XPathResult.snapshotLength; @docsEditable true
+  @DocsEditable @DomName('XPathResult.snapshotLength')
   final int snapshotLength;
 
-  /// @domName XPathResult.stringValue; @docsEditable true
+  @DocsEditable @DomName('XPathResult.stringValue')
   final String stringValue;
 
-  /// @domName XPathResult.iterateNext; @docsEditable true
+  @DocsEditable @DomName('XPathResult.iterateNext')
   Node iterateNext() native;
 
-  /// @domName XPathResult.snapshotItem; @docsEditable true
+  @DocsEditable @DomName('XPathResult.snapshotItem')
   Node snapshotItem(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23588,14 +24135,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XMLSerializer; @docsEditable true
+
+@DocsEditable
+@DomName('XMLSerializer')
 class XmlSerializer native "*XMLSerializer" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory XmlSerializer() => XmlSerializer._create();
   static XmlSerializer _create() => JS('XmlSerializer', 'new XMLSerializer()');
 
-  /// @domName XMLSerializer.serializeToString; @docsEditable true
+  @DocsEditable @DomName('XMLSerializer.serializeToString')
   String serializeToString(Node node) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23603,35 +24152,37 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XSLTProcessor; @docsEditable true
+
+@DocsEditable
+@DomName('XSLTProcessor')
 class XsltProcessor native "*XSLTProcessor" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory XsltProcessor() => XsltProcessor._create();
   static XsltProcessor _create() => JS('XsltProcessor', 'new XSLTProcessor()');
 
-  /// @domName XSLTProcessor.clearParameters; @docsEditable true
+  @DocsEditable @DomName('XSLTProcessor.clearParameters')
   void clearParameters() native;
 
-  /// @domName XSLTProcessor.getParameter; @docsEditable true
+  @DocsEditable @DomName('XSLTProcessor.getParameter')
   String getParameter(String namespaceURI, String localName) native;
 
-  /// @domName XSLTProcessor.importStylesheet; @docsEditable true
+  @DocsEditable @DomName('XSLTProcessor.importStylesheet')
   void importStylesheet(Node stylesheet) native;
 
-  /// @domName XSLTProcessor.removeParameter; @docsEditable true
+  @DocsEditable @DomName('XSLTProcessor.removeParameter')
   void removeParameter(String namespaceURI, String localName) native;
 
-  /// @domName XSLTProcessor.reset; @docsEditable true
+  @DocsEditable @DomName('XSLTProcessor.reset')
   void reset() native;
 
-  /// @domName XSLTProcessor.setParameter; @docsEditable true
+  @DocsEditable @DomName('XSLTProcessor.setParameter')
   void setParameter(String namespaceURI, String localName, String value) native;
 
-  /// @domName XSLTProcessor.transformToDocument; @docsEditable true
+  @DocsEditable @DomName('XSLTProcessor.transformToDocument')
   Document transformToDocument(Node source) native;
 
-  /// @domName XSLTProcessor.transformToFragment; @docsEditable true
+  @DocsEditable @DomName('XSLTProcessor.transformToFragment')
   DocumentFragment transformToFragment(Node source, Document docVal) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23639,10 +24190,32 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ClientRectList; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLAppletElement')
+class _AppletElement extends Element native "*HTMLAppletElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+
+@DocsEditable
+@DomName('HTMLBaseFontElement')
+class _BaseFontElement extends Element native "*HTMLBaseFontElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+
+@DocsEditable
+@DomName('ClientRectList')
 class _ClientRectList implements JavaScriptIndexingBehavior, List<ClientRect> native "*ClientRectList" {
 
-  /// @domName ClientRectList.length; @docsEditable true
+  @DocsEditable @DomName('ClientRectList.length')
   int get length => JS("int", "#.length", this);
 
   ClientRect operator[](int index) => JS("ClientRect", "#[#]", this, index);
@@ -23663,50 +24236,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, ClientRect)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(ClientRect element) => Collections.contains(this, element);
+  bool contains(ClientRect element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(ClientRect element)) => Collections.forEach(this, f);
+  void forEach(void f(ClientRect element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(ClientRect element)) => new MappedList<ClientRect, dynamic>(this, f);
+  List mappedBy(f(ClientRect element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<ClientRect> where(bool f(ClientRect element)) => new WhereIterable<ClientRect>(this, f);
+  Iterable<ClientRect> where(bool f(ClientRect element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(ClientRect element)) => Collections.every(this, f);
+  bool every(bool f(ClientRect element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(ClientRect element)) => Collections.any(this, f);
+  bool any(bool f(ClientRect element)) => IterableMixinWorkaround.any(this, f);
 
   List<ClientRect> toList() => new List<ClientRect>.from(this);
   Set<ClientRect> toSet() => new Set<ClientRect>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<ClientRect> take(int n) => new ListView<ClientRect>(this, 0, n);
+  List<ClientRect> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<ClientRect> takeWhile(bool test(ClientRect value)) {
-    return new TakeWhileIterable<ClientRect>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<ClientRect> skip(int n) => new ListView<ClientRect>(this, n, null);
+  List<ClientRect> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<ClientRect> skipWhile(bool test(ClientRect value)) {
-    return new SkipWhileIterable<ClientRect>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   ClientRect firstMatching(bool test(ClientRect value), { ClientRect orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   ClientRect lastMatching(bool test(ClientRect value), {ClientRect orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   ClientRect singleMatching(bool test(ClientRect value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   ClientRect elementAt(int index) {
@@ -23764,16 +24337,36 @@
     throw new StateError("More than one element");
   }
 
-  ClientRect min([int compare(ClientRect a, ClientRect b)]) => Collections.min(this, compare);
+  ClientRect min([int compare(ClientRect a, ClientRect b)]) => IterableMixinWorkaround.min(this, compare);
 
-  ClientRect max([int compare(ClientRect a, ClientRect b)]) => Collections.max(this, compare);
+  ClientRect max([int compare(ClientRect a, ClientRect b)]) => IterableMixinWorkaround.max(this, compare);
 
   ClientRect removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   ClientRect removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(ClientRect element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(ClientRect element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<ClientRect> from, [int startFrom]) {
@@ -23793,7 +24386,7 @@
 
   // -- end List<ClientRect> mixins.
 
-  /// @domName ClientRectList.item; @docsEditable true
+  @DocsEditable @DomName('ClientRectList.item')
   ClientRect item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23801,10 +24394,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSRuleList; @docsEditable true
+
+@DocsEditable
+@DomName('CSSRuleList')
 class _CssRuleList implements JavaScriptIndexingBehavior, List<CssRule> native "*CSSRuleList" {
 
-  /// @domName CSSRuleList.length; @docsEditable true
+  @DocsEditable @DomName('CSSRuleList.length')
   int get length => JS("int", "#.length", this);
 
   CssRule operator[](int index) => JS("CssRule", "#[#]", this, index);
@@ -23825,50 +24420,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, CssRule)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(CssRule element) => Collections.contains(this, element);
+  bool contains(CssRule element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(CssRule element)) => Collections.forEach(this, f);
+  void forEach(void f(CssRule element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(CssRule element)) => new MappedList<CssRule, dynamic>(this, f);
+  List mappedBy(f(CssRule element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<CssRule> where(bool f(CssRule element)) => new WhereIterable<CssRule>(this, f);
+  Iterable<CssRule> where(bool f(CssRule element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(CssRule element)) => Collections.every(this, f);
+  bool every(bool f(CssRule element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(CssRule element)) => Collections.any(this, f);
+  bool any(bool f(CssRule element)) => IterableMixinWorkaround.any(this, f);
 
   List<CssRule> toList() => new List<CssRule>.from(this);
   Set<CssRule> toSet() => new Set<CssRule>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<CssRule> take(int n) => new ListView<CssRule>(this, 0, n);
+  List<CssRule> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<CssRule> takeWhile(bool test(CssRule value)) {
-    return new TakeWhileIterable<CssRule>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<CssRule> skip(int n) => new ListView<CssRule>(this, n, null);
+  List<CssRule> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<CssRule> skipWhile(bool test(CssRule value)) {
-    return new SkipWhileIterable<CssRule>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   CssRule firstMatching(bool test(CssRule value), { CssRule orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   CssRule lastMatching(bool test(CssRule value), {CssRule orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   CssRule singleMatching(bool test(CssRule value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   CssRule elementAt(int index) {
@@ -23926,16 +24521,36 @@
     throw new StateError("More than one element");
   }
 
-  CssRule min([int compare(CssRule a, CssRule b)]) => Collections.min(this, compare);
+  CssRule min([int compare(CssRule a, CssRule b)]) => IterableMixinWorkaround.min(this, compare);
 
-  CssRule max([int compare(CssRule a, CssRule b)]) => Collections.max(this, compare);
+  CssRule max([int compare(CssRule a, CssRule b)]) => IterableMixinWorkaround.max(this, compare);
 
   CssRule removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   CssRule removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(CssRule element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(CssRule element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<CssRule> from, [int startFrom]) {
@@ -23955,7 +24570,7 @@
 
   // -- end List<CssRule> mixins.
 
-  /// @domName CSSRuleList.item; @docsEditable true
+  @DocsEditable @DomName('CSSRuleList.item')
   CssRule item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23963,10 +24578,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSValueList; @docsEditable true
+
+@DocsEditable
+@DomName('CSSValueList')
 class _CssValueList extends CssValue implements List<CssValue>, JavaScriptIndexingBehavior native "*CSSValueList" {
 
-  /// @domName CSSValueList.length; @docsEditable true
+  @DocsEditable @DomName('CSSValueList.length')
   int get length => JS("int", "#.length", this);
 
   CssValue operator[](int index) => JS("CssValue", "#[#]", this, index);
@@ -23987,50 +24604,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, CssValue)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(CssValue element) => Collections.contains(this, element);
+  bool contains(CssValue element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(CssValue element)) => Collections.forEach(this, f);
+  void forEach(void f(CssValue element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(CssValue element)) => new MappedList<CssValue, dynamic>(this, f);
+  List mappedBy(f(CssValue element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<CssValue> where(bool f(CssValue element)) => new WhereIterable<CssValue>(this, f);
+  Iterable<CssValue> where(bool f(CssValue element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(CssValue element)) => Collections.every(this, f);
+  bool every(bool f(CssValue element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(CssValue element)) => Collections.any(this, f);
+  bool any(bool f(CssValue element)) => IterableMixinWorkaround.any(this, f);
 
   List<CssValue> toList() => new List<CssValue>.from(this);
   Set<CssValue> toSet() => new Set<CssValue>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<CssValue> take(int n) => new ListView<CssValue>(this, 0, n);
+  List<CssValue> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<CssValue> takeWhile(bool test(CssValue value)) {
-    return new TakeWhileIterable<CssValue>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<CssValue> skip(int n) => new ListView<CssValue>(this, n, null);
+  List<CssValue> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<CssValue> skipWhile(bool test(CssValue value)) {
-    return new SkipWhileIterable<CssValue>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   CssValue firstMatching(bool test(CssValue value), { CssValue orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   CssValue lastMatching(bool test(CssValue value), {CssValue orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   CssValue singleMatching(bool test(CssValue value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   CssValue elementAt(int index) {
@@ -24088,16 +24705,36 @@
     throw new StateError("More than one element");
   }
 
-  CssValue min([int compare(CssValue a, CssValue b)]) => Collections.min(this, compare);
+  CssValue min([int compare(CssValue a, CssValue b)]) => IterableMixinWorkaround.min(this, compare);
 
-  CssValue max([int compare(CssValue a, CssValue b)]) => Collections.max(this, compare);
+  CssValue max([int compare(CssValue a, CssValue b)]) => IterableMixinWorkaround.max(this, compare);
 
   CssValue removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   CssValue removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(CssValue element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(CssValue element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<CssValue> from, [int startFrom]) {
@@ -24117,7 +24754,7 @@
 
   // -- end List<CssValue> mixins.
 
-  /// @domName CSSValueList.item; @docsEditable true
+  @DocsEditable @DomName('CSSValueList.item')
   CssValue item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24125,10 +24762,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName EntryArray; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLDirectoryElement')
+class _DirectoryElement extends Element native "*HTMLDirectoryElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+
+@DocsEditable
+@DomName('EntryArray')
 class _EntryArray implements JavaScriptIndexingBehavior, List<Entry> native "*EntryArray" {
 
-  /// @domName EntryArray.length; @docsEditable true
+  @DocsEditable @DomName('EntryArray.length')
   int get length => JS("int", "#.length", this);
 
   Entry operator[](int index) => JS("Entry", "#[#]", this, index);
@@ -24149,50 +24798,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Entry)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Entry element) => Collections.contains(this, element);
+  bool contains(Entry element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Entry element)) => Collections.forEach(this, f);
+  void forEach(void f(Entry element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Entry element)) => new MappedList<Entry, dynamic>(this, f);
+  List mappedBy(f(Entry element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Entry> where(bool f(Entry element)) => new WhereIterable<Entry>(this, f);
+  Iterable<Entry> where(bool f(Entry element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Entry element)) => Collections.every(this, f);
+  bool every(bool f(Entry element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Entry element)) => Collections.any(this, f);
+  bool any(bool f(Entry element)) => IterableMixinWorkaround.any(this, f);
 
   List<Entry> toList() => new List<Entry>.from(this);
   Set<Entry> toSet() => new Set<Entry>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Entry> take(int n) => new ListView<Entry>(this, 0, n);
+  List<Entry> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Entry> takeWhile(bool test(Entry value)) {
-    return new TakeWhileIterable<Entry>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Entry> skip(int n) => new ListView<Entry>(this, n, null);
+  List<Entry> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Entry> skipWhile(bool test(Entry value)) {
-    return new SkipWhileIterable<Entry>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Entry firstMatching(bool test(Entry value), { Entry orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Entry lastMatching(bool test(Entry value), {Entry orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Entry singleMatching(bool test(Entry value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Entry elementAt(int index) {
@@ -24250,16 +24899,36 @@
     throw new StateError("More than one element");
   }
 
-  Entry min([int compare(Entry a, Entry b)]) => Collections.min(this, compare);
+  Entry min([int compare(Entry a, Entry b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Entry max([int compare(Entry a, Entry b)]) => Collections.max(this, compare);
+  Entry max([int compare(Entry a, Entry b)]) => IterableMixinWorkaround.max(this, compare);
 
   Entry removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Entry removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Entry element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Entry element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Entry> from, [int startFrom]) {
@@ -24279,7 +24948,7 @@
 
   // -- end List<Entry> mixins.
 
-  /// @domName EntryArray.item; @docsEditable true
+  @DocsEditable @DomName('EntryArray.item')
   Entry item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24287,10 +24956,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName EntryArraySync; @docsEditable true
+
+@DocsEditable
+@DomName('EntryArraySync')
 class _EntryArraySync implements JavaScriptIndexingBehavior, List<EntrySync> native "*EntryArraySync" {
 
-  /// @domName EntryArraySync.length; @docsEditable true
+  @DocsEditable @DomName('EntryArraySync.length')
   int get length => JS("int", "#.length", this);
 
   EntrySync operator[](int index) => JS("EntrySync", "#[#]", this, index);
@@ -24311,50 +24982,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, EntrySync)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(EntrySync element) => Collections.contains(this, element);
+  bool contains(EntrySync element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(EntrySync element)) => Collections.forEach(this, f);
+  void forEach(void f(EntrySync element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(EntrySync element)) => new MappedList<EntrySync, dynamic>(this, f);
+  List mappedBy(f(EntrySync element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<EntrySync> where(bool f(EntrySync element)) => new WhereIterable<EntrySync>(this, f);
+  Iterable<EntrySync> where(bool f(EntrySync element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(EntrySync element)) => Collections.every(this, f);
+  bool every(bool f(EntrySync element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(EntrySync element)) => Collections.any(this, f);
+  bool any(bool f(EntrySync element)) => IterableMixinWorkaround.any(this, f);
 
   List<EntrySync> toList() => new List<EntrySync>.from(this);
   Set<EntrySync> toSet() => new Set<EntrySync>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<EntrySync> take(int n) => new ListView<EntrySync>(this, 0, n);
+  List<EntrySync> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<EntrySync> takeWhile(bool test(EntrySync value)) {
-    return new TakeWhileIterable<EntrySync>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<EntrySync> skip(int n) => new ListView<EntrySync>(this, n, null);
+  List<EntrySync> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<EntrySync> skipWhile(bool test(EntrySync value)) {
-    return new SkipWhileIterable<EntrySync>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   EntrySync firstMatching(bool test(EntrySync value), { EntrySync orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   EntrySync lastMatching(bool test(EntrySync value), {EntrySync orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   EntrySync singleMatching(bool test(EntrySync value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   EntrySync elementAt(int index) {
@@ -24412,16 +25083,36 @@
     throw new StateError("More than one element");
   }
 
-  EntrySync min([int compare(EntrySync a, EntrySync b)]) => Collections.min(this, compare);
+  EntrySync min([int compare(EntrySync a, EntrySync b)]) => IterableMixinWorkaround.min(this, compare);
 
-  EntrySync max([int compare(EntrySync a, EntrySync b)]) => Collections.max(this, compare);
+  EntrySync max([int compare(EntrySync a, EntrySync b)]) => IterableMixinWorkaround.max(this, compare);
 
   EntrySync removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   EntrySync removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(EntrySync element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(EntrySync element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<EntrySync> from, [int startFrom]) {
@@ -24441,7 +25132,7 @@
 
   // -- end List<EntrySync> mixins.
 
-  /// @domName EntryArraySync.item; @docsEditable true
+  @DocsEditable @DomName('EntryArraySync.item')
   EntrySync item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24449,10 +25140,92 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName GamepadList; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLFontElement')
+class _FontElement extends Element native "*HTMLFontElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+
+@DocsEditable
+@DomName('HTMLFrameElement')
+class _FrameElement extends Element native "*HTMLFrameElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+
+@DocsEditable
+@DomName('HTMLFrameSetElement')
+class _FrameSetElement extends Element native "*HTMLFrameSetElement" {
+
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
+  _FrameSetElementEvents get on =>
+    new _FrameSetElementEvents(this);
+}
+
+@DocsEditable
+class _FrameSetElementEvents extends ElementEvents {
+  @DocsEditable
+  _FrameSetElementEvents(EventTarget _ptr) : super(_ptr);
+
+  @DocsEditable
+  EventListenerList get beforeUnload => this['beforeunload'];
+
+  @DocsEditable
+  EventListenerList get blur => this['blur'];
+
+  @DocsEditable
+  EventListenerList get error => this['error'];
+
+  @DocsEditable
+  EventListenerList get focus => this['focus'];
+
+  @DocsEditable
+  EventListenerList get hashChange => this['hashchange'];
+
+  @DocsEditable
+  EventListenerList get load => this['load'];
+
+  @DocsEditable
+  EventListenerList get message => this['message'];
+
+  @DocsEditable
+  EventListenerList get offline => this['offline'];
+
+  @DocsEditable
+  EventListenerList get online => this['online'];
+
+  @DocsEditable
+  EventListenerList get popState => this['popstate'];
+
+  @DocsEditable
+  EventListenerList get resize => this['resize'];
+
+  @DocsEditable
+  EventListenerList get storage => this['storage'];
+
+  @DocsEditable
+  EventListenerList get unload => this['unload'];
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+
+@DocsEditable
+@DomName('GamepadList')
 class _GamepadList implements JavaScriptIndexingBehavior, List<Gamepad> native "*GamepadList" {
 
-  /// @domName GamepadList.length; @docsEditable true
+  @DocsEditable @DomName('GamepadList.length')
   int get length => JS("int", "#.length", this);
 
   Gamepad operator[](int index) => JS("Gamepad", "#[#]", this, index);
@@ -24473,50 +25246,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Gamepad)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Gamepad element) => Collections.contains(this, element);
+  bool contains(Gamepad element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Gamepad element)) => Collections.forEach(this, f);
+  void forEach(void f(Gamepad element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Gamepad element)) => new MappedList<Gamepad, dynamic>(this, f);
+  List mappedBy(f(Gamepad element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Gamepad> where(bool f(Gamepad element)) => new WhereIterable<Gamepad>(this, f);
+  Iterable<Gamepad> where(bool f(Gamepad element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Gamepad element)) => Collections.every(this, f);
+  bool every(bool f(Gamepad element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Gamepad element)) => Collections.any(this, f);
+  bool any(bool f(Gamepad element)) => IterableMixinWorkaround.any(this, f);
 
   List<Gamepad> toList() => new List<Gamepad>.from(this);
   Set<Gamepad> toSet() => new Set<Gamepad>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Gamepad> take(int n) => new ListView<Gamepad>(this, 0, n);
+  List<Gamepad> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Gamepad> takeWhile(bool test(Gamepad value)) {
-    return new TakeWhileIterable<Gamepad>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Gamepad> skip(int n) => new ListView<Gamepad>(this, n, null);
+  List<Gamepad> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Gamepad> skipWhile(bool test(Gamepad value)) {
-    return new SkipWhileIterable<Gamepad>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Gamepad firstMatching(bool test(Gamepad value), { Gamepad orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Gamepad lastMatching(bool test(Gamepad value), {Gamepad orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Gamepad singleMatching(bool test(Gamepad value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Gamepad elementAt(int index) {
@@ -24574,16 +25347,36 @@
     throw new StateError("More than one element");
   }
 
-  Gamepad min([int compare(Gamepad a, Gamepad b)]) => Collections.min(this, compare);
+  Gamepad min([int compare(Gamepad a, Gamepad b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Gamepad max([int compare(Gamepad a, Gamepad b)]) => Collections.max(this, compare);
+  Gamepad max([int compare(Gamepad a, Gamepad b)]) => IterableMixinWorkaround.max(this, compare);
 
   Gamepad removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Gamepad removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Gamepad element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Gamepad element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Gamepad> from, [int startFrom]) {
@@ -24603,7 +25396,7 @@
 
   // -- end List<Gamepad> mixins.
 
-  /// @domName GamepadList.item; @docsEditable true
+  @DocsEditable @DomName('GamepadList.item')
   Gamepad item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24611,10 +25404,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaStreamList; @docsEditable true
+
+@DocsEditable
+@DomName('HTMLMarqueeElement')
+class _MarqueeElement extends Element native "*HTMLMarqueeElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+
+@DocsEditable
+@DomName('MediaStreamList')
 class _MediaStreamList implements JavaScriptIndexingBehavior, List<MediaStream> native "*MediaStreamList" {
 
-  /// @domName MediaStreamList.length; @docsEditable true
+  @DocsEditable @DomName('MediaStreamList.length')
   int get length => JS("int", "#.length", this);
 
   MediaStream operator[](int index) => JS("MediaStream", "#[#]", this, index);
@@ -24635,50 +25440,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, MediaStream)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(MediaStream element) => Collections.contains(this, element);
+  bool contains(MediaStream element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(MediaStream element)) => Collections.forEach(this, f);
+  void forEach(void f(MediaStream element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(MediaStream element)) => new MappedList<MediaStream, dynamic>(this, f);
+  List mappedBy(f(MediaStream element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<MediaStream> where(bool f(MediaStream element)) => new WhereIterable<MediaStream>(this, f);
+  Iterable<MediaStream> where(bool f(MediaStream element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(MediaStream element)) => Collections.every(this, f);
+  bool every(bool f(MediaStream element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(MediaStream element)) => Collections.any(this, f);
+  bool any(bool f(MediaStream element)) => IterableMixinWorkaround.any(this, f);
 
   List<MediaStream> toList() => new List<MediaStream>.from(this);
   Set<MediaStream> toSet() => new Set<MediaStream>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<MediaStream> take(int n) => new ListView<MediaStream>(this, 0, n);
+  List<MediaStream> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<MediaStream> takeWhile(bool test(MediaStream value)) {
-    return new TakeWhileIterable<MediaStream>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<MediaStream> skip(int n) => new ListView<MediaStream>(this, n, null);
+  List<MediaStream> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<MediaStream> skipWhile(bool test(MediaStream value)) {
-    return new SkipWhileIterable<MediaStream>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   MediaStream firstMatching(bool test(MediaStream value), { MediaStream orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   MediaStream lastMatching(bool test(MediaStream value), {MediaStream orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   MediaStream singleMatching(bool test(MediaStream value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   MediaStream elementAt(int index) {
@@ -24736,16 +25541,36 @@
     throw new StateError("More than one element");
   }
 
-  MediaStream min([int compare(MediaStream a, MediaStream b)]) => Collections.min(this, compare);
+  MediaStream min([int compare(MediaStream a, MediaStream b)]) => IterableMixinWorkaround.min(this, compare);
 
-  MediaStream max([int compare(MediaStream a, MediaStream b)]) => Collections.max(this, compare);
+  MediaStream max([int compare(MediaStream a, MediaStream b)]) => IterableMixinWorkaround.max(this, compare);
 
   MediaStream removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   MediaStream removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(MediaStream element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(MediaStream element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<MediaStream> from, [int startFrom]) {
@@ -24765,7 +25590,7 @@
 
   // -- end List<MediaStream> mixins.
 
-  /// @domName MediaStreamList.item; @docsEditable true
+  @DocsEditable @DomName('MediaStreamList.item')
   MediaStream item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24773,10 +25598,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechInputResultList; @docsEditable true
+
+@DocsEditable
+@DomName('SpeechInputResultList')
 class _SpeechInputResultList implements JavaScriptIndexingBehavior, List<SpeechInputResult> native "*SpeechInputResultList" {
 
-  /// @domName SpeechInputResultList.length; @docsEditable true
+  @DocsEditable @DomName('SpeechInputResultList.length')
   int get length => JS("int", "#.length", this);
 
   SpeechInputResult operator[](int index) => JS("SpeechInputResult", "#[#]", this, index);
@@ -24797,50 +25624,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechInputResult)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(SpeechInputResult element) => Collections.contains(this, element);
+  bool contains(SpeechInputResult element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(SpeechInputResult element)) => Collections.forEach(this, f);
+  void forEach(void f(SpeechInputResult element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(SpeechInputResult element)) => new MappedList<SpeechInputResult, dynamic>(this, f);
+  List mappedBy(f(SpeechInputResult element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<SpeechInputResult> where(bool f(SpeechInputResult element)) => new WhereIterable<SpeechInputResult>(this, f);
+  Iterable<SpeechInputResult> where(bool f(SpeechInputResult element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(SpeechInputResult element)) => Collections.every(this, f);
+  bool every(bool f(SpeechInputResult element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(SpeechInputResult element)) => Collections.any(this, f);
+  bool any(bool f(SpeechInputResult element)) => IterableMixinWorkaround.any(this, f);
 
   List<SpeechInputResult> toList() => new List<SpeechInputResult>.from(this);
   Set<SpeechInputResult> toSet() => new Set<SpeechInputResult>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<SpeechInputResult> take(int n) => new ListView<SpeechInputResult>(this, 0, n);
+  List<SpeechInputResult> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<SpeechInputResult> takeWhile(bool test(SpeechInputResult value)) {
-    return new TakeWhileIterable<SpeechInputResult>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<SpeechInputResult> skip(int n) => new ListView<SpeechInputResult>(this, n, null);
+  List<SpeechInputResult> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<SpeechInputResult> skipWhile(bool test(SpeechInputResult value)) {
-    return new SkipWhileIterable<SpeechInputResult>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   SpeechInputResult firstMatching(bool test(SpeechInputResult value), { SpeechInputResult orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   SpeechInputResult lastMatching(bool test(SpeechInputResult value), {SpeechInputResult orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   SpeechInputResult singleMatching(bool test(SpeechInputResult value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   SpeechInputResult elementAt(int index) {
@@ -24898,16 +25725,36 @@
     throw new StateError("More than one element");
   }
 
-  SpeechInputResult min([int compare(SpeechInputResult a, SpeechInputResult b)]) => Collections.min(this, compare);
+  SpeechInputResult min([int compare(SpeechInputResult a, SpeechInputResult b)]) => IterableMixinWorkaround.min(this, compare);
 
-  SpeechInputResult max([int compare(SpeechInputResult a, SpeechInputResult b)]) => Collections.max(this, compare);
+  SpeechInputResult max([int compare(SpeechInputResult a, SpeechInputResult b)]) => IterableMixinWorkaround.max(this, compare);
 
   SpeechInputResult removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   SpeechInputResult removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(SpeechInputResult element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(SpeechInputResult element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<SpeechInputResult> from, [int startFrom]) {
@@ -24927,7 +25774,7 @@
 
   // -- end List<SpeechInputResult> mixins.
 
-  /// @domName SpeechInputResultList.item; @docsEditable true
+  @DocsEditable @DomName('SpeechInputResultList.item')
   SpeechInputResult item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24935,10 +25782,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechRecognitionResultList; @docsEditable true
+
+@DocsEditable
+@DomName('SpeechRecognitionResultList')
 class _SpeechRecognitionResultList implements JavaScriptIndexingBehavior, List<SpeechRecognitionResult> native "*SpeechRecognitionResultList" {
 
-  /// @domName SpeechRecognitionResultList.length; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognitionResultList.length')
   int get length => JS("int", "#.length", this);
 
   SpeechRecognitionResult operator[](int index) => JS("SpeechRecognitionResult", "#[#]", this, index);
@@ -24959,50 +25808,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechRecognitionResult)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(SpeechRecognitionResult element) => Collections.contains(this, element);
+  bool contains(SpeechRecognitionResult element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(SpeechRecognitionResult element)) => Collections.forEach(this, f);
+  void forEach(void f(SpeechRecognitionResult element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(SpeechRecognitionResult element)) => new MappedList<SpeechRecognitionResult, dynamic>(this, f);
+  List mappedBy(f(SpeechRecognitionResult element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<SpeechRecognitionResult> where(bool f(SpeechRecognitionResult element)) => new WhereIterable<SpeechRecognitionResult>(this, f);
+  Iterable<SpeechRecognitionResult> where(bool f(SpeechRecognitionResult element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(SpeechRecognitionResult element)) => Collections.every(this, f);
+  bool every(bool f(SpeechRecognitionResult element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(SpeechRecognitionResult element)) => Collections.any(this, f);
+  bool any(bool f(SpeechRecognitionResult element)) => IterableMixinWorkaround.any(this, f);
 
   List<SpeechRecognitionResult> toList() => new List<SpeechRecognitionResult>.from(this);
   Set<SpeechRecognitionResult> toSet() => new Set<SpeechRecognitionResult>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<SpeechRecognitionResult> take(int n) => new ListView<SpeechRecognitionResult>(this, 0, n);
+  List<SpeechRecognitionResult> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<SpeechRecognitionResult> takeWhile(bool test(SpeechRecognitionResult value)) {
-    return new TakeWhileIterable<SpeechRecognitionResult>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<SpeechRecognitionResult> skip(int n) => new ListView<SpeechRecognitionResult>(this, n, null);
+  List<SpeechRecognitionResult> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<SpeechRecognitionResult> skipWhile(bool test(SpeechRecognitionResult value)) {
-    return new SkipWhileIterable<SpeechRecognitionResult>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   SpeechRecognitionResult firstMatching(bool test(SpeechRecognitionResult value), { SpeechRecognitionResult orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   SpeechRecognitionResult lastMatching(bool test(SpeechRecognitionResult value), {SpeechRecognitionResult orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   SpeechRecognitionResult singleMatching(bool test(SpeechRecognitionResult value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   SpeechRecognitionResult elementAt(int index) {
@@ -25060,16 +25909,36 @@
     throw new StateError("More than one element");
   }
 
-  SpeechRecognitionResult min([int compare(SpeechRecognitionResult a, SpeechRecognitionResult b)]) => Collections.min(this, compare);
+  SpeechRecognitionResult min([int compare(SpeechRecognitionResult a, SpeechRecognitionResult b)]) => IterableMixinWorkaround.min(this, compare);
 
-  SpeechRecognitionResult max([int compare(SpeechRecognitionResult a, SpeechRecognitionResult b)]) => Collections.max(this, compare);
+  SpeechRecognitionResult max([int compare(SpeechRecognitionResult a, SpeechRecognitionResult b)]) => IterableMixinWorkaround.max(this, compare);
 
   SpeechRecognitionResult removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   SpeechRecognitionResult removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(SpeechRecognitionResult element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(SpeechRecognitionResult element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<SpeechRecognitionResult> from, [int startFrom]) {
@@ -25089,7 +25958,7 @@
 
   // -- end List<SpeechRecognitionResult> mixins.
 
-  /// @domName SpeechRecognitionResultList.item; @docsEditable true
+  @DocsEditable @DomName('SpeechRecognitionResultList.item')
   SpeechRecognitionResult item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25097,10 +25966,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName StyleSheetList; @docsEditable true
+
+@DocsEditable
+@DomName('StyleSheetList')
 class _StyleSheetList implements JavaScriptIndexingBehavior, List<StyleSheet> native "*StyleSheetList" {
 
-  /// @domName StyleSheetList.length; @docsEditable true
+  @DocsEditable @DomName('StyleSheetList.length')
   int get length => JS("int", "#.length", this);
 
   StyleSheet operator[](int index) => JS("StyleSheet", "#[#]", this, index);
@@ -25121,50 +25992,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, StyleSheet)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(StyleSheet element) => Collections.contains(this, element);
+  bool contains(StyleSheet element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(StyleSheet element)) => Collections.forEach(this, f);
+  void forEach(void f(StyleSheet element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(StyleSheet element)) => new MappedList<StyleSheet, dynamic>(this, f);
+  List mappedBy(f(StyleSheet element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<StyleSheet> where(bool f(StyleSheet element)) => new WhereIterable<StyleSheet>(this, f);
+  Iterable<StyleSheet> where(bool f(StyleSheet element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(StyleSheet element)) => Collections.every(this, f);
+  bool every(bool f(StyleSheet element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(StyleSheet element)) => Collections.any(this, f);
+  bool any(bool f(StyleSheet element)) => IterableMixinWorkaround.any(this, f);
 
   List<StyleSheet> toList() => new List<StyleSheet>.from(this);
   Set<StyleSheet> toSet() => new Set<StyleSheet>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<StyleSheet> take(int n) => new ListView<StyleSheet>(this, 0, n);
+  List<StyleSheet> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<StyleSheet> takeWhile(bool test(StyleSheet value)) {
-    return new TakeWhileIterable<StyleSheet>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<StyleSheet> skip(int n) => new ListView<StyleSheet>(this, n, null);
+  List<StyleSheet> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<StyleSheet> skipWhile(bool test(StyleSheet value)) {
-    return new SkipWhileIterable<StyleSheet>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   StyleSheet firstMatching(bool test(StyleSheet value), { StyleSheet orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   StyleSheet lastMatching(bool test(StyleSheet value), {StyleSheet orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   StyleSheet singleMatching(bool test(StyleSheet value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   StyleSheet elementAt(int index) {
@@ -25222,16 +26093,36 @@
     throw new StateError("More than one element");
   }
 
-  StyleSheet min([int compare(StyleSheet a, StyleSheet b)]) => Collections.min(this, compare);
+  StyleSheet min([int compare(StyleSheet a, StyleSheet b)]) => IterableMixinWorkaround.min(this, compare);
 
-  StyleSheet max([int compare(StyleSheet a, StyleSheet b)]) => Collections.max(this, compare);
+  StyleSheet max([int compare(StyleSheet a, StyleSheet b)]) => IterableMixinWorkaround.max(this, compare);
 
   StyleSheet removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   StyleSheet removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(StyleSheet element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(StyleSheet element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<StyleSheet> from, [int startFrom]) {
@@ -25251,7 +26142,7 @@
 
   // -- end List<StyleSheet> mixins.
 
-  /// @domName StyleSheetList.item; @docsEditable true
+  @DocsEditable @DomName('StyleSheetList.item')
   StyleSheet item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25672,11 +26563,12 @@
 
   void add(String value) {
     // TODO - figure out if we need to do any validation here
-    // or if the browser natively does enough
+    // or if the browser natively does enough.
     _modify((s) => s.add(value));
   }
 
-  bool remove(String value) {
+  bool remove(Object value) {
+    if (value is! String) return false;
     Set<String> s = readClasses();
     bool result = s.remove(value);
     writeClasses(s);
@@ -25684,7 +26576,7 @@
   }
 
   void addAll(Iterable<String> iterable) {
-    // TODO - see comment above about validation
+    // TODO - see comment above about validation.
     _modify((s) => s.addAll(iterable));
   }
 
@@ -25692,6 +26584,18 @@
     _modify((s) => s.removeAll(iterable));
   }
 
+  void retainAll(Iterable<String> iterable) {
+    _modify((s) => s.retainAll(iterable));
+  }
+
+  void removeMatching(bool test(String name)) {
+    _modify((s) => s.removeMatching(test));
+  }
+
+  void retainMatching(bool test(String name)) {
+    _modify((s) => s.retainMatching(test));
+  }
+
   bool isSubsetOf(Collection<String> collection) =>
     readClasses().isSubsetOf(collection);
 
@@ -25936,6 +26840,21 @@
     return new _EventStream(e, _eventType, useCapture);
   }
 }
+
+/**
+ * A factory to expose DOM events as streams, where the DOM event name has to
+ * be determined on the fly (for example, mouse wheel events).
+ */
+class _CustomEventStreamProvider<T extends Event>
+    implements EventStreamProvider<T> {
+
+  final _eventTypeGetter;
+  const _CustomEventStreamProvider(this._eventTypeGetter);
+
+  Stream<T> forTarget(EventTarget e, {bool useCapture: false}) {
+    return new _EventStream(e, _eventTypeGetter(e), useCapture);
+  }
+}
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -27840,7 +28759,7 @@
 }
 
 class _DocumentFragmentFactoryProvider {
-  /** @domName Document.createDocumentFragment */
+  @DomName('Document.createDocumentFragment')
   static DocumentFragment createDocumentFragment() =>
       document.createDocumentFragment();
 
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 8b45bec..82f4968 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -2,6 +2,7 @@
 
 import 'dart:async';
 import 'dart:collection';
+import 'dart:collection-dev';
 import 'dart:html_common';
 import 'dart:indexed_db';
 import 'dart:isolate';
@@ -72,38 +73,40 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName AbstractWorker
+@DocsEditable
+@DomName('AbstractWorker')
 class AbstractWorker extends EventTarget {
   AbstractWorker.internal() : super.internal();
 
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   AbstractWorkerEvents get on =>
     new AbstractWorkerEvents(this);
 
-
-  /** @domName AbstractWorker.addEventListener */
+  @DocsEditable
+  @DomName('AbstractWorker.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "AbstractWorker_addEventListener_Callback";
 
-
-  /** @domName AbstractWorker.dispatchEvent */
+  @DocsEditable
+  @DomName('AbstractWorker.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "AbstractWorker_dispatchEvent_Callback";
 
-
-  /** @domName AbstractWorker.removeEventListener */
+  @DocsEditable
+  @DomName('AbstractWorker.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "AbstractWorker_removeEventListener_Callback";
 
   Stream<Event> get onError => errorEvent.forTarget(this);
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class AbstractWorkerEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   AbstractWorkerEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -113,143 +116,144 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLAnchorElement
+@DocsEditable
+@DomName('HTMLAnchorElement')
 class AnchorElement extends _Element_Merged {
   AnchorElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory AnchorElement({String href}) {
     var e = document.$dom_createElement("a");
     if (href != null) e.href = href;
     return e;
   }
 
-
-  /** @domName HTMLAnchorElement.download */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.download')
   String get download native "HTMLAnchorElement_download_Getter";
 
-
-  /** @domName HTMLAnchorElement.download */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.download')
   void set download(String value) native "HTMLAnchorElement_download_Setter";
 
-
-  /** @domName HTMLAnchorElement.hash */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.hash')
   String get hash native "HTMLAnchorElement_hash_Getter";
 
-
-  /** @domName HTMLAnchorElement.hash */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.hash')
   void set hash(String value) native "HTMLAnchorElement_hash_Setter";
 
-
-  /** @domName HTMLAnchorElement.host */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.host')
   String get host native "HTMLAnchorElement_host_Getter";
 
-
-  /** @domName HTMLAnchorElement.host */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.host')
   void set host(String value) native "HTMLAnchorElement_host_Setter";
 
-
-  /** @domName HTMLAnchorElement.hostname */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.hostname')
   String get hostname native "HTMLAnchorElement_hostname_Getter";
 
-
-  /** @domName HTMLAnchorElement.hostname */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.hostname')
   void set hostname(String value) native "HTMLAnchorElement_hostname_Setter";
 
-
-  /** @domName HTMLAnchorElement.href */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.href')
   String get href native "HTMLAnchorElement_href_Getter";
 
-
-  /** @domName HTMLAnchorElement.href */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.href')
   void set href(String value) native "HTMLAnchorElement_href_Setter";
 
-
-  /** @domName HTMLAnchorElement.hreflang */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.hreflang')
   String get hreflang native "HTMLAnchorElement_hreflang_Getter";
 
-
-  /** @domName HTMLAnchorElement.hreflang */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.hreflang')
   void set hreflang(String value) native "HTMLAnchorElement_hreflang_Setter";
 
-
-  /** @domName HTMLAnchorElement.name */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.name')
   String get name native "HTMLAnchorElement_name_Getter";
 
-
-  /** @domName HTMLAnchorElement.name */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.name')
   void set name(String value) native "HTMLAnchorElement_name_Setter";
 
-
-  /** @domName HTMLAnchorElement.origin */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.origin')
   String get origin native "HTMLAnchorElement_origin_Getter";
 
-
-  /** @domName HTMLAnchorElement.pathname */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.pathname')
   String get pathname native "HTMLAnchorElement_pathname_Getter";
 
-
-  /** @domName HTMLAnchorElement.pathname */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.pathname')
   void set pathname(String value) native "HTMLAnchorElement_pathname_Setter";
 
-
-  /** @domName HTMLAnchorElement.ping */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.ping')
   String get ping native "HTMLAnchorElement_ping_Getter";
 
-
-  /** @domName HTMLAnchorElement.ping */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.ping')
   void set ping(String value) native "HTMLAnchorElement_ping_Setter";
 
-
-  /** @domName HTMLAnchorElement.port */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.port')
   String get port native "HTMLAnchorElement_port_Getter";
 
-
-  /** @domName HTMLAnchorElement.port */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.port')
   void set port(String value) native "HTMLAnchorElement_port_Setter";
 
-
-  /** @domName HTMLAnchorElement.protocol */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.protocol')
   String get protocol native "HTMLAnchorElement_protocol_Getter";
 
-
-  /** @domName HTMLAnchorElement.protocol */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.protocol')
   void set protocol(String value) native "HTMLAnchorElement_protocol_Setter";
 
-
-  /** @domName HTMLAnchorElement.rel */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.rel')
   String get rel native "HTMLAnchorElement_rel_Getter";
 
-
-  /** @domName HTMLAnchorElement.rel */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.rel')
   void set rel(String value) native "HTMLAnchorElement_rel_Setter";
 
-
-  /** @domName HTMLAnchorElement.search */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.search')
   String get search native "HTMLAnchorElement_search_Getter";
 
-
-  /** @domName HTMLAnchorElement.search */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.search')
   void set search(String value) native "HTMLAnchorElement_search_Setter";
 
-
-  /** @domName HTMLAnchorElement.target */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.target')
   String get target native "HTMLAnchorElement_target_Getter";
 
-
-  /** @domName HTMLAnchorElement.target */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.target')
   void set target(String value) native "HTMLAnchorElement_target_Setter";
 
-
-  /** @domName HTMLAnchorElement.type */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.type')
   String get type native "HTMLAnchorElement_type_Getter";
 
-
-  /** @domName HTMLAnchorElement.type */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.type')
   void set type(String value) native "HTMLAnchorElement_type_Setter";
 
-
-  /** @domName HTMLAnchorElement.toString */
+  @DocsEditable
+  @DomName('HTMLAnchorElement.toString')
   String toString() native "HTMLAnchorElement_toString_Callback";
 
 }
@@ -260,16 +264,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebKitAnimationEvent
+@DocsEditable
+@DomName('WebKitAnimationEvent')
 class AnimationEvent extends Event {
   AnimationEvent.internal() : super.internal();
 
-
-  /** @domName WebKitAnimationEvent.animationName */
+  @DocsEditable
+  @DomName('WebKitAnimationEvent.animationName')
   String get animationName native "WebKitAnimationEvent_animationName_Getter";
 
-
-  /** @domName WebKitAnimationEvent.elapsedTime */
+  @DocsEditable
+  @DomName('WebKitAnimationEvent.elapsedTime')
   num get elapsedTime native "WebKitAnimationEvent_elapsedTime_Getter";
 
 }
@@ -280,107 +285,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLAppletElement
-class AppletElement extends _Element_Merged {
-  AppletElement.internal() : super.internal();
-
-
-  /** @domName HTMLAppletElement.align */
-  String get align native "HTMLAppletElement_align_Getter";
-
-
-  /** @domName HTMLAppletElement.align */
-  void set align(String value) native "HTMLAppletElement_align_Setter";
-
-
-  /** @domName HTMLAppletElement.alt */
-  String get alt native "HTMLAppletElement_alt_Getter";
-
-
-  /** @domName HTMLAppletElement.alt */
-  void set alt(String value) native "HTMLAppletElement_alt_Setter";
-
-
-  /** @domName HTMLAppletElement.archive */
-  String get archive native "HTMLAppletElement_archive_Getter";
-
-
-  /** @domName HTMLAppletElement.archive */
-  void set archive(String value) native "HTMLAppletElement_archive_Setter";
-
-
-  /** @domName HTMLAppletElement.code */
-  String get code native "HTMLAppletElement_code_Getter";
-
-
-  /** @domName HTMLAppletElement.code */
-  void set code(String value) native "HTMLAppletElement_code_Setter";
-
-
-  /** @domName HTMLAppletElement.codeBase */
-  String get codeBase native "HTMLAppletElement_codeBase_Getter";
-
-
-  /** @domName HTMLAppletElement.codeBase */
-  void set codeBase(String value) native "HTMLAppletElement_codeBase_Setter";
-
-
-  /** @domName HTMLAppletElement.height */
-  String get height native "HTMLAppletElement_height_Getter";
-
-
-  /** @domName HTMLAppletElement.height */
-  void set height(String value) native "HTMLAppletElement_height_Setter";
-
-
-  /** @domName HTMLAppletElement.hspace */
-  String get hspace native "HTMLAppletElement_hspace_Getter";
-
-
-  /** @domName HTMLAppletElement.hspace */
-  void set hspace(String value) native "HTMLAppletElement_hspace_Setter";
-
-
-  /** @domName HTMLAppletElement.name */
-  String get name native "HTMLAppletElement_name_Getter";
-
-
-  /** @domName HTMLAppletElement.name */
-  void set name(String value) native "HTMLAppletElement_name_Setter";
-
-
-  /** @domName HTMLAppletElement.object */
-  String get object native "HTMLAppletElement_object_Getter";
-
-
-  /** @domName HTMLAppletElement.object */
-  void set object(String value) native "HTMLAppletElement_object_Setter";
-
-
-  /** @domName HTMLAppletElement.vspace */
-  String get vspace native "HTMLAppletElement_vspace_Getter";
-
-
-  /** @domName HTMLAppletElement.vspace */
-  void set vspace(String value) native "HTMLAppletElement_vspace_Setter";
-
-
-  /** @domName HTMLAppletElement.width */
-  String get width native "HTMLAppletElement_width_Getter";
-
-
-  /** @domName HTMLAppletElement.width */
-  void set width(String value) native "HTMLAppletElement_width_Setter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName DOMApplicationCache
+@DocsEditable
+@DomName('DOMApplicationCache')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.FIREFOX)
+@SupportedBrowser(SupportedBrowser.IE, '10')
+@SupportedBrowser(SupportedBrowser.OPERA)
+@SupportedBrowser(SupportedBrowser.SAFARI)
 class ApplicationCache extends EventTarget {
   ApplicationCache.internal() : super.internal();
 
@@ -400,7 +311,11 @@
 
   static const EventStreamProvider<Event> updateReadyEvent = const EventStreamProvider<Event>('updateready');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  /// Checks if this type is supported on the current platform.
+  static bool get supported => true;
+
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   ApplicationCacheEvents get on =>
     new ApplicationCacheEvents(this);
 
@@ -416,32 +331,32 @@
 
   static const int UPDATEREADY = 4;
 
-
-  /** @domName DOMApplicationCache.status */
+  @DocsEditable
+  @DomName('DOMApplicationCache.status')
   int get status native "DOMApplicationCache_status_Getter";
 
-
-  /** @domName DOMApplicationCache.abort */
+  @DocsEditable
+  @DomName('DOMApplicationCache.abort')
   void abort() native "DOMApplicationCache_abort_Callback";
 
-
-  /** @domName DOMApplicationCache.addEventListener */
+  @DocsEditable
+  @DomName('DOMApplicationCache.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "DOMApplicationCache_addEventListener_Callback";
 
-
-  /** @domName DOMApplicationCache.dispatchEvent */
+  @DocsEditable
+  @DomName('DOMApplicationCache.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "DOMApplicationCache_dispatchEvent_Callback";
 
-
-  /** @domName DOMApplicationCache.removeEventListener */
+  @DocsEditable
+  @DomName('DOMApplicationCache.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "DOMApplicationCache_removeEventListener_Callback";
 
-
-  /** @domName DOMApplicationCache.swapCache */
+  @DocsEditable
+  @DomName('DOMApplicationCache.swapCache')
   void swapCache() native "DOMApplicationCache_swapCache_Callback";
 
-
-  /** @domName DOMApplicationCache.update */
+  @DocsEditable
+  @DomName('DOMApplicationCache.update')
   void update() native "DOMApplicationCache_update_Callback";
 
   Stream<Event> get onCached => cachedEvent.forTarget(this);
@@ -462,33 +377,33 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class ApplicationCacheEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   ApplicationCacheEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get cached => this['cached'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get checking => this['checking'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get downloading => this['downloading'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get noUpdate => this['noupdate'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get obsolete => this['obsolete'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get progress => this['progress'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get updateReady => this['updateready'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -498,87 +413,88 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLAreaElement
+@DocsEditable
+@DomName('HTMLAreaElement')
 class AreaElement extends _Element_Merged {
   AreaElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory AreaElement() => document.$dom_createElement("area");
 
-
-  /** @domName HTMLAreaElement.alt */
+  @DocsEditable
+  @DomName('HTMLAreaElement.alt')
   String get alt native "HTMLAreaElement_alt_Getter";
 
-
-  /** @domName HTMLAreaElement.alt */
+  @DocsEditable
+  @DomName('HTMLAreaElement.alt')
   void set alt(String value) native "HTMLAreaElement_alt_Setter";
 
-
-  /** @domName HTMLAreaElement.coords */
+  @DocsEditable
+  @DomName('HTMLAreaElement.coords')
   String get coords native "HTMLAreaElement_coords_Getter";
 
-
-  /** @domName HTMLAreaElement.coords */
+  @DocsEditable
+  @DomName('HTMLAreaElement.coords')
   void set coords(String value) native "HTMLAreaElement_coords_Setter";
 
-
-  /** @domName HTMLAreaElement.hash */
+  @DocsEditable
+  @DomName('HTMLAreaElement.hash')
   String get hash native "HTMLAreaElement_hash_Getter";
 
-
-  /** @domName HTMLAreaElement.host */
+  @DocsEditable
+  @DomName('HTMLAreaElement.host')
   String get host native "HTMLAreaElement_host_Getter";
 
-
-  /** @domName HTMLAreaElement.hostname */
+  @DocsEditable
+  @DomName('HTMLAreaElement.hostname')
   String get hostname native "HTMLAreaElement_hostname_Getter";
 
-
-  /** @domName HTMLAreaElement.href */
+  @DocsEditable
+  @DomName('HTMLAreaElement.href')
   String get href native "HTMLAreaElement_href_Getter";
 
-
-  /** @domName HTMLAreaElement.href */
+  @DocsEditable
+  @DomName('HTMLAreaElement.href')
   void set href(String value) native "HTMLAreaElement_href_Setter";
 
-
-  /** @domName HTMLAreaElement.pathname */
+  @DocsEditable
+  @DomName('HTMLAreaElement.pathname')
   String get pathname native "HTMLAreaElement_pathname_Getter";
 
-
-  /** @domName HTMLAreaElement.ping */
+  @DocsEditable
+  @DomName('HTMLAreaElement.ping')
   String get ping native "HTMLAreaElement_ping_Getter";
 
-
-  /** @domName HTMLAreaElement.ping */
+  @DocsEditable
+  @DomName('HTMLAreaElement.ping')
   void set ping(String value) native "HTMLAreaElement_ping_Setter";
 
-
-  /** @domName HTMLAreaElement.port */
+  @DocsEditable
+  @DomName('HTMLAreaElement.port')
   String get port native "HTMLAreaElement_port_Getter";
 
-
-  /** @domName HTMLAreaElement.protocol */
+  @DocsEditable
+  @DomName('HTMLAreaElement.protocol')
   String get protocol native "HTMLAreaElement_protocol_Getter";
 
-
-  /** @domName HTMLAreaElement.search */
+  @DocsEditable
+  @DomName('HTMLAreaElement.search')
   String get search native "HTMLAreaElement_search_Getter";
 
-
-  /** @domName HTMLAreaElement.shape */
+  @DocsEditable
+  @DomName('HTMLAreaElement.shape')
   String get shape native "HTMLAreaElement_shape_Getter";
 
-
-  /** @domName HTMLAreaElement.shape */
+  @DocsEditable
+  @DomName('HTMLAreaElement.shape')
   void set shape(String value) native "HTMLAreaElement_shape_Setter";
 
-
-  /** @domName HTMLAreaElement.target */
+  @DocsEditable
+  @DomName('HTMLAreaElement.target')
   String get target native "HTMLAreaElement_target_Getter";
 
-
-  /** @domName HTMLAreaElement.target */
+  @DocsEditable
+  @DomName('HTMLAreaElement.target')
   void set target(String value) native "HTMLAreaElement_target_Setter";
 
 }
@@ -589,7 +505,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ArrayBuffer
+@DocsEditable
+@DomName('ArrayBuffer')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -597,30 +514,30 @@
 class ArrayBuffer extends NativeFieldWrapperClass1 {
   ArrayBuffer.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory ArrayBuffer(int length) => ArrayBuffer._create(length);
   static ArrayBuffer _create(int length) native "ArrayBuffer_constructor_Callback";
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-
-  /** @domName ArrayBuffer.byteLength */
+  @DocsEditable
+  @DomName('ArrayBuffer.byteLength')
   int get byteLength native "ArrayBuffer_byteLength_Getter";
 
-  ArrayBuffer slice(/*long*/ begin, [/*long*/ end]) {
+  ArrayBuffer slice(int begin, [int end]) {
     if (?end) {
       return _slice_1(begin, end);
     }
     return _slice_2(begin);
   }
 
-
-  /** @domName ArrayBuffer.slice_1 */
+  @DocsEditable
+  @DomName('ArrayBuffer.slice_1')
   ArrayBuffer _slice_1(begin, end) native "ArrayBuffer_slice_1_Callback";
 
-
-  /** @domName ArrayBuffer.slice_2 */
+  @DocsEditable
+  @DomName('ArrayBuffer.slice_2')
   ArrayBuffer _slice_2(begin) native "ArrayBuffer_slice_2_Callback";
 
 }
@@ -631,7 +548,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ArrayBufferView
+@DocsEditable
+@DomName('ArrayBufferView')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -639,16 +557,16 @@
 class ArrayBufferView extends NativeFieldWrapperClass1 {
   ArrayBufferView.internal();
 
-
-  /** @domName ArrayBufferView.buffer */
+  @DocsEditable
+  @DomName('ArrayBufferView.buffer')
   ArrayBuffer get buffer native "ArrayBufferView_buffer_Getter";
 
-
-  /** @domName ArrayBufferView.byteLength */
+  @DocsEditable
+  @DomName('ArrayBufferView.byteLength')
   int get byteLength native "ArrayBufferView_byteLength_Getter";
 
-
-  /** @domName ArrayBufferView.byteOffset */
+  @DocsEditable
+  @DomName('ArrayBufferView.byteOffset')
   int get byteOffset native "ArrayBufferView_byteOffset_Getter";
 
 }
@@ -659,34 +577,11 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Attr
+@DocsEditable
+@DomName('Attr')
 class Attr extends Node {
   Attr.internal() : super.internal();
 
-
-  /** @domName Attr.isId */
-  bool get isId native "Attr_isId_Getter";
-
-
-  /** @domName Attr.name */
-  String get name native "Attr_name_Getter";
-
-
-  /** @domName Attr.ownerElement */
-  Element get ownerElement native "Attr_ownerElement_Getter";
-
-
-  /** @domName Attr.specified */
-  bool get specified native "Attr_specified_Getter";
-
-
-  /** @domName Attr.value */
-  String get value native "Attr_value_Getter";
-
-
-  /** @domName Attr.value */
-  void set value(String value) native "Attr_value_Setter";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -695,11 +590,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLAudioElement
+@DocsEditable
+@DomName('HTMLAudioElement')
 class AudioElement extends MediaElement {
   AudioElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory AudioElement([String src]) {
     if (!?src) {
       return AudioElement._create();
@@ -716,11 +612,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLBRElement
+@DocsEditable
+@DomName('HTMLBRElement')
 class BRElement extends _Element_Merged {
   BRElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory BRElement() => document.$dom_createElement("br");
 
 }
@@ -731,12 +628,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName BarInfo
+@DocsEditable
+@DomName('BarInfo')
 class BarInfo extends NativeFieldWrapperClass1 {
   BarInfo.internal();
 
-
-  /** @domName BarInfo.visible */
+  @DocsEditable
+  @DomName('BarInfo.visible')
   bool get visible native "BarInfo_visible_Getter";
 
 }
@@ -747,27 +645,28 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLBaseElement
+@DocsEditable
+@DomName('HTMLBaseElement')
 class BaseElement extends _Element_Merged {
   BaseElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory BaseElement() => document.$dom_createElement("base");
 
-
-  /** @domName HTMLBaseElement.href */
+  @DocsEditable
+  @DomName('HTMLBaseElement.href')
   String get href native "HTMLBaseElement_href_Getter";
 
-
-  /** @domName HTMLBaseElement.href */
+  @DocsEditable
+  @DomName('HTMLBaseElement.href')
   void set href(String value) native "HTMLBaseElement_href_Setter";
 
-
-  /** @domName HTMLBaseElement.target */
+  @DocsEditable
+  @DomName('HTMLBaseElement.target')
   String get target native "HTMLBaseElement_target_Getter";
 
-
-  /** @domName HTMLBaseElement.target */
+  @DocsEditable
+  @DomName('HTMLBaseElement.target')
   void set target(String value) native "HTMLBaseElement_target_Setter";
 
 }
@@ -778,43 +677,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLBaseFontElement
-class BaseFontElement extends _Element_Merged {
-  BaseFontElement.internal() : super.internal();
-
-
-  /** @domName HTMLBaseFontElement.color */
-  String get color native "HTMLBaseFontElement_color_Getter";
-
-
-  /** @domName HTMLBaseFontElement.color */
-  void set color(String value) native "HTMLBaseFontElement_color_Setter";
-
-
-  /** @domName HTMLBaseFontElement.face */
-  String get face native "HTMLBaseFontElement_face_Getter";
-
-
-  /** @domName HTMLBaseFontElement.face */
-  void set face(String value) native "HTMLBaseFontElement_face_Setter";
-
-
-  /** @domName HTMLBaseFontElement.size */
-  int get size native "HTMLBaseFontElement_size_Getter";
-
-
-  /** @domName HTMLBaseFontElement.size */
-  void set size(int value) native "HTMLBaseFontElement_size_Setter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName BatteryManager
+@DocsEditable
+@DomName('BatteryManager')
 class BatteryManager extends EventTarget {
   BatteryManager.internal() : super.internal();
 
@@ -826,36 +690,37 @@
 
   static const EventStreamProvider<Event> levelChangeEvent = const EventStreamProvider<Event>('levelchange');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   BatteryManagerEvents get on =>
     new BatteryManagerEvents(this);
 
-
-  /** @domName BatteryManager.charging */
+  @DocsEditable
+  @DomName('BatteryManager.charging')
   bool get charging native "BatteryManager_charging_Getter";
 
-
-  /** @domName BatteryManager.chargingTime */
+  @DocsEditable
+  @DomName('BatteryManager.chargingTime')
   num get chargingTime native "BatteryManager_chargingTime_Getter";
 
-
-  /** @domName BatteryManager.dischargingTime */
+  @DocsEditable
+  @DomName('BatteryManager.dischargingTime')
   num get dischargingTime native "BatteryManager_dischargingTime_Getter";
 
-
-  /** @domName BatteryManager.level */
+  @DocsEditable
+  @DomName('BatteryManager.level')
   num get level native "BatteryManager_level_Getter";
 
-
-  /** @domName BatteryManager.addEventListener */
+  @DocsEditable
+  @DomName('BatteryManager.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "BatteryManager_addEventListener_Callback";
 
-
-  /** @domName BatteryManager.dispatchEvent */
+  @DocsEditable
+  @DomName('BatteryManager.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native "BatteryManager_dispatchEvent_Callback";
 
-
-  /** @domName BatteryManager.removeEventListener */
+  @DocsEditable
+  @DomName('BatteryManager.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "BatteryManager_removeEventListener_Callback";
 
   Stream<Event> get onChargingChange => chargingChangeEvent.forTarget(this);
@@ -868,21 +733,21 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class BatteryManagerEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   BatteryManagerEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get chargingChange => this['chargingchange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get chargingTimeChange => this['chargingtimechange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dischargingTimeChange => this['dischargingtimechange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get levelChange => this['levelchange'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -892,12 +757,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName BeforeLoadEvent
+@DocsEditable
+@DomName('BeforeLoadEvent')
 class BeforeLoadEvent extends Event {
   BeforeLoadEvent.internal() : super.internal();
 
-
-  /** @domName BeforeLoadEvent.url */
+  @DocsEditable
+  @DomName('BeforeLoadEvent.url')
   String get url native "BeforeLoadEvent_url_Getter";
 
 }
@@ -906,11 +772,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Blob
+@DocsEditable
+@DomName('Blob')
 class Blob extends NativeFieldWrapperClass1 {
   Blob.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory Blob(List blobParts, [String type, String endings]) {
     if (!?type) {
       return Blob._create(blobParts);
@@ -922,15 +789,15 @@
   }
   static Blob _create(List blobParts, [String type, String endings]) native "Blob_constructor_Callback";
 
-
-  /** @domName Blob.size */
+  @DocsEditable
+  @DomName('Blob.size')
   int get size native "Blob_size_Getter";
 
-
-  /** @domName Blob.type */
+  @DocsEditable
+  @DomName('Blob.type')
   String get type native "Blob_type_Getter";
 
-  Blob slice([/*long long*/ start, /*long long*/ end, /*DOMString*/ contentType]) {
+  Blob slice([int start, int end, String contentType]) {
     if (?contentType) {
       return _slice_1(start, end, contentType);
     }
@@ -943,20 +810,20 @@
     return _slice_4();
   }
 
-
-  /** @domName Blob.slice_1 */
+  @DocsEditable
+  @DomName('Blob.slice_1')
   Blob _slice_1(start, end, contentType) native "Blob_slice_1_Callback";
 
-
-  /** @domName Blob.slice_2 */
+  @DocsEditable
+  @DomName('Blob.slice_2')
   Blob _slice_2(start, end) native "Blob_slice_2_Callback";
 
-
-  /** @domName Blob.slice_3 */
+  @DocsEditable
+  @DomName('Blob.slice_3')
   Blob _slice_3(start) native "Blob_slice_3_Callback";
 
-
-  /** @domName Blob.slice_4 */
+  @DocsEditable
+  @DomName('Blob.slice_4')
   Blob _slice_4() native "Blob_slice_4_Callback";
 
 }
@@ -968,7 +835,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLBodyElement
+@DocsEditable
+@DomName('HTMLBodyElement')
 class BodyElement extends _Element_Merged {
   BodyElement.internal() : super.internal();
 
@@ -998,21 +866,14 @@
 
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
 
-  ///@docsEditable true
+  @DocsEditable
   factory BodyElement() => document.$dom_createElement("body");
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   BodyElementEvents get on =>
     new BodyElementEvents(this);
 
-
-  /** @domName HTMLBodyElement.vLink */
-  String get vLink native "HTMLBodyElement_vLink_Getter";
-
-
-  /** @domName HTMLBodyElement.vLink */
-  void set vLink(String value) native "HTMLBodyElement_vLink_Setter";
-
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
   Stream<Event> get onBlur => blurEvent.forTarget(this);
@@ -1041,48 +902,48 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class BodyElementEvents extends ElementEvents {
-  /// @docsEditable true
+  @DocsEditable
   BodyElementEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get beforeUnload => this['beforeunload'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get blur => this['blur'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get focus => this['focus'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get hashChange => this['hashchange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get load => this['load'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get message => this['message'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get offline => this['offline'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get online => this['online'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get popState => this['popstate'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get resize => this['resize'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get storage => this['storage'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get unload => this['unload'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1092,119 +953,120 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLButtonElement
+@DocsEditable
+@DomName('HTMLButtonElement')
 class ButtonElement extends _Element_Merged {
   ButtonElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory ButtonElement() => document.$dom_createElement("button");
 
-
-  /** @domName HTMLButtonElement.autofocus */
+  @DocsEditable
+  @DomName('HTMLButtonElement.autofocus')
   bool get autofocus native "HTMLButtonElement_autofocus_Getter";
 
-
-  /** @domName HTMLButtonElement.autofocus */
+  @DocsEditable
+  @DomName('HTMLButtonElement.autofocus')
   void set autofocus(bool value) native "HTMLButtonElement_autofocus_Setter";
 
-
-  /** @domName HTMLButtonElement.disabled */
+  @DocsEditable
+  @DomName('HTMLButtonElement.disabled')
   bool get disabled native "HTMLButtonElement_disabled_Getter";
 
-
-  /** @domName HTMLButtonElement.disabled */
+  @DocsEditable
+  @DomName('HTMLButtonElement.disabled')
   void set disabled(bool value) native "HTMLButtonElement_disabled_Setter";
 
-
-  /** @domName HTMLButtonElement.form */
+  @DocsEditable
+  @DomName('HTMLButtonElement.form')
   FormElement get form native "HTMLButtonElement_form_Getter";
 
-
-  /** @domName HTMLButtonElement.formAction */
+  @DocsEditable
+  @DomName('HTMLButtonElement.formAction')
   String get formAction native "HTMLButtonElement_formAction_Getter";
 
-
-  /** @domName HTMLButtonElement.formAction */
+  @DocsEditable
+  @DomName('HTMLButtonElement.formAction')
   void set formAction(String value) native "HTMLButtonElement_formAction_Setter";
 
-
-  /** @domName HTMLButtonElement.formEnctype */
+  @DocsEditable
+  @DomName('HTMLButtonElement.formEnctype')
   String get formEnctype native "HTMLButtonElement_formEnctype_Getter";
 
-
-  /** @domName HTMLButtonElement.formEnctype */
+  @DocsEditable
+  @DomName('HTMLButtonElement.formEnctype')
   void set formEnctype(String value) native "HTMLButtonElement_formEnctype_Setter";
 
-
-  /** @domName HTMLButtonElement.formMethod */
+  @DocsEditable
+  @DomName('HTMLButtonElement.formMethod')
   String get formMethod native "HTMLButtonElement_formMethod_Getter";
 
-
-  /** @domName HTMLButtonElement.formMethod */
+  @DocsEditable
+  @DomName('HTMLButtonElement.formMethod')
   void set formMethod(String value) native "HTMLButtonElement_formMethod_Setter";
 
-
-  /** @domName HTMLButtonElement.formNoValidate */
+  @DocsEditable
+  @DomName('HTMLButtonElement.formNoValidate')
   bool get formNoValidate native "HTMLButtonElement_formNoValidate_Getter";
 
-
-  /** @domName HTMLButtonElement.formNoValidate */
+  @DocsEditable
+  @DomName('HTMLButtonElement.formNoValidate')
   void set formNoValidate(bool value) native "HTMLButtonElement_formNoValidate_Setter";
 
-
-  /** @domName HTMLButtonElement.formTarget */
+  @DocsEditable
+  @DomName('HTMLButtonElement.formTarget')
   String get formTarget native "HTMLButtonElement_formTarget_Getter";
 
-
-  /** @domName HTMLButtonElement.formTarget */
+  @DocsEditable
+  @DomName('HTMLButtonElement.formTarget')
   void set formTarget(String value) native "HTMLButtonElement_formTarget_Setter";
 
-
-  /** @domName HTMLButtonElement.labels */
+  @DocsEditable
+  @DomName('HTMLButtonElement.labels')
   List<Node> get labels native "HTMLButtonElement_labels_Getter";
 
-
-  /** @domName HTMLButtonElement.name */
+  @DocsEditable
+  @DomName('HTMLButtonElement.name')
   String get name native "HTMLButtonElement_name_Getter";
 
-
-  /** @domName HTMLButtonElement.name */
+  @DocsEditable
+  @DomName('HTMLButtonElement.name')
   void set name(String value) native "HTMLButtonElement_name_Setter";
 
-
-  /** @domName HTMLButtonElement.type */
+  @DocsEditable
+  @DomName('HTMLButtonElement.type')
   String get type native "HTMLButtonElement_type_Getter";
 
-
-  /** @domName HTMLButtonElement.type */
+  @DocsEditable
+  @DomName('HTMLButtonElement.type')
   void set type(String value) native "HTMLButtonElement_type_Setter";
 
-
-  /** @domName HTMLButtonElement.validationMessage */
+  @DocsEditable
+  @DomName('HTMLButtonElement.validationMessage')
   String get validationMessage native "HTMLButtonElement_validationMessage_Getter";
 
-
-  /** @domName HTMLButtonElement.validity */
+  @DocsEditable
+  @DomName('HTMLButtonElement.validity')
   ValidityState get validity native "HTMLButtonElement_validity_Getter";
 
-
-  /** @domName HTMLButtonElement.value */
+  @DocsEditable
+  @DomName('HTMLButtonElement.value')
   String get value native "HTMLButtonElement_value_Getter";
 
-
-  /** @domName HTMLButtonElement.value */
+  @DocsEditable
+  @DomName('HTMLButtonElement.value')
   void set value(String value) native "HTMLButtonElement_value_Setter";
 
-
-  /** @domName HTMLButtonElement.willValidate */
+  @DocsEditable
+  @DomName('HTMLButtonElement.willValidate')
   bool get willValidate native "HTMLButtonElement_willValidate_Getter";
 
-
-  /** @domName HTMLButtonElement.checkValidity */
+  @DocsEditable
+  @DomName('HTMLButtonElement.checkValidity')
   bool checkValidity() native "HTMLButtonElement_checkValidity_Callback";
 
-
-  /** @domName HTMLButtonElement.setCustomValidity */
+  @DocsEditable
+  @DomName('HTMLButtonElement.setCustomValidity')
   void setCustomValidity(String error) native "HTMLButtonElement_setCustomValidity_Callback";
 
 }
@@ -1215,7 +1077,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CDATASection
+@DocsEditable
+@DomName('CDATASection')
 class CDataSection extends Text {
   CDataSection.internal() : super.internal();
 
@@ -1225,11 +1088,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLCanvasElement
+@DocsEditable
+@DomName('HTMLCanvasElement')
 class CanvasElement extends _Element_Merged {
   CanvasElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory CanvasElement({int width, int height}) {
     var e = document.$dom_createElement("canvas");
     if (width != null) e.width = width;
@@ -1237,28 +1101,28 @@
     return e;
   }
 
-
-  /** @domName HTMLCanvasElement.height */
+  @DocsEditable
+  @DomName('HTMLCanvasElement.height')
   int get height native "HTMLCanvasElement_height_Getter";
 
-
-  /** @domName HTMLCanvasElement.height */
+  @DocsEditable
+  @DomName('HTMLCanvasElement.height')
   void set height(int value) native "HTMLCanvasElement_height_Setter";
 
-
-  /** @domName HTMLCanvasElement.width */
+  @DocsEditable
+  @DomName('HTMLCanvasElement.width')
   int get width native "HTMLCanvasElement_width_Getter";
 
-
-  /** @domName HTMLCanvasElement.width */
+  @DocsEditable
+  @DomName('HTMLCanvasElement.width')
   void set width(int value) native "HTMLCanvasElement_width_Setter";
 
-
-  /** @domName HTMLCanvasElement.getContext */
+  @DocsEditable
+  @DomName('HTMLCanvasElement.getContext')
   Object getContext(String contextId) native "HTMLCanvasElement_getContext_Callback";
 
-
-  /** @domName HTMLCanvasElement.toDataURL */
+  @DocsEditable
+  @DomName('HTMLCanvasElement.toDataURL')
   String toDataUrl(String type, [num quality]) native "HTMLCanvasElement_toDataURL_Callback";
 
 
@@ -1271,12 +1135,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CanvasGradient
+@DocsEditable
+@DomName('CanvasGradient')
 class CanvasGradient extends NativeFieldWrapperClass1 {
   CanvasGradient.internal();
 
-
-  /** @domName CanvasGradient.addColorStop */
+  @DocsEditable
+  @DomName('CanvasGradient.addColorStop')
   void addColorStop(num offset, String color) native "CanvasGradient_addColorStop_Callback";
 
 }
@@ -1287,7 +1152,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CanvasPattern
+@DocsEditable
+@DomName('CanvasPattern')
 class CanvasPattern extends NativeFieldWrapperClass1 {
   CanvasPattern.internal();
 
@@ -1299,12 +1165,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CanvasRenderingContext
+@DocsEditable
+@DomName('CanvasRenderingContext')
 class CanvasRenderingContext extends NativeFieldWrapperClass1 {
   CanvasRenderingContext.internal();
 
-
-  /** @domName CanvasRenderingContext.canvas */
+  @DocsEditable
+  @DomName('CanvasRenderingContext.canvas')
   CanvasElement get canvas native "CanvasRenderingContext_canvas_Getter";
 
 }
@@ -1313,195 +1180,196 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CanvasRenderingContext2D
+@DocsEditable
+@DomName('CanvasRenderingContext2D')
 class CanvasRenderingContext2D extends CanvasRenderingContext {
   CanvasRenderingContext2D.internal() : super.internal();
 
-
-  /** @domName CanvasRenderingContext2D.fillStyle */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.fillStyle')
   dynamic get fillStyle native "CanvasRenderingContext2D_fillStyle_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.fillStyle */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.fillStyle')
   void set fillStyle(dynamic value) native "CanvasRenderingContext2D_fillStyle_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.font */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.font')
   String get font native "CanvasRenderingContext2D_font_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.font */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.font')
   void set font(String value) native "CanvasRenderingContext2D_font_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.globalAlpha */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.globalAlpha')
   num get globalAlpha native "CanvasRenderingContext2D_globalAlpha_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.globalAlpha */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.globalAlpha')
   void set globalAlpha(num value) native "CanvasRenderingContext2D_globalAlpha_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.globalCompositeOperation */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.globalCompositeOperation')
   String get globalCompositeOperation native "CanvasRenderingContext2D_globalCompositeOperation_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.globalCompositeOperation */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.globalCompositeOperation')
   void set globalCompositeOperation(String value) native "CanvasRenderingContext2D_globalCompositeOperation_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.lineCap */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.lineCap')
   String get lineCap native "CanvasRenderingContext2D_lineCap_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.lineCap */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.lineCap')
   void set lineCap(String value) native "CanvasRenderingContext2D_lineCap_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.lineDashOffset */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.lineDashOffset')
   num get lineDashOffset native "CanvasRenderingContext2D_lineDashOffset_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.lineDashOffset */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.lineDashOffset')
   void set lineDashOffset(num value) native "CanvasRenderingContext2D_lineDashOffset_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.lineJoin */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.lineJoin')
   String get lineJoin native "CanvasRenderingContext2D_lineJoin_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.lineJoin */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.lineJoin')
   void set lineJoin(String value) native "CanvasRenderingContext2D_lineJoin_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.lineWidth */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.lineWidth')
   num get lineWidth native "CanvasRenderingContext2D_lineWidth_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.lineWidth */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.lineWidth')
   void set lineWidth(num value) native "CanvasRenderingContext2D_lineWidth_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.miterLimit */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.miterLimit')
   num get miterLimit native "CanvasRenderingContext2D_miterLimit_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.miterLimit */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.miterLimit')
   void set miterLimit(num value) native "CanvasRenderingContext2D_miterLimit_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.shadowBlur */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.shadowBlur')
   num get shadowBlur native "CanvasRenderingContext2D_shadowBlur_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.shadowBlur */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.shadowBlur')
   void set shadowBlur(num value) native "CanvasRenderingContext2D_shadowBlur_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.shadowColor */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.shadowColor')
   String get shadowColor native "CanvasRenderingContext2D_shadowColor_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.shadowColor */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.shadowColor')
   void set shadowColor(String value) native "CanvasRenderingContext2D_shadowColor_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.shadowOffsetX */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.shadowOffsetX')
   num get shadowOffsetX native "CanvasRenderingContext2D_shadowOffsetX_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.shadowOffsetX */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.shadowOffsetX')
   void set shadowOffsetX(num value) native "CanvasRenderingContext2D_shadowOffsetX_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.shadowOffsetY */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.shadowOffsetY')
   num get shadowOffsetY native "CanvasRenderingContext2D_shadowOffsetY_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.shadowOffsetY */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.shadowOffsetY')
   void set shadowOffsetY(num value) native "CanvasRenderingContext2D_shadowOffsetY_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.strokeStyle */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.strokeStyle')
   dynamic get strokeStyle native "CanvasRenderingContext2D_strokeStyle_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.strokeStyle */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.strokeStyle')
   void set strokeStyle(dynamic value) native "CanvasRenderingContext2D_strokeStyle_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.textAlign */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.textAlign')
   String get textAlign native "CanvasRenderingContext2D_textAlign_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.textAlign */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.textAlign')
   void set textAlign(String value) native "CanvasRenderingContext2D_textAlign_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.textBaseline */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.textBaseline')
   String get textBaseline native "CanvasRenderingContext2D_textBaseline_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.textBaseline */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.textBaseline')
   void set textBaseline(String value) native "CanvasRenderingContext2D_textBaseline_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.webkitBackingStorePixelRatio */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.webkitBackingStorePixelRatio')
   num get webkitBackingStorePixelRatio native "CanvasRenderingContext2D_webkitBackingStorePixelRatio_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.webkitImageSmoothingEnabled */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.webkitImageSmoothingEnabled')
   bool get webkitImageSmoothingEnabled native "CanvasRenderingContext2D_webkitImageSmoothingEnabled_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.webkitImageSmoothingEnabled */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.webkitImageSmoothingEnabled')
   void set webkitImageSmoothingEnabled(bool value) native "CanvasRenderingContext2D_webkitImageSmoothingEnabled_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.webkitLineDash */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.webkitLineDash')
   List get webkitLineDash native "CanvasRenderingContext2D_webkitLineDash_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.webkitLineDash */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.webkitLineDash')
   void set webkitLineDash(List value) native "CanvasRenderingContext2D_webkitLineDash_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.webkitLineDashOffset */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.webkitLineDashOffset')
   num get webkitLineDashOffset native "CanvasRenderingContext2D_webkitLineDashOffset_Getter";
 
-
-  /** @domName CanvasRenderingContext2D.webkitLineDashOffset */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.webkitLineDashOffset')
   void set webkitLineDashOffset(num value) native "CanvasRenderingContext2D_webkitLineDashOffset_Setter";
 
-
-  /** @domName CanvasRenderingContext2D.arc */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.arc')
   void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native "CanvasRenderingContext2D_arc_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.arcTo */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.arcTo')
   void arcTo(num x1, num y1, num x2, num y2, num radius) native "CanvasRenderingContext2D_arcTo_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.beginPath */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.beginPath')
   void beginPath() native "CanvasRenderingContext2D_beginPath_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.bezierCurveTo */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.bezierCurveTo')
   void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native "CanvasRenderingContext2D_bezierCurveTo_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.clearRect */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.clearRect')
   void clearRect(num x, num y, num width, num height) native "CanvasRenderingContext2D_clearRect_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.clip */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.clip')
   void clip() native "CanvasRenderingContext2D_clip_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.closePath */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.closePath')
   void closePath() native "CanvasRenderingContext2D_closePath_Callback";
 
-  ImageData createImageData(imagedata_OR_sw, [/*float*/ sh]) {
+  ImageData createImageData(imagedata_OR_sw, [num sh]) {
     if ((imagedata_OR_sw is ImageData || imagedata_OR_sw == null) && !?sh) {
       return _createImageData_1(imagedata_OR_sw);
     }
@@ -1511,19 +1379,19 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName CanvasRenderingContext2D.createImageData_1 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.createImageData_1')
   ImageData _createImageData_1(imagedata_OR_sw) native "CanvasRenderingContext2D_createImageData_1_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.createImageData_2 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.createImageData_2')
   ImageData _createImageData_2(imagedata_OR_sw, sh) native "CanvasRenderingContext2D_createImageData_2_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.createLinearGradient */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.createLinearGradient')
   CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native "CanvasRenderingContext2D_createLinearGradient_Callback";
 
-  CanvasPattern createPattern(canvas_OR_image, /*DOMString*/ repetitionType) {
+  CanvasPattern createPattern(canvas_OR_image, String repetitionType) {
     if ((canvas_OR_image is CanvasElement || canvas_OR_image == null) && (repetitionType is String || repetitionType == null)) {
       return _createPattern_1(canvas_OR_image, repetitionType);
     }
@@ -1533,19 +1401,19 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName CanvasRenderingContext2D.createPattern_1 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.createPattern_1')
   CanvasPattern _createPattern_1(canvas_OR_image, repetitionType) native "CanvasRenderingContext2D_createPattern_1_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.createPattern_2 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.createPattern_2')
   CanvasPattern _createPattern_2(canvas_OR_image, repetitionType) native "CanvasRenderingContext2D_createPattern_2_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.createRadialGradient */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.createRadialGradient')
   CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) native "CanvasRenderingContext2D_createRadialGradient_Callback";
 
-  void drawImage(canvas_OR_image_OR_video, /*float*/ sx_OR_x, /*float*/ sy_OR_y, [/*float*/ sw_OR_width, /*float*/ height_OR_sh, /*float*/ dx, /*float*/ dy, /*float*/ dw, /*float*/ dh]) {
+  void drawImage(canvas_OR_image_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) {
     if ((canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && !?sw_OR_width && !?height_OR_sh && !?dx && !?dy && !?dw && !?dh) {
       _drawImage_1(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y);
       return;
@@ -1585,51 +1453,51 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName CanvasRenderingContext2D.drawImage_1 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.drawImage_1')
   void _drawImage_1(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_1_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.drawImage_2 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.drawImage_2')
   void _drawImage_2(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_2_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.drawImage_3 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.drawImage_3')
   void _drawImage_3(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_3_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.drawImage_4 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.drawImage_4')
   void _drawImage_4(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_4_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.drawImage_5 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.drawImage_5')
   void _drawImage_5(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_5_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.drawImage_6 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.drawImage_6')
   void _drawImage_6(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_6_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.drawImage_7 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.drawImage_7')
   void _drawImage_7(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_7_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.drawImage_8 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.drawImage_8')
   void _drawImage_8(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_8_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.drawImage_9 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.drawImage_9')
   void _drawImage_9(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_9_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.fill */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.fill')
   void fill() native "CanvasRenderingContext2D_fill_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.fillRect */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.fillRect')
   void fillRect(num x, num y, num width, num height) native "CanvasRenderingContext2D_fillRect_Callback";
 
-  void fillText(/*DOMString*/ text, /*float*/ x, /*float*/ y, [/*float*/ maxWidth]) {
+  void fillText(String text, num x, num y, [num maxWidth]) {
     if (?maxWidth) {
       _fillText_1(text, x, y, maxWidth);
       return;
@@ -1637,39 +1505,39 @@
     _fillText_2(text, x, y);
   }
 
-
-  /** @domName CanvasRenderingContext2D.fillText_1 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.fillText_1')
   void _fillText_1(text, x, y, maxWidth) native "CanvasRenderingContext2D_fillText_1_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.fillText_2 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.fillText_2')
   void _fillText_2(text, x, y) native "CanvasRenderingContext2D_fillText_2_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.getImageData */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.getImageData')
   ImageData getImageData(num sx, num sy, num sw, num sh) native "CanvasRenderingContext2D_getImageData_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.getLineDash */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.getLineDash')
   List<num> getLineDash() native "CanvasRenderingContext2D_getLineDash_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.isPointInPath */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.isPointInPath')
   bool isPointInPath(num x, num y) native "CanvasRenderingContext2D_isPointInPath_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.lineTo */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.lineTo')
   void lineTo(num x, num y) native "CanvasRenderingContext2D_lineTo_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.measureText */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.measureText')
   TextMetrics measureText(String text) native "CanvasRenderingContext2D_measureText_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.moveTo */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.moveTo')
   void moveTo(num x, num y) native "CanvasRenderingContext2D_moveTo_Callback";
 
-  void putImageData(/*ImageData*/ imagedata, /*float*/ dx, /*float*/ dy, [/*float*/ dirtyX, /*float*/ dirtyY, /*float*/ dirtyWidth, /*float*/ dirtyHeight]) {
+  void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
     if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && !?dirtyX && !?dirtyY && !?dirtyWidth && !?dirtyHeight) {
       _putImageData_1(imagedata, dx, dy);
       return;
@@ -1681,51 +1549,51 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName CanvasRenderingContext2D.putImageData_1 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.putImageData_1')
   void _putImageData_1(imagedata, dx, dy) native "CanvasRenderingContext2D_putImageData_1_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.putImageData_2 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.putImageData_2')
   void _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D_putImageData_2_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.quadraticCurveTo */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.quadraticCurveTo')
   void quadraticCurveTo(num cpx, num cpy, num x, num y) native "CanvasRenderingContext2D_quadraticCurveTo_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.rect */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.rect')
   void rect(num x, num y, num width, num height) native "CanvasRenderingContext2D_rect_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.restore */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.restore')
   void restore() native "CanvasRenderingContext2D_restore_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.rotate */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.rotate')
   void rotate(num angle) native "CanvasRenderingContext2D_rotate_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.save */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.save')
   void save() native "CanvasRenderingContext2D_save_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.scale */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.scale')
   void scale(num sx, num sy) native "CanvasRenderingContext2D_scale_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.setLineDash */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.setLineDash')
   void setLineDash(List<num> dash) native "CanvasRenderingContext2D_setLineDash_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.setTransform */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.setTransform')
   void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) native "CanvasRenderingContext2D_setTransform_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.stroke */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.stroke')
   void stroke() native "CanvasRenderingContext2D_stroke_Callback";
 
-  void strokeRect(/*float*/ x, /*float*/ y, /*float*/ width, /*float*/ height, [/*float*/ lineWidth]) {
+  void strokeRect(num x, num y, num width, num height, [num lineWidth]) {
     if (?lineWidth) {
       _strokeRect_1(x, y, width, height, lineWidth);
       return;
@@ -1733,15 +1601,15 @@
     _strokeRect_2(x, y, width, height);
   }
 
-
-  /** @domName CanvasRenderingContext2D.strokeRect_1 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.strokeRect_1')
   void _strokeRect_1(x, y, width, height, lineWidth) native "CanvasRenderingContext2D_strokeRect_1_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.strokeRect_2 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.strokeRect_2')
   void _strokeRect_2(x, y, width, height) native "CanvasRenderingContext2D_strokeRect_2_Callback";
 
-  void strokeText(/*DOMString*/ text, /*float*/ x, /*float*/ y, [/*float*/ maxWidth]) {
+  void strokeText(String text, num x, num y, [num maxWidth]) {
     if (?maxWidth) {
       _strokeText_1(text, x, y, maxWidth);
       return;
@@ -1749,27 +1617,27 @@
     _strokeText_2(text, x, y);
   }
 
-
-  /** @domName CanvasRenderingContext2D.strokeText_1 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.strokeText_1')
   void _strokeText_1(text, x, y, maxWidth) native "CanvasRenderingContext2D_strokeText_1_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.strokeText_2 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.strokeText_2')
   void _strokeText_2(text, x, y) native "CanvasRenderingContext2D_strokeText_2_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.transform */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.transform')
   void transform(num m11, num m12, num m21, num m22, num dx, num dy) native "CanvasRenderingContext2D_transform_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.translate */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.translate')
   void translate(num tx, num ty) native "CanvasRenderingContext2D_translate_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.webkitGetImageDataHD */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.webkitGetImageDataHD')
   ImageData webkitGetImageDataHD(num sx, num sy, num sw, num sh) native "CanvasRenderingContext2D_webkitGetImageDataHD_Callback";
 
-  void webkitPutImageDataHD(/*ImageData*/ imagedata, /*float*/ dx, /*float*/ dy, [/*float*/ dirtyX, /*float*/ dirtyY, /*float*/ dirtyWidth, /*float*/ dirtyHeight]) {
+  void webkitPutImageDataHD(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
     if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && !?dirtyX && !?dirtyY && !?dirtyWidth && !?dirtyHeight) {
       _webkitPutImageDataHD_1(imagedata, dx, dy);
       return;
@@ -1781,12 +1649,12 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName CanvasRenderingContext2D.webkitPutImageDataHD_1 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.webkitPutImageDataHD_1')
   void _webkitPutImageDataHD_1(imagedata, dx, dy) native "CanvasRenderingContext2D_webkitPutImageDataHD_1_Callback";
 
-
-  /** @domName CanvasRenderingContext2D.webkitPutImageDataHD_2 */
+  @DocsEditable
+  @DomName('CanvasRenderingContext2D.webkitPutImageDataHD_2')
   void _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D_webkitPutImageDataHD_2_Callback";
 
 
@@ -1833,44 +1701,45 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CharacterData
+@DocsEditable
+@DomName('CharacterData')
 class CharacterData extends Node {
   CharacterData.internal() : super.internal();
 
-
-  /** @domName CharacterData.data */
+  @DocsEditable
+  @DomName('CharacterData.data')
   String get data native "CharacterData_data_Getter";
 
-
-  /** @domName CharacterData.data */
+  @DocsEditable
+  @DomName('CharacterData.data')
   void set data(String value) native "CharacterData_data_Setter";
 
-
-  /** @domName CharacterData.length */
+  @DocsEditable
+  @DomName('CharacterData.length')
   int get length native "CharacterData_length_Getter";
 
-
-  /** @domName CharacterData.appendData */
+  @DocsEditable
+  @DomName('CharacterData.appendData')
   void appendData(String data) native "CharacterData_appendData_Callback";
 
-
-  /** @domName CharacterData.deleteData */
+  @DocsEditable
+  @DomName('CharacterData.deleteData')
   void deleteData(int offset, int length) native "CharacterData_deleteData_Callback";
 
-
-  /** @domName CharacterData.insertData */
+  @DocsEditable
+  @DomName('CharacterData.insertData')
   void insertData(int offset, String data) native "CharacterData_insertData_Callback";
 
-
-  /** @domName CharacterData.remove */
+  @DocsEditable
+  @DomName('CharacterData.remove')
   void remove() native "CharacterData_remove_Callback";
 
-
-  /** @domName CharacterData.replaceData */
+  @DocsEditable
+  @DomName('CharacterData.replaceData')
   void replaceData(int offset, int length, String data) native "CharacterData_replaceData_Callback";
 
-
-  /** @domName CharacterData.substringData */
+  @DocsEditable
+  @DomName('CharacterData.substringData')
   String substringData(int offset, int length) native "CharacterData_substringData_Callback";
 
 }
@@ -1881,32 +1750,33 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ClientRect
+@DocsEditable
+@DomName('ClientRect')
 class ClientRect extends NativeFieldWrapperClass1 {
   ClientRect.internal();
 
-
-  /** @domName ClientRect.bottom */
+  @DocsEditable
+  @DomName('ClientRect.bottom')
   num get bottom native "ClientRect_bottom_Getter";
 
-
-  /** @domName ClientRect.height */
+  @DocsEditable
+  @DomName('ClientRect.height')
   num get height native "ClientRect_height_Getter";
 
-
-  /** @domName ClientRect.left */
+  @DocsEditable
+  @DomName('ClientRect.left')
   num get left native "ClientRect_left_Getter";
 
-
-  /** @domName ClientRect.right */
+  @DocsEditable
+  @DomName('ClientRect.right')
   num get right native "ClientRect_right_Getter";
 
-
-  /** @domName ClientRect.top */
+  @DocsEditable
+  @DomName('ClientRect.top')
   num get top native "ClientRect_top_Getter";
 
-
-  /** @domName ClientRect.width */
+  @DocsEditable
+  @DomName('ClientRect.width')
   num get width native "ClientRect_width_Getter";
 
 }
@@ -1917,52 +1787,53 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Clipboard
+@DocsEditable
+@DomName('Clipboard')
 class Clipboard extends NativeFieldWrapperClass1 {
   Clipboard.internal();
 
-
-  /** @domName Clipboard.dropEffect */
+  @DocsEditable
+  @DomName('Clipboard.dropEffect')
   String get dropEffect native "Clipboard_dropEffect_Getter";
 
-
-  /** @domName Clipboard.dropEffect */
+  @DocsEditable
+  @DomName('Clipboard.dropEffect')
   void set dropEffect(String value) native "Clipboard_dropEffect_Setter";
 
-
-  /** @domName Clipboard.effectAllowed */
+  @DocsEditable
+  @DomName('Clipboard.effectAllowed')
   String get effectAllowed native "Clipboard_effectAllowed_Getter";
 
-
-  /** @domName Clipboard.effectAllowed */
+  @DocsEditable
+  @DomName('Clipboard.effectAllowed')
   void set effectAllowed(String value) native "Clipboard_effectAllowed_Setter";
 
-
-  /** @domName Clipboard.files */
+  @DocsEditable
+  @DomName('Clipboard.files')
   List<File> get files native "Clipboard_files_Getter";
 
-
-  /** @domName Clipboard.items */
+  @DocsEditable
+  @DomName('Clipboard.items')
   DataTransferItemList get items native "Clipboard_items_Getter";
 
-
-  /** @domName Clipboard.types */
+  @DocsEditable
+  @DomName('Clipboard.types')
   List get types native "Clipboard_types_Getter";
 
-
-  /** @domName Clipboard.clearData */
+  @DocsEditable
+  @DomName('Clipboard.clearData')
   void clearData([String type]) native "Clipboard_clearData_Callback";
 
-
-  /** @domName Clipboard.getData */
+  @DocsEditable
+  @DomName('Clipboard.getData')
   String getData(String type) native "Clipboard_getData_Callback";
 
-
-  /** @domName Clipboard.setData */
+  @DocsEditable
+  @DomName('Clipboard.setData')
   bool setData(String type, String data) native "Clipboard_setData_Callback";
 
-
-  /** @domName Clipboard.setDragImage */
+  @DocsEditable
+  @DomName('Clipboard.setDragImage')
   void setDragImage(ImageElement image, int x, int y) native "Clipboard_setDragImage_Callback";
 
 }
@@ -1973,20 +1844,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CloseEvent
+@DocsEditable
+@DomName('CloseEvent')
 class CloseEvent extends Event {
   CloseEvent.internal() : super.internal();
 
-
-  /** @domName CloseEvent.code */
+  @DocsEditable
+  @DomName('CloseEvent.code')
   int get code native "CloseEvent_code_Getter";
 
-
-  /** @domName CloseEvent.reason */
+  @DocsEditable
+  @DomName('CloseEvent.reason')
   String get reason native "CloseEvent_reason_Getter";
 
-
-  /** @domName CloseEvent.wasClean */
+  @DocsEditable
+  @DomName('CloseEvent.wasClean')
   bool get wasClean native "CloseEvent_wasClean_Getter";
 
 }
@@ -1997,7 +1869,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Comment
+@DocsEditable
+@DomName('Comment')
 class Comment extends CharacterData {
   Comment.internal() : super.internal();
 
@@ -2009,16 +1882,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CompositionEvent
+@DocsEditable
+@DomName('CompositionEvent')
 class CompositionEvent extends UIEvent {
   CompositionEvent.internal() : super.internal();
 
-
-  /** @domName CompositionEvent.data */
+  @DocsEditable
+  @DomName('CompositionEvent.data')
   String get data native "CompositionEvent_data_Getter";
 
-
-  /** @domName CompositionEvent.initCompositionEvent */
+  @DocsEditable
+  @DomName('CompositionEvent.initCompositionEvent')
   void initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) native "CompositionEvent_initCompositionEvent_Callback";
 
 }
@@ -2029,96 +1903,97 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Console
+@DocsEditable
+@DomName('Console')
 class Console extends NativeFieldWrapperClass1 {
   Console.internal();
 
-
-  /** @domName Console.memory */
+  @DocsEditable
+  @DomName('Console.memory')
   MemoryInfo get memory native "Console_memory_Getter";
 
-
-  /** @domName Console.profiles */
+  @DocsEditable
+  @DomName('Console.profiles')
   List<ScriptProfile> get profiles native "Console_profiles_Getter";
 
-
-  /** @domName Console.assertCondition */
+  @DocsEditable
+  @DomName('Console.assertCondition')
   void assertCondition(bool condition, Object arg) native "Console_assertCondition_Callback";
 
-
-  /** @domName Console.clear */
+  @DocsEditable
+  @DomName('Console.clear')
   void clear(Object arg) native "Console_clear_Callback";
 
-
-  /** @domName Console.count */
+  @DocsEditable
+  @DomName('Console.count')
   void count(Object arg) native "Console_count_Callback";
 
-
-  /** @domName Console.debug */
+  @DocsEditable
+  @DomName('Console.debug')
   void debug(Object arg) native "Console_debug_Callback";
 
-
-  /** @domName Console.dir */
+  @DocsEditable
+  @DomName('Console.dir')
   void dir(Object arg) native "Console_dir_Callback";
 
-
-  /** @domName Console.dirxml */
+  @DocsEditable
+  @DomName('Console.dirxml')
   void dirxml(Object arg) native "Console_dirxml_Callback";
 
-
-  /** @domName Console.error */
+  @DocsEditable
+  @DomName('Console.error')
   void error(Object arg) native "Console_error_Callback";
 
-
-  /** @domName Console.group */
+  @DocsEditable
+  @DomName('Console.group')
   void group(Object arg) native "Console_group_Callback";
 
-
-  /** @domName Console.groupCollapsed */
+  @DocsEditable
+  @DomName('Console.groupCollapsed')
   void groupCollapsed(Object arg) native "Console_groupCollapsed_Callback";
 
-
-  /** @domName Console.groupEnd */
+  @DocsEditable
+  @DomName('Console.groupEnd')
   void groupEnd() native "Console_groupEnd_Callback";
 
-
-  /** @domName Console.info */
+  @DocsEditable
+  @DomName('Console.info')
   void info(Object arg) native "Console_info_Callback";
 
-
-  /** @domName Console.log */
+  @DocsEditable
+  @DomName('Console.log')
   void log(Object arg) native "Console_log_Callback";
 
-
-  /** @domName Console.markTimeline */
+  @DocsEditable
+  @DomName('Console.markTimeline')
   void markTimeline() native "Console_markTimeline_Callback";
 
-
-  /** @domName Console.profile */
+  @DocsEditable
+  @DomName('Console.profile')
   void profile(String title) native "Console_profile_Callback";
 
-
-  /** @domName Console.profileEnd */
+  @DocsEditable
+  @DomName('Console.profileEnd')
   void profileEnd(String title) native "Console_profileEnd_Callback";
 
-
-  /** @domName Console.time */
+  @DocsEditable
+  @DomName('Console.time')
   void time(String title) native "Console_time_Callback";
 
-
-  /** @domName Console.timeEnd */
+  @DocsEditable
+  @DomName('Console.timeEnd')
   void timeEnd(String title) native "Console_timeEnd_Callback";
 
-
-  /** @domName Console.timeStamp */
+  @DocsEditable
+  @DomName('Console.timeStamp')
   void timeStamp() native "Console_timeStamp_Callback";
 
-
-  /** @domName Console.trace */
+  @DocsEditable
+  @DomName('Console.trace')
   void trace(Object arg) native "Console_trace_Callback";
 
-
-  /** @domName Console.warn */
+  @DocsEditable
+  @DomName('Console.warn')
   void warn(Object arg) native "Console_warn_Callback";
 
 }
@@ -2129,36 +2004,37 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLContentElement
+@DocsEditable
+@DomName('HTMLContentElement')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental()
 class ContentElement extends _Element_Merged {
   ContentElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory ContentElement() => document.$dom_createElement("content");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-
-  /** @domName HTMLContentElement.resetStyleInheritance */
+  @DocsEditable
+  @DomName('HTMLContentElement.resetStyleInheritance')
   bool get resetStyleInheritance native "HTMLContentElement_resetStyleInheritance_Getter";
 
-
-  /** @domName HTMLContentElement.resetStyleInheritance */
+  @DocsEditable
+  @DomName('HTMLContentElement.resetStyleInheritance')
   void set resetStyleInheritance(bool value) native "HTMLContentElement_resetStyleInheritance_Setter";
 
-
-  /** @domName HTMLContentElement.select */
+  @DocsEditable
+  @DomName('HTMLContentElement.select')
   String get select native "HTMLContentElement_select_Getter";
 
-
-  /** @domName HTMLContentElement.select */
+  @DocsEditable
+  @DomName('HTMLContentElement.select')
   void set select(String value) native "HTMLContentElement_select_Setter";
 
-
-  /** @domName HTMLContentElement.getDistributedNodes */
+  @DocsEditable
+  @DomName('HTMLContentElement.getDistributedNodes')
   List<Node> getDistributedNodes() native "HTMLContentElement_getDistributedNodes_Callback";
 
 }
@@ -2169,36 +2045,37 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Coordinates
+@DocsEditable
+@DomName('Coordinates')
 class Coordinates extends NativeFieldWrapperClass1 {
   Coordinates.internal();
 
-
-  /** @domName Coordinates.accuracy */
+  @DocsEditable
+  @DomName('Coordinates.accuracy')
   num get accuracy native "Coordinates_accuracy_Getter";
 
-
-  /** @domName Coordinates.altitude */
+  @DocsEditable
+  @DomName('Coordinates.altitude')
   num get altitude native "Coordinates_altitude_Getter";
 
-
-  /** @domName Coordinates.altitudeAccuracy */
+  @DocsEditable
+  @DomName('Coordinates.altitudeAccuracy')
   num get altitudeAccuracy native "Coordinates_altitudeAccuracy_Getter";
 
-
-  /** @domName Coordinates.heading */
+  @DocsEditable
+  @DomName('Coordinates.heading')
   num get heading native "Coordinates_heading_Getter";
 
-
-  /** @domName Coordinates.latitude */
+  @DocsEditable
+  @DomName('Coordinates.latitude')
   num get latitude native "Coordinates_latitude_Getter";
 
-
-  /** @domName Coordinates.longitude */
+  @DocsEditable
+  @DomName('Coordinates.longitude')
   num get longitude native "Coordinates_longitude_Getter";
 
-
-  /** @domName Coordinates.speed */
+  @DocsEditable
+  @DomName('Coordinates.speed')
   num get speed native "Coordinates_speed_Getter";
 
 }
@@ -2209,20 +2086,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Counter
+@DocsEditable
+@DomName('Counter')
 class Counter extends NativeFieldWrapperClass1 {
   Counter.internal();
 
-
-  /** @domName Counter.identifier */
+  @DocsEditable
+  @DomName('Counter.identifier')
   String get identifier native "Counter_identifier_Getter";
 
-
-  /** @domName Counter.listStyle */
+  @DocsEditable
+  @DomName('Counter.listStyle')
   String get listStyle native "Counter_listStyle_Getter";
 
-
-  /** @domName Counter.separator */
+  @DocsEditable
+  @DomName('Counter.separator')
   String get separator native "Counter_separator_Getter";
 
 }
@@ -2233,13 +2111,14 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Crypto
+@DocsEditable
+@DomName('Crypto')
 class Crypto extends NativeFieldWrapperClass1 {
   Crypto.internal();
 
-
-  /** @domName Crypto.getRandomValues */
-  void getRandomValues(ArrayBufferView array) native "Crypto_getRandomValues_Callback";
+  @DocsEditable
+  @DomName('Crypto.getRandomValues')
+  ArrayBufferView getRandomValues(ArrayBufferView array) native "Crypto_getRandomValues_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2249,16 +2128,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CSSCharsetRule
+@DocsEditable
+@DomName('CSSCharsetRule')
 class CssCharsetRule extends CssRule {
   CssCharsetRule.internal() : super.internal();
 
-
-  /** @domName CSSCharsetRule.encoding */
+  @DocsEditable
+  @DomName('CSSCharsetRule.encoding')
   String get encoding native "CSSCharsetRule_encoding_Getter";
 
-
-  /** @domName CSSCharsetRule.encoding */
+  @DocsEditable
+  @DomName('CSSCharsetRule.encoding')
   void set encoding(String value) native "CSSCharsetRule_encoding_Setter";
 
 }
@@ -2269,12 +2149,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CSSFontFaceRule
+@DocsEditable
+@DomName('CSSFontFaceRule')
 class CssFontFaceRule extends CssRule {
   CssFontFaceRule.internal() : super.internal();
 
-
-  /** @domName CSSFontFaceRule.style */
+  @DocsEditable
+  @DomName('CSSFontFaceRule.style')
   CssStyleDeclaration get style native "CSSFontFaceRule_style_Getter";
 
 }
@@ -2285,20 +2166,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CSSImportRule
+@DocsEditable
+@DomName('CSSImportRule')
 class CssImportRule extends CssRule {
   CssImportRule.internal() : super.internal();
 
-
-  /** @domName CSSImportRule.href */
+  @DocsEditable
+  @DomName('CSSImportRule.href')
   String get href native "CSSImportRule_href_Getter";
 
-
-  /** @domName CSSImportRule.media */
+  @DocsEditable
+  @DomName('CSSImportRule.media')
   MediaList get media native "CSSImportRule_media_Getter";
 
-
-  /** @domName CSSImportRule.styleSheet */
+  @DocsEditable
+  @DomName('CSSImportRule.styleSheet')
   CssStyleSheet get styleSheet native "CSSImportRule_styleSheet_Getter";
 
 }
@@ -2309,20 +2191,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebKitCSSKeyframeRule
+@DocsEditable
+@DomName('WebKitCSSKeyframeRule')
 class CssKeyframeRule extends CssRule {
   CssKeyframeRule.internal() : super.internal();
 
-
-  /** @domName WebKitCSSKeyframeRule.keyText */
+  @DocsEditable
+  @DomName('WebKitCSSKeyframeRule.keyText')
   String get keyText native "WebKitCSSKeyframeRule_keyText_Getter";
 
-
-  /** @domName WebKitCSSKeyframeRule.keyText */
+  @DocsEditable
+  @DomName('WebKitCSSKeyframeRule.keyText')
   void set keyText(String value) native "WebKitCSSKeyframeRule_keyText_Setter";
 
-
-  /** @domName WebKitCSSKeyframeRule.style */
+  @DocsEditable
+  @DomName('WebKitCSSKeyframeRule.style')
   CssStyleDeclaration get style native "WebKitCSSKeyframeRule_style_Getter";
 
 }
@@ -2333,32 +2216,33 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebKitCSSKeyframesRule
+@DocsEditable
+@DomName('WebKitCSSKeyframesRule')
 class CssKeyframesRule extends CssRule {
   CssKeyframesRule.internal() : super.internal();
 
-
-  /** @domName WebKitCSSKeyframesRule.cssRules */
+  @DocsEditable
+  @DomName('WebKitCSSKeyframesRule.cssRules')
   List<CssRule> get cssRules native "WebKitCSSKeyframesRule_cssRules_Getter";
 
-
-  /** @domName WebKitCSSKeyframesRule.name */
+  @DocsEditable
+  @DomName('WebKitCSSKeyframesRule.name')
   String get name native "WebKitCSSKeyframesRule_name_Getter";
 
-
-  /** @domName WebKitCSSKeyframesRule.name */
+  @DocsEditable
+  @DomName('WebKitCSSKeyframesRule.name')
   void set name(String value) native "WebKitCSSKeyframesRule_name_Setter";
 
-
-  /** @domName WebKitCSSKeyframesRule.deleteRule */
+  @DocsEditable
+  @DomName('WebKitCSSKeyframesRule.deleteRule')
   void deleteRule(String key) native "WebKitCSSKeyframesRule_deleteRule_Callback";
 
-
-  /** @domName WebKitCSSKeyframesRule.findRule */
+  @DocsEditable
+  @DomName('WebKitCSSKeyframesRule.findRule')
   CssKeyframeRule findRule(String key) native "WebKitCSSKeyframesRule_findRule_Callback";
 
-
-  /** @domName WebKitCSSKeyframesRule.insertRule */
+  @DocsEditable
+  @DomName('WebKitCSSKeyframesRule.insertRule')
   void insertRule(String rule) native "WebKitCSSKeyframesRule_insertRule_Callback";
 
 }
@@ -2369,11 +2253,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebKitCSSMatrix
+@DocsEditable
+@DomName('WebKitCSSMatrix')
 class CssMatrix extends NativeFieldWrapperClass1 {
   CssMatrix.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory CssMatrix([String cssValue]) {
     if (!?cssValue) {
       return CssMatrix._create();
@@ -2382,220 +2267,220 @@
   }
   static CssMatrix _create([String cssValue]) native "WebKitCSSMatrix_constructor_Callback";
 
-
-  /** @domName WebKitCSSMatrix.a */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.a')
   num get a native "WebKitCSSMatrix_a_Getter";
 
-
-  /** @domName WebKitCSSMatrix.a */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.a')
   void set a(num value) native "WebKitCSSMatrix_a_Setter";
 
-
-  /** @domName WebKitCSSMatrix.b */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.b')
   num get b native "WebKitCSSMatrix_b_Getter";
 
-
-  /** @domName WebKitCSSMatrix.b */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.b')
   void set b(num value) native "WebKitCSSMatrix_b_Setter";
 
-
-  /** @domName WebKitCSSMatrix.c */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.c')
   num get c native "WebKitCSSMatrix_c_Getter";
 
-
-  /** @domName WebKitCSSMatrix.c */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.c')
   void set c(num value) native "WebKitCSSMatrix_c_Setter";
 
-
-  /** @domName WebKitCSSMatrix.d */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.d')
   num get d native "WebKitCSSMatrix_d_Getter";
 
-
-  /** @domName WebKitCSSMatrix.d */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.d')
   void set d(num value) native "WebKitCSSMatrix_d_Setter";
 
-
-  /** @domName WebKitCSSMatrix.e */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.e')
   num get e native "WebKitCSSMatrix_e_Getter";
 
-
-  /** @domName WebKitCSSMatrix.e */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.e')
   void set e(num value) native "WebKitCSSMatrix_e_Setter";
 
-
-  /** @domName WebKitCSSMatrix.f */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.f')
   num get f native "WebKitCSSMatrix_f_Getter";
 
-
-  /** @domName WebKitCSSMatrix.f */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.f')
   void set f(num value) native "WebKitCSSMatrix_f_Setter";
 
-
-  /** @domName WebKitCSSMatrix.m11 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m11')
   num get m11 native "WebKitCSSMatrix_m11_Getter";
 
-
-  /** @domName WebKitCSSMatrix.m11 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m11')
   void set m11(num value) native "WebKitCSSMatrix_m11_Setter";
 
-
-  /** @domName WebKitCSSMatrix.m12 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m12')
   num get m12 native "WebKitCSSMatrix_m12_Getter";
 
-
-  /** @domName WebKitCSSMatrix.m12 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m12')
   void set m12(num value) native "WebKitCSSMatrix_m12_Setter";
 
-
-  /** @domName WebKitCSSMatrix.m13 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m13')
   num get m13 native "WebKitCSSMatrix_m13_Getter";
 
-
-  /** @domName WebKitCSSMatrix.m13 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m13')
   void set m13(num value) native "WebKitCSSMatrix_m13_Setter";
 
-
-  /** @domName WebKitCSSMatrix.m14 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m14')
   num get m14 native "WebKitCSSMatrix_m14_Getter";
 
-
-  /** @domName WebKitCSSMatrix.m14 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m14')
   void set m14(num value) native "WebKitCSSMatrix_m14_Setter";
 
-
-  /** @domName WebKitCSSMatrix.m21 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m21')
   num get m21 native "WebKitCSSMatrix_m21_Getter";
 
-
-  /** @domName WebKitCSSMatrix.m21 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m21')
   void set m21(num value) native "WebKitCSSMatrix_m21_Setter";
 
-
-  /** @domName WebKitCSSMatrix.m22 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m22')
   num get m22 native "WebKitCSSMatrix_m22_Getter";
 
-
-  /** @domName WebKitCSSMatrix.m22 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m22')
   void set m22(num value) native "WebKitCSSMatrix_m22_Setter";
 
-
-  /** @domName WebKitCSSMatrix.m23 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m23')
   num get m23 native "WebKitCSSMatrix_m23_Getter";
 
-
-  /** @domName WebKitCSSMatrix.m23 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m23')
   void set m23(num value) native "WebKitCSSMatrix_m23_Setter";
 
-
-  /** @domName WebKitCSSMatrix.m24 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m24')
   num get m24 native "WebKitCSSMatrix_m24_Getter";
 
-
-  /** @domName WebKitCSSMatrix.m24 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m24')
   void set m24(num value) native "WebKitCSSMatrix_m24_Setter";
 
-
-  /** @domName WebKitCSSMatrix.m31 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m31')
   num get m31 native "WebKitCSSMatrix_m31_Getter";
 
-
-  /** @domName WebKitCSSMatrix.m31 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m31')
   void set m31(num value) native "WebKitCSSMatrix_m31_Setter";
 
-
-  /** @domName WebKitCSSMatrix.m32 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m32')
   num get m32 native "WebKitCSSMatrix_m32_Getter";
 
-
-  /** @domName WebKitCSSMatrix.m32 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m32')
   void set m32(num value) native "WebKitCSSMatrix_m32_Setter";
 
-
-  /** @domName WebKitCSSMatrix.m33 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m33')
   num get m33 native "WebKitCSSMatrix_m33_Getter";
 
-
-  /** @domName WebKitCSSMatrix.m33 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m33')
   void set m33(num value) native "WebKitCSSMatrix_m33_Setter";
 
-
-  /** @domName WebKitCSSMatrix.m34 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m34')
   num get m34 native "WebKitCSSMatrix_m34_Getter";
 
-
-  /** @domName WebKitCSSMatrix.m34 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m34')
   void set m34(num value) native "WebKitCSSMatrix_m34_Setter";
 
-
-  /** @domName WebKitCSSMatrix.m41 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m41')
   num get m41 native "WebKitCSSMatrix_m41_Getter";
 
-
-  /** @domName WebKitCSSMatrix.m41 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m41')
   void set m41(num value) native "WebKitCSSMatrix_m41_Setter";
 
-
-  /** @domName WebKitCSSMatrix.m42 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m42')
   num get m42 native "WebKitCSSMatrix_m42_Getter";
 
-
-  /** @domName WebKitCSSMatrix.m42 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m42')
   void set m42(num value) native "WebKitCSSMatrix_m42_Setter";
 
-
-  /** @domName WebKitCSSMatrix.m43 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m43')
   num get m43 native "WebKitCSSMatrix_m43_Getter";
 
-
-  /** @domName WebKitCSSMatrix.m43 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m43')
   void set m43(num value) native "WebKitCSSMatrix_m43_Setter";
 
-
-  /** @domName WebKitCSSMatrix.m44 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m44')
   num get m44 native "WebKitCSSMatrix_m44_Getter";
 
-
-  /** @domName WebKitCSSMatrix.m44 */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.m44')
   void set m44(num value) native "WebKitCSSMatrix_m44_Setter";
 
-
-  /** @domName WebKitCSSMatrix.inverse */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.inverse')
   CssMatrix inverse() native "WebKitCSSMatrix_inverse_Callback";
 
-
-  /** @domName WebKitCSSMatrix.multiply */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.multiply')
   CssMatrix multiply(CssMatrix secondMatrix) native "WebKitCSSMatrix_multiply_Callback";
 
-
-  /** @domName WebKitCSSMatrix.rotate */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.rotate')
   CssMatrix rotate(num rotX, num rotY, num rotZ) native "WebKitCSSMatrix_rotate_Callback";
 
-
-  /** @domName WebKitCSSMatrix.rotateAxisAngle */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.rotateAxisAngle')
   CssMatrix rotateAxisAngle(num x, num y, num z, num angle) native "WebKitCSSMatrix_rotateAxisAngle_Callback";
 
-
-  /** @domName WebKitCSSMatrix.scale */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.scale')
   CssMatrix scale(num scaleX, num scaleY, num scaleZ) native "WebKitCSSMatrix_scale_Callback";
 
-
-  /** @domName WebKitCSSMatrix.setMatrixValue */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.setMatrixValue')
   void setMatrixValue(String string) native "WebKitCSSMatrix_setMatrixValue_Callback";
 
-
-  /** @domName WebKitCSSMatrix.skewX */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.skewX')
   CssMatrix skewX(num angle) native "WebKitCSSMatrix_skewX_Callback";
 
-
-  /** @domName WebKitCSSMatrix.skewY */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.skewY')
   CssMatrix skewY(num angle) native "WebKitCSSMatrix_skewY_Callback";
 
-
-  /** @domName WebKitCSSMatrix.toString */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.toString')
   String toString() native "WebKitCSSMatrix_toString_Callback";
 
-
-  /** @domName WebKitCSSMatrix.translate */
+  @DocsEditable
+  @DomName('WebKitCSSMatrix.translate')
   CssMatrix translate(num x, num y, num z) native "WebKitCSSMatrix_translate_Callback";
 
 }
@@ -2606,24 +2491,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CSSMediaRule
+@DocsEditable
+@DomName('CSSMediaRule')
 class CssMediaRule extends CssRule {
   CssMediaRule.internal() : super.internal();
 
-
-  /** @domName CSSMediaRule.cssRules */
+  @DocsEditable
+  @DomName('CSSMediaRule.cssRules')
   List<CssRule> get cssRules native "CSSMediaRule_cssRules_Getter";
 
-
-  /** @domName CSSMediaRule.media */
+  @DocsEditable
+  @DomName('CSSMediaRule.media')
   MediaList get media native "CSSMediaRule_media_Getter";
 
-
-  /** @domName CSSMediaRule.deleteRule */
+  @DocsEditable
+  @DomName('CSSMediaRule.deleteRule')
   void deleteRule(int index) native "CSSMediaRule_deleteRule_Callback";
 
-
-  /** @domName CSSMediaRule.insertRule */
+  @DocsEditable
+  @DomName('CSSMediaRule.insertRule')
   int insertRule(String rule, int index) native "CSSMediaRule_insertRule_Callback";
 
 }
@@ -2634,20 +2520,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CSSPageRule
+@DocsEditable
+@DomName('CSSPageRule')
 class CssPageRule extends CssRule {
   CssPageRule.internal() : super.internal();
 
-
-  /** @domName CSSPageRule.selectorText */
+  @DocsEditable
+  @DomName('CSSPageRule.selectorText')
   String get selectorText native "CSSPageRule_selectorText_Getter";
 
-
-  /** @domName CSSPageRule.selectorText */
+  @DocsEditable
+  @DomName('CSSPageRule.selectorText')
   void set selectorText(String value) native "CSSPageRule_selectorText_Setter";
 
-
-  /** @domName CSSPageRule.style */
+  @DocsEditable
+  @DomName('CSSPageRule.style')
   CssStyleDeclaration get style native "CSSPageRule_style_Getter";
 
 }
@@ -2658,7 +2545,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CSSPrimitiveValue
+@DocsEditable
+@DomName('CSSPrimitiveValue')
 class CssPrimitiveValue extends CssValue {
   CssPrimitiveValue.internal() : super.internal();
 
@@ -2720,36 +2608,36 @@
 
   static const int CSS_VW = 26;
 
-
-  /** @domName CSSPrimitiveValue.primitiveType */
+  @DocsEditable
+  @DomName('CSSPrimitiveValue.primitiveType')
   int get primitiveType native "CSSPrimitiveValue_primitiveType_Getter";
 
-
-  /** @domName CSSPrimitiveValue.getCounterValue */
+  @DocsEditable
+  @DomName('CSSPrimitiveValue.getCounterValue')
   Counter getCounterValue() native "CSSPrimitiveValue_getCounterValue_Callback";
 
-
-  /** @domName CSSPrimitiveValue.getFloatValue */
+  @DocsEditable
+  @DomName('CSSPrimitiveValue.getFloatValue')
   num getFloatValue(int unitType) native "CSSPrimitiveValue_getFloatValue_Callback";
 
-
-  /** @domName CSSPrimitiveValue.getRGBColorValue */
+  @DocsEditable
+  @DomName('CSSPrimitiveValue.getRGBColorValue')
   RgbColor getRgbColorValue() native "CSSPrimitiveValue_getRGBColorValue_Callback";
 
-
-  /** @domName CSSPrimitiveValue.getRectValue */
+  @DocsEditable
+  @DomName('CSSPrimitiveValue.getRectValue')
   Rect getRectValue() native "CSSPrimitiveValue_getRectValue_Callback";
 
-
-  /** @domName CSSPrimitiveValue.getStringValue */
+  @DocsEditable
+  @DomName('CSSPrimitiveValue.getStringValue')
   String getStringValue() native "CSSPrimitiveValue_getStringValue_Callback";
 
-
-  /** @domName CSSPrimitiveValue.setFloatValue */
+  @DocsEditable
+  @DomName('CSSPrimitiveValue.setFloatValue')
   void setFloatValue(int unitType, num floatValue) native "CSSPrimitiveValue_setFloatValue_Callback";
 
-
-  /** @domName CSSPrimitiveValue.setStringValue */
+  @DocsEditable
+  @DomName('CSSPrimitiveValue.setStringValue')
   void setStringValue(int stringType, String stringValue) native "CSSPrimitiveValue_setStringValue_Callback";
 
 }
@@ -2760,7 +2648,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CSSRule
+@DocsEditable
+@DomName('CSSRule')
 class CssRule extends NativeFieldWrapperClass1 {
   CssRule.internal();
 
@@ -2782,24 +2671,24 @@
 
   static const int WEBKIT_KEYFRAME_RULE = 8;
 
-
-  /** @domName CSSRule.cssText */
+  @DocsEditable
+  @DomName('CSSRule.cssText')
   String get cssText native "CSSRule_cssText_Getter";
 
-
-  /** @domName CSSRule.cssText */
+  @DocsEditable
+  @DomName('CSSRule.cssText')
   void set cssText(String value) native "CSSRule_cssText_Setter";
 
-
-  /** @domName CSSRule.parentRule */
+  @DocsEditable
+  @DomName('CSSRule.parentRule')
   CssRule get parentRule native "CSSRule_parentRule_Getter";
 
-
-  /** @domName CSSRule.parentStyleSheet */
+  @DocsEditable
+  @DomName('CSSRule.parentStyleSheet')
   CssStyleSheet get parentStyleSheet native "CSSRule_parentStyleSheet_Getter";
 
-
-  /** @domName CSSRule.type */
+  @DocsEditable
+  @DomName('CSSRule.type')
   int get type native "CSSRule_type_Getter";
 
 }
@@ -2825,7 +2714,8 @@
   return _cachedBrowserPrefix;
 }
 
-/// @domName CSSStyleDeclaration
+@DocsEditable
+@DomName('CSSStyleDeclaration')
 class CssStyleDeclaration extends NativeFieldWrapperClass1 {
   factory CssStyleDeclaration() => _CssStyleDeclarationFactoryProvider.createCssStyleDeclaration();
   factory CssStyleDeclaration.css(String css) =>
@@ -2833,52 +2723,52 @@
 
   CssStyleDeclaration.internal();
 
-
-  /** @domName CSSStyleDeclaration.cssText */
+  @DocsEditable
+  @DomName('CSSStyleDeclaration.cssText')
   String get cssText native "CSSStyleDeclaration_cssText_Getter";
 
-
-  /** @domName CSSStyleDeclaration.cssText */
+  @DocsEditable
+  @DomName('CSSStyleDeclaration.cssText')
   void set cssText(String value) native "CSSStyleDeclaration_cssText_Setter";
 
-
-  /** @domName CSSStyleDeclaration.length */
+  @DocsEditable
+  @DomName('CSSStyleDeclaration.length')
   int get length native "CSSStyleDeclaration_length_Getter";
 
-
-  /** @domName CSSStyleDeclaration.parentRule */
+  @DocsEditable
+  @DomName('CSSStyleDeclaration.parentRule')
   CssRule get parentRule native "CSSStyleDeclaration_parentRule_Getter";
 
-
-  /** @domName CSSStyleDeclaration.getPropertyCSSValue */
+  @DocsEditable
+  @DomName('CSSStyleDeclaration.getPropertyCSSValue')
   CssValue getPropertyCssValue(String propertyName) native "CSSStyleDeclaration_getPropertyCSSValue_Callback";
 
-
-  /** @domName CSSStyleDeclaration.getPropertyPriority */
+  @DocsEditable
+  @DomName('CSSStyleDeclaration.getPropertyPriority')
   String getPropertyPriority(String propertyName) native "CSSStyleDeclaration_getPropertyPriority_Callback";
 
-
-  /** @domName CSSStyleDeclaration.getPropertyShorthand */
+  @DocsEditable
+  @DomName('CSSStyleDeclaration.getPropertyShorthand')
   String getPropertyShorthand(String propertyName) native "CSSStyleDeclaration_getPropertyShorthand_Callback";
 
-
-  /** @domName CSSStyleDeclaration._getPropertyValue */
+  @DocsEditable
+  @DomName('CSSStyleDeclaration._getPropertyValue')
   String _getPropertyValue(String propertyName) native "CSSStyleDeclaration__getPropertyValue_Callback";
 
-
-  /** @domName CSSStyleDeclaration.isPropertyImplicit */
+  @DocsEditable
+  @DomName('CSSStyleDeclaration.isPropertyImplicit')
   bool isPropertyImplicit(String propertyName) native "CSSStyleDeclaration_isPropertyImplicit_Callback";
 
-
-  /** @domName CSSStyleDeclaration.item */
+  @DocsEditable
+  @DomName('CSSStyleDeclaration.item')
   String item(int index) native "CSSStyleDeclaration_item_Callback";
 
-
-  /** @domName CSSStyleDeclaration.removeProperty */
+  @DocsEditable
+  @DomName('CSSStyleDeclaration.removeProperty')
   String removeProperty(String propertyName) native "CSSStyleDeclaration_removeProperty_Callback";
 
-
-  /** @domName CSSStyleDeclaration.setProperty */
+  @DocsEditable
+  @DomName('CSSStyleDeclaration.setProperty')
   void setProperty(String propertyName, String value, [String priority]) native "CSSStyleDeclaration_setProperty_Callback";
 
 
@@ -6046,20 +5936,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CSSStyleRule
+@DocsEditable
+@DomName('CSSStyleRule')
 class CssStyleRule extends CssRule {
   CssStyleRule.internal() : super.internal();
 
-
-  /** @domName CSSStyleRule.selectorText */
+  @DocsEditable
+  @DomName('CSSStyleRule.selectorText')
   String get selectorText native "CSSStyleRule_selectorText_Getter";
 
-
-  /** @domName CSSStyleRule.selectorText */
+  @DocsEditable
+  @DomName('CSSStyleRule.selectorText')
   void set selectorText(String value) native "CSSStyleRule_selectorText_Setter";
 
-
-  /** @domName CSSStyleRule.style */
+  @DocsEditable
+  @DomName('CSSStyleRule.style')
   CssStyleDeclaration get style native "CSSStyleRule_style_Getter";
 
 }
@@ -6070,47 +5961,48 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CSSStyleSheet
+@DocsEditable
+@DomName('CSSStyleSheet')
 class CssStyleSheet extends StyleSheet {
   CssStyleSheet.internal() : super.internal();
 
-
-  /** @domName CSSStyleSheet.cssRules */
+  @DocsEditable
+  @DomName('CSSStyleSheet.cssRules')
   List<CssRule> get cssRules native "CSSStyleSheet_cssRules_Getter";
 
-
-  /** @domName CSSStyleSheet.ownerRule */
+  @DocsEditable
+  @DomName('CSSStyleSheet.ownerRule')
   CssRule get ownerRule native "CSSStyleSheet_ownerRule_Getter";
 
-
-  /** @domName CSSStyleSheet.rules */
+  @DocsEditable
+  @DomName('CSSStyleSheet.rules')
   List<CssRule> get rules native "CSSStyleSheet_rules_Getter";
 
-  int addRule(/*DOMString*/ selector, /*DOMString*/ style, [/*unsigned long*/ index]) {
+  int addRule(String selector, String style, [int index]) {
     if (?index) {
       return _addRule_1(selector, style, index);
     }
     return _addRule_2(selector, style);
   }
 
-
-  /** @domName CSSStyleSheet.addRule_1 */
+  @DocsEditable
+  @DomName('CSSStyleSheet.addRule_1')
   int _addRule_1(selector, style, index) native "CSSStyleSheet_addRule_1_Callback";
 
-
-  /** @domName CSSStyleSheet.addRule_2 */
+  @DocsEditable
+  @DomName('CSSStyleSheet.addRule_2')
   int _addRule_2(selector, style) native "CSSStyleSheet_addRule_2_Callback";
 
-
-  /** @domName CSSStyleSheet.deleteRule */
+  @DocsEditable
+  @DomName('CSSStyleSheet.deleteRule')
   void deleteRule(int index) native "CSSStyleSheet_deleteRule_Callback";
 
-
-  /** @domName CSSStyleSheet.insertRule */
+  @DocsEditable
+  @DomName('CSSStyleSheet.insertRule')
   int insertRule(String rule, int index) native "CSSStyleSheet_insertRule_Callback";
 
-
-  /** @domName CSSStyleSheet.removeRule */
+  @DocsEditable
+  @DomName('CSSStyleSheet.removeRule')
   void removeRule(int index) native "CSSStyleSheet_removeRule_Callback";
 
 }
@@ -6121,7 +6013,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebKitCSSTransformValue
+@DocsEditable
+@DomName('WebKitCSSTransformValue')
 class CssTransformValue extends _CssValueList {
   CssTransformValue.internal() : super.internal();
 
@@ -6167,8 +6060,8 @@
 
   static const int CSS_TRANSLATEZ = 12;
 
-
-  /** @domName WebKitCSSTransformValue.operationType */
+  @DocsEditable
+  @DomName('WebKitCSSTransformValue.operationType')
   int get operationType native "WebKitCSSTransformValue_operationType_Getter";
 
 }
@@ -6179,7 +6072,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CSSUnknownRule
+@DocsEditable
+@DomName('CSSUnknownRule')
 class CssUnknownRule extends CssRule {
   CssUnknownRule.internal() : super.internal();
 
@@ -6191,7 +6085,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CSSValue
+@DocsEditable
+@DomName('CSSValue')
 class CssValue extends NativeFieldWrapperClass1 {
   CssValue.internal();
 
@@ -6203,16 +6098,16 @@
 
   static const int CSS_VALUE_LIST = 2;
 
-
-  /** @domName CSSValue.cssText */
+  @DocsEditable
+  @DomName('CSSValue.cssText')
   String get cssText native "CSSValue_cssText_Getter";
 
-
-  /** @domName CSSValue.cssText */
+  @DocsEditable
+  @DomName('CSSValue.cssText')
   void set cssText(String value) native "CSSValue_cssText_Setter";
 
-
-  /** @domName CSSValue.cssValueType */
+  @DocsEditable
+  @DomName('CSSValue.cssValueType')
   int get cssValueType native "CSSValue_cssValueType_Getter";
 
 }
@@ -6223,19 +6118,20 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CustomEvent
+@DocsEditable
+@DomName('CustomEvent')
 class CustomEvent extends Event {
   factory CustomEvent(String type, [bool canBubble = true, bool cancelable = true,
       Object detail]) => _CustomEventFactoryProvider.createCustomEvent(
       type, canBubble, cancelable, detail);
   CustomEvent.internal() : super.internal();
 
-
-  /** @domName CustomEvent.detail */
+  @DocsEditable
+  @DomName('CustomEvent.detail')
   Object get detail native "CustomEvent_detail_Getter";
 
-
-  /** @domName CustomEvent.initCustomEvent */
+  @DocsEditable
+  @DomName('CustomEvent.initCustomEvent')
   void $dom_initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) native "CustomEvent_initCustomEvent_Callback";
 
 }
@@ -6246,11 +6142,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLDListElement
+@DocsEditable
+@DomName('HTMLDListElement')
 class DListElement extends _Element_Merged {
   DListElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory DListElement() => document.$dom_createElement("dl");
 
 }
@@ -6261,7 +6158,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLDataListElement
+@DocsEditable
+@DomName('HTMLDataListElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -6269,14 +6167,14 @@
 class DataListElement extends _Element_Merged {
   DataListElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory DataListElement() => document.$dom_createElement("datalist");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-
-  /** @domName HTMLDataListElement.options */
+  @DocsEditable
+  @DomName('HTMLDataListElement.options')
   HtmlCollection get options native "HTMLDataListElement_options_Getter";
 
 }
@@ -6287,28 +6185,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DataTransferItem
+@DocsEditable
+@DomName('DataTransferItem')
 class DataTransferItem extends NativeFieldWrapperClass1 {
   DataTransferItem.internal();
 
-
-  /** @domName DataTransferItem.kind */
+  @DocsEditable
+  @DomName('DataTransferItem.kind')
   String get kind native "DataTransferItem_kind_Getter";
 
-
-  /** @domName DataTransferItem.type */
+  @DocsEditable
+  @DomName('DataTransferItem.type')
   String get type native "DataTransferItem_type_Getter";
 
-
-  /** @domName DataTransferItem.getAsFile */
+  @DocsEditable
+  @DomName('DataTransferItem.getAsFile')
   Blob getAsFile() native "DataTransferItem_getAsFile_Callback";
 
-
-  /** @domName DataTransferItem.getAsString */
+  @DocsEditable
+  @DomName('DataTransferItem.getAsString')
   void getAsString([StringCallback callback]) native "DataTransferItem_getAsString_Callback";
 
-
-  /** @domName DataTransferItem.webkitGetAsEntry */
+  @DocsEditable
+  @DomName('DataTransferItem.webkitGetAsEntry')
   Entry webkitGetAsEntry() native "DataTransferItem_webkitGetAsEntry_Callback";
 
 }
@@ -6319,15 +6218,16 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DataTransferItemList
+@DocsEditable
+@DomName('DataTransferItemList')
 class DataTransferItemList extends NativeFieldWrapperClass1 {
   DataTransferItemList.internal();
 
-
-  /** @domName DataTransferItemList.length */
+  @DocsEditable
+  @DomName('DataTransferItemList.length')
   int get length native "DataTransferItemList_length_Getter";
 
-  void add(data_OR_file, [/*DOMString*/ type]) {
+  void add(data_OR_file, [String type]) {
     if ((data_OR_file is File || data_OR_file == null) && !?type) {
       _add_1(data_OR_file);
       return;
@@ -6339,20 +6239,20 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName DataTransferItemList.add_1 */
+  @DocsEditable
+  @DomName('DataTransferItemList.add_1')
   void _add_1(data_OR_file) native "DataTransferItemList_add_1_Callback";
 
-
-  /** @domName DataTransferItemList.add_2 */
+  @DocsEditable
+  @DomName('DataTransferItemList.add_2')
   void _add_2(data_OR_file, type) native "DataTransferItemList_add_2_Callback";
 
-
-  /** @domName DataTransferItemList.clear */
+  @DocsEditable
+  @DomName('DataTransferItemList.clear')
   void clear() native "DataTransferItemList_clear_Callback";
 
-
-  /** @domName DataTransferItemList.item */
+  @DocsEditable
+  @DomName('DataTransferItemList.item')
   DataTransferItem item(int index) native "DataTransferItemList_item_Callback";
 
 }
@@ -6363,11 +6263,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DataView
+@DocsEditable
+@DomName('DataView')
 class DataView extends ArrayBufferView {
   DataView.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory DataView(ArrayBuffer buffer, [int byteOffset, int byteLength]) {
     if (!?byteOffset) {
       return DataView._create(buffer);
@@ -6379,105 +6280,105 @@
   }
   static DataView _create(ArrayBuffer buffer, [int byteOffset, int byteLength]) native "DataView_constructor_Callback";
 
-  num getFloat32(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
+  num getFloat32(int byteOffset, {bool littleEndian}) {
     if (?littleEndian) {
       return _getFloat32_1(byteOffset, littleEndian);
     }
     return _getFloat32_2(byteOffset);
   }
 
-
-  /** @domName DataView.getFloat32_1 */
+  @DocsEditable
+  @DomName('DataView.getFloat32_1')
   num _getFloat32_1(byteOffset, littleEndian) native "DataView_getFloat32_1_Callback";
 
-
-  /** @domName DataView.getFloat32_2 */
+  @DocsEditable
+  @DomName('DataView.getFloat32_2')
   num _getFloat32_2(byteOffset) native "DataView_getFloat32_2_Callback";
 
-  num getFloat64(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
+  num getFloat64(int byteOffset, {bool littleEndian}) {
     if (?littleEndian) {
       return _getFloat64_1(byteOffset, littleEndian);
     }
     return _getFloat64_2(byteOffset);
   }
 
-
-  /** @domName DataView.getFloat64_1 */
+  @DocsEditable
+  @DomName('DataView.getFloat64_1')
   num _getFloat64_1(byteOffset, littleEndian) native "DataView_getFloat64_1_Callback";
 
-
-  /** @domName DataView.getFloat64_2 */
+  @DocsEditable
+  @DomName('DataView.getFloat64_2')
   num _getFloat64_2(byteOffset) native "DataView_getFloat64_2_Callback";
 
-  int getInt16(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
+  int getInt16(int byteOffset, {bool littleEndian}) {
     if (?littleEndian) {
       return _getInt16_1(byteOffset, littleEndian);
     }
     return _getInt16_2(byteOffset);
   }
 
-
-  /** @domName DataView.getInt16_1 */
+  @DocsEditable
+  @DomName('DataView.getInt16_1')
   int _getInt16_1(byteOffset, littleEndian) native "DataView_getInt16_1_Callback";
 
-
-  /** @domName DataView.getInt16_2 */
+  @DocsEditable
+  @DomName('DataView.getInt16_2')
   int _getInt16_2(byteOffset) native "DataView_getInt16_2_Callback";
 
-  int getInt32(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
+  int getInt32(int byteOffset, {bool littleEndian}) {
     if (?littleEndian) {
       return _getInt32_1(byteOffset, littleEndian);
     }
     return _getInt32_2(byteOffset);
   }
 
-
-  /** @domName DataView.getInt32_1 */
+  @DocsEditable
+  @DomName('DataView.getInt32_1')
   int _getInt32_1(byteOffset, littleEndian) native "DataView_getInt32_1_Callback";
 
-
-  /** @domName DataView.getInt32_2 */
+  @DocsEditable
+  @DomName('DataView.getInt32_2')
   int _getInt32_2(byteOffset) native "DataView_getInt32_2_Callback";
 
-
-  /** @domName DataView.getInt8 */
+  @DocsEditable
+  @DomName('DataView.getInt8')
   int getInt8(int byteOffset) native "DataView_getInt8_Callback";
 
-  int getUint16(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
+  int getUint16(int byteOffset, {bool littleEndian}) {
     if (?littleEndian) {
       return _getUint16_1(byteOffset, littleEndian);
     }
     return _getUint16_2(byteOffset);
   }
 
-
-  /** @domName DataView.getUint16_1 */
+  @DocsEditable
+  @DomName('DataView.getUint16_1')
   int _getUint16_1(byteOffset, littleEndian) native "DataView_getUint16_1_Callback";
 
-
-  /** @domName DataView.getUint16_2 */
+  @DocsEditable
+  @DomName('DataView.getUint16_2')
   int _getUint16_2(byteOffset) native "DataView_getUint16_2_Callback";
 
-  int getUint32(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
+  int getUint32(int byteOffset, {bool littleEndian}) {
     if (?littleEndian) {
       return _getUint32_1(byteOffset, littleEndian);
     }
     return _getUint32_2(byteOffset);
   }
 
-
-  /** @domName DataView.getUint32_1 */
+  @DocsEditable
+  @DomName('DataView.getUint32_1')
   int _getUint32_1(byteOffset, littleEndian) native "DataView_getUint32_1_Callback";
 
-
-  /** @domName DataView.getUint32_2 */
+  @DocsEditable
+  @DomName('DataView.getUint32_2')
   int _getUint32_2(byteOffset) native "DataView_getUint32_2_Callback";
 
-
-  /** @domName DataView.getUint8 */
+  @DocsEditable
+  @DomName('DataView.getUint8')
   int getUint8(int byteOffset) native "DataView_getUint8_Callback";
 
-  void setFloat32(/*unsigned long*/ byteOffset, /*float*/ value, {/*boolean*/ littleEndian}) {
+  void setFloat32(int byteOffset, num value, {bool littleEndian}) {
     if (?littleEndian) {
       _setFloat32_1(byteOffset, value, littleEndian);
       return;
@@ -6485,15 +6386,15 @@
     _setFloat32_2(byteOffset, value);
   }
 
-
-  /** @domName DataView.setFloat32_1 */
+  @DocsEditable
+  @DomName('DataView.setFloat32_1')
   void _setFloat32_1(byteOffset, value, littleEndian) native "DataView_setFloat32_1_Callback";
 
-
-  /** @domName DataView.setFloat32_2 */
+  @DocsEditable
+  @DomName('DataView.setFloat32_2')
   void _setFloat32_2(byteOffset, value) native "DataView_setFloat32_2_Callback";
 
-  void setFloat64(/*unsigned long*/ byteOffset, /*double*/ value, {/*boolean*/ littleEndian}) {
+  void setFloat64(int byteOffset, num value, {bool littleEndian}) {
     if (?littleEndian) {
       _setFloat64_1(byteOffset, value, littleEndian);
       return;
@@ -6501,15 +6402,15 @@
     _setFloat64_2(byteOffset, value);
   }
 
-
-  /** @domName DataView.setFloat64_1 */
+  @DocsEditable
+  @DomName('DataView.setFloat64_1')
   void _setFloat64_1(byteOffset, value, littleEndian) native "DataView_setFloat64_1_Callback";
 
-
-  /** @domName DataView.setFloat64_2 */
+  @DocsEditable
+  @DomName('DataView.setFloat64_2')
   void _setFloat64_2(byteOffset, value) native "DataView_setFloat64_2_Callback";
 
-  void setInt16(/*unsigned long*/ byteOffset, /*short*/ value, {/*boolean*/ littleEndian}) {
+  void setInt16(int byteOffset, int value, {bool littleEndian}) {
     if (?littleEndian) {
       _setInt16_1(byteOffset, value, littleEndian);
       return;
@@ -6517,15 +6418,15 @@
     _setInt16_2(byteOffset, value);
   }
 
-
-  /** @domName DataView.setInt16_1 */
+  @DocsEditable
+  @DomName('DataView.setInt16_1')
   void _setInt16_1(byteOffset, value, littleEndian) native "DataView_setInt16_1_Callback";
 
-
-  /** @domName DataView.setInt16_2 */
+  @DocsEditable
+  @DomName('DataView.setInt16_2')
   void _setInt16_2(byteOffset, value) native "DataView_setInt16_2_Callback";
 
-  void setInt32(/*unsigned long*/ byteOffset, /*long*/ value, {/*boolean*/ littleEndian}) {
+  void setInt32(int byteOffset, int value, {bool littleEndian}) {
     if (?littleEndian) {
       _setInt32_1(byteOffset, value, littleEndian);
       return;
@@ -6533,19 +6434,19 @@
     _setInt32_2(byteOffset, value);
   }
 
-
-  /** @domName DataView.setInt32_1 */
+  @DocsEditable
+  @DomName('DataView.setInt32_1')
   void _setInt32_1(byteOffset, value, littleEndian) native "DataView_setInt32_1_Callback";
 
-
-  /** @domName DataView.setInt32_2 */
+  @DocsEditable
+  @DomName('DataView.setInt32_2')
   void _setInt32_2(byteOffset, value) native "DataView_setInt32_2_Callback";
 
-
-  /** @domName DataView.setInt8 */
+  @DocsEditable
+  @DomName('DataView.setInt8')
   void setInt8(int byteOffset, int value) native "DataView_setInt8_Callback";
 
-  void setUint16(/*unsigned long*/ byteOffset, /*unsigned short*/ value, {/*boolean*/ littleEndian}) {
+  void setUint16(int byteOffset, int value, {bool littleEndian}) {
     if (?littleEndian) {
       _setUint16_1(byteOffset, value, littleEndian);
       return;
@@ -6553,15 +6454,15 @@
     _setUint16_2(byteOffset, value);
   }
 
-
-  /** @domName DataView.setUint16_1 */
+  @DocsEditable
+  @DomName('DataView.setUint16_1')
   void _setUint16_1(byteOffset, value, littleEndian) native "DataView_setUint16_1_Callback";
 
-
-  /** @domName DataView.setUint16_2 */
+  @DocsEditable
+  @DomName('DataView.setUint16_2')
   void _setUint16_2(byteOffset, value) native "DataView_setUint16_2_Callback";
 
-  void setUint32(/*unsigned long*/ byteOffset, /*unsigned long*/ value, {/*boolean*/ littleEndian}) {
+  void setUint32(int byteOffset, int value, {bool littleEndian}) {
     if (?littleEndian) {
       _setUint32_1(byteOffset, value, littleEndian);
       return;
@@ -6569,16 +6470,16 @@
     _setUint32_2(byteOffset, value);
   }
 
-
-  /** @domName DataView.setUint32_1 */
+  @DocsEditable
+  @DomName('DataView.setUint32_1')
   void _setUint32_1(byteOffset, value, littleEndian) native "DataView_setUint32_1_Callback";
 
-
-  /** @domName DataView.setUint32_2 */
+  @DocsEditable
+  @DomName('DataView.setUint32_2')
   void _setUint32_2(byteOffset, value) native "DataView_setUint32_2_Callback";
 
-
-  /** @domName DataView.setUint8 */
+  @DocsEditable
+  @DomName('DataView.setUint8')
   void setUint8(int byteOffset, int value) native "DataView_setUint8_Callback";
 
 }
@@ -6589,24 +6490,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Database
+@DocsEditable
+@DomName('Database')
 class Database extends NativeFieldWrapperClass1 {
   Database.internal();
 
-
-  /** @domName Database.version */
+  @DocsEditable
+  @DomName('Database.version')
   String get version native "Database_version_Getter";
 
-
-  /** @domName Database.changeVersion */
+  @DocsEditable
+  @DomName('Database.changeVersion')
   void changeVersion(String oldVersion, String newVersion, [SqlTransactionCallback callback, SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_changeVersion_Callback";
 
-
-  /** @domName Database.readTransaction */
+  @DocsEditable
+  @DomName('Database.readTransaction')
   void readTransaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_readTransaction_Callback";
 
-
-  /** @domName Database.transaction */
+  @DocsEditable
+  @DomName('Database.transaction')
   void transaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_transaction_Callback";
 
 }
@@ -6625,28 +6527,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DatabaseSync
+@DocsEditable
+@DomName('DatabaseSync')
 class DatabaseSync extends NativeFieldWrapperClass1 {
   DatabaseSync.internal();
 
-
-  /** @domName DatabaseSync.lastErrorMessage */
+  @DocsEditable
+  @DomName('DatabaseSync.lastErrorMessage')
   String get lastErrorMessage native "DatabaseSync_lastErrorMessage_Getter";
 
-
-  /** @domName DatabaseSync.version */
+  @DocsEditable
+  @DomName('DatabaseSync.version')
   String get version native "DatabaseSync_version_Getter";
 
-
-  /** @domName DatabaseSync.changeVersion */
+  @DocsEditable
+  @DomName('DatabaseSync.changeVersion')
   void changeVersion(String oldVersion, String newVersion, [SqlTransactionSyncCallback callback]) native "DatabaseSync_changeVersion_Callback";
 
-
-  /** @domName DatabaseSync.readTransaction */
+  @DocsEditable
+  @DomName('DatabaseSync.readTransaction')
   void readTransaction(SqlTransactionSyncCallback callback) native "DatabaseSync_readTransaction_Callback";
 
-
-  /** @domName DatabaseSync.transaction */
+  @DocsEditable
+  @DomName('DatabaseSync.transaction')
   void transaction(SqlTransactionSyncCallback callback) native "DatabaseSync_transaction_Callback";
 
 }
@@ -6657,30 +6560,32 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DedicatedWorkerContext
+@DocsEditable
+@DomName('DedicatedWorkerContext')
 class DedicatedWorkerContext extends WorkerContext {
   DedicatedWorkerContext.internal() : super.internal();
 
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   DedicatedWorkerContextEvents get on =>
     new DedicatedWorkerContextEvents(this);
 
-
-  /** @domName DedicatedWorkerContext.postMessage */
+  @DocsEditable
+  @DomName('DedicatedWorkerContext.postMessage')
   void postMessage(Object message, [List messagePorts]) native "DedicatedWorkerContext_postMessage_Callback";
 
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class DedicatedWorkerContextEvents extends WorkerContextEvents {
-  /// @docsEditable true
+  @DocsEditable
   DedicatedWorkerContextEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get message => this['message'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6690,25 +6595,26 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLDetailsElement
+@DocsEditable
+@DomName('HTMLDetailsElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental()
 class DetailsElement extends _Element_Merged {
   DetailsElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory DetailsElement() => document.$dom_createElement("details");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-
-  /** @domName HTMLDetailsElement.open */
+  @DocsEditable
+  @DomName('HTMLDetailsElement.open')
   bool get open native "HTMLDetailsElement_open_Getter";
 
-
-  /** @domName HTMLDetailsElement.open */
+  @DocsEditable
+  @DomName('HTMLDetailsElement.open')
   void set open(bool value) native "HTMLDetailsElement_open_Setter";
 
 }
@@ -6719,12 +6625,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DeviceMotionEvent
+@DocsEditable
+@DomName('DeviceMotionEvent')
 class DeviceMotionEvent extends Event {
   DeviceMotionEvent.internal() : super.internal();
 
-
-  /** @domName DeviceMotionEvent.interval */
+  @DocsEditable
+  @DomName('DeviceMotionEvent.interval')
   num get interval native "DeviceMotionEvent_interval_Getter";
 
 }
@@ -6735,28 +6642,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DeviceOrientationEvent
+@DocsEditable
+@DomName('DeviceOrientationEvent')
 class DeviceOrientationEvent extends Event {
   DeviceOrientationEvent.internal() : super.internal();
 
-
-  /** @domName DeviceOrientationEvent.absolute */
+  @DocsEditable
+  @DomName('DeviceOrientationEvent.absolute')
   bool get absolute native "DeviceOrientationEvent_absolute_Getter";
 
-
-  /** @domName DeviceOrientationEvent.alpha */
+  @DocsEditable
+  @DomName('DeviceOrientationEvent.alpha')
   num get alpha native "DeviceOrientationEvent_alpha_Getter";
 
-
-  /** @domName DeviceOrientationEvent.beta */
+  @DocsEditable
+  @DomName('DeviceOrientationEvent.beta')
   num get beta native "DeviceOrientationEvent_beta_Getter";
 
-
-  /** @domName DeviceOrientationEvent.gamma */
+  @DocsEditable
+  @DomName('DeviceOrientationEvent.gamma')
   num get gamma native "DeviceOrientationEvent_gamma_Getter";
 
-
-  /** @domName DeviceOrientationEvent.initDeviceOrientationEvent */
+  @DocsEditable
+  @DomName('DeviceOrientationEvent.initDeviceOrientationEvent')
   void initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
 
 }
@@ -6767,44 +6675,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLDirectoryElement
-class DirectoryElement extends _Element_Merged {
-  DirectoryElement.internal() : super.internal();
-
-
-  /** @domName HTMLDirectoryElement.compact */
-  bool get compact native "HTMLDirectoryElement_compact_Getter";
-
-
-  /** @domName HTMLDirectoryElement.compact */
-  void set compact(bool value) native "HTMLDirectoryElement_compact_Setter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName DirectoryEntry
+@DocsEditable
+@DomName('DirectoryEntry')
 class DirectoryEntry extends Entry {
   DirectoryEntry.internal() : super.internal();
 
-
-  /** @domName DirectoryEntry.createReader */
+  @DocsEditable
+  @DomName('DirectoryEntry.createReader')
   DirectoryReader createReader() native "DirectoryEntry_createReader_Callback";
 
-
-  /** @domName DirectoryEntry.getDirectory */
+  @DocsEditable
+  @DomName('DirectoryEntry.getDirectory')
   void getDirectory(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback}) native "DirectoryEntry_getDirectory_Callback";
 
-
-  /** @domName DirectoryEntry.getFile */
+  @DocsEditable
+  @DomName('DirectoryEntry.getFile')
   void getFile(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback}) native "DirectoryEntry_getFile_Callback";
 
-
-  /** @domName DirectoryEntry.removeRecursively */
+  @DocsEditable
+  @DomName('DirectoryEntry.removeRecursively')
   void removeRecursively(VoidCallback successCallback, [ErrorCallback errorCallback]) native "DirectoryEntry_removeRecursively_Callback";
 
 }
@@ -6815,24 +6704,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DirectoryEntrySync
+@DocsEditable
+@DomName('DirectoryEntrySync')
 class DirectoryEntrySync extends EntrySync {
   DirectoryEntrySync.internal() : super.internal();
 
-
-  /** @domName DirectoryEntrySync.createReader */
+  @DocsEditable
+  @DomName('DirectoryEntrySync.createReader')
   DirectoryReaderSync createReader() native "DirectoryEntrySync_createReader_Callback";
 
-
-  /** @domName DirectoryEntrySync.getDirectory */
+  @DocsEditable
+  @DomName('DirectoryEntrySync.getDirectory')
   DirectoryEntrySync getDirectory(String path, Map flags) native "DirectoryEntrySync_getDirectory_Callback";
 
-
-  /** @domName DirectoryEntrySync.getFile */
+  @DocsEditable
+  @DomName('DirectoryEntrySync.getFile')
   FileEntrySync getFile(String path, Map flags) native "DirectoryEntrySync_getFile_Callback";
 
-
-  /** @domName DirectoryEntrySync.removeRecursively */
+  @DocsEditable
+  @DomName('DirectoryEntrySync.removeRecursively')
   void removeRecursively() native "DirectoryEntrySync_removeRecursively_Callback";
 
 }
@@ -6843,12 +6733,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DirectoryReader
+@DocsEditable
+@DomName('DirectoryReader')
 class DirectoryReader extends NativeFieldWrapperClass1 {
   DirectoryReader.internal();
 
-
-  /** @domName DirectoryReader.readEntries */
+  @DocsEditable
+  @DomName('DirectoryReader.readEntries')
   void readEntries(EntriesCallback successCallback, [ErrorCallback errorCallback]) native "DirectoryReader_readEntries_Callback";
 
 }
@@ -6859,12 +6750,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DirectoryReaderSync
+@DocsEditable
+@DomName('DirectoryReaderSync')
 class DirectoryReaderSync extends NativeFieldWrapperClass1 {
   DirectoryReaderSync.internal();
 
-
-  /** @domName DirectoryReaderSync.readEntries */
+  @DocsEditable
+  @DomName('DirectoryReaderSync.readEntries')
   List<EntrySync> readEntries() native "DirectoryReaderSync_readEntries_Callback";
 
 }
@@ -6875,11 +6767,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLDivElement
+@DocsEditable
+@DomName('HTMLDivElement')
 class DivElement extends _Element_Merged {
   DivElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory DivElement() => document.$dom_createElement("div");
 
 }
@@ -6888,7 +6781,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Document
+@DocsEditable
+@DomName('Document')
 /**
  * The base class for all documents.
  *
@@ -6903,413 +6797,324 @@
 
   Document.internal() : super.internal();
 
-  static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
-
-  static const EventStreamProvider<Event> beforeCopyEvent = const EventStreamProvider<Event>('beforecopy');
-
-  static const EventStreamProvider<Event> beforeCutEvent = const EventStreamProvider<Event>('beforecut');
-
-  static const EventStreamProvider<Event> beforePasteEvent = const EventStreamProvider<Event>('beforepaste');
-
-  static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
-
-  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
-
-  static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
-
-  static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
-
-  static const EventStreamProvider<Event> copyEvent = const EventStreamProvider<Event>('copy');
-
-  static const EventStreamProvider<Event> cutEvent = const EventStreamProvider<Event>('cut');
-
-  static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
-
-  static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
-
-  static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
-
-  static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
-
-  static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
-
-  static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
-
-  static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
-
-  static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
-
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
-
-  static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
-
-  static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
-
-  static const EventStreamProvider<Event> invalidEvent = const EventStreamProvider<Event>('invalid');
-
-  static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
-
-  static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
-
-  static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
-
-  static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
-
-  static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
-
-  static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
-
-  static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
-
-  static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
-
-  static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
-
-  static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
-
-  static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
-
   static const EventStreamProvider<Event> readyStateChangeEvent = const EventStreamProvider<Event>('readystatechange');
 
-  static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
-
-  static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
-
-  static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
-
-  static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
-
   static const EventStreamProvider<Event> selectionChangeEvent = const EventStreamProvider<Event>('selectionchange');
 
-  static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
-
-  static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
-
-  static const EventStreamProvider<TouchEvent> touchCancelEvent = const EventStreamProvider<TouchEvent>('touchcancel');
-
-  static const EventStreamProvider<TouchEvent> touchEndEvent = const EventStreamProvider<TouchEvent>('touchend');
-
-  static const EventStreamProvider<TouchEvent> touchMoveEvent = const EventStreamProvider<TouchEvent>('touchmove');
-
-  static const EventStreamProvider<TouchEvent> touchStartEvent = const EventStreamProvider<TouchEvent>('touchstart');
-
-  static const EventStreamProvider<Event> fullscreenChangeEvent = const EventStreamProvider<Event>('webkitfullscreenchange');
-
-  static const EventStreamProvider<Event> fullscreenErrorEvent = const EventStreamProvider<Event>('webkitfullscreenerror');
-
   static const EventStreamProvider<Event> pointerLockChangeEvent = const EventStreamProvider<Event>('webkitpointerlockchange');
 
   static const EventStreamProvider<Event> pointerLockErrorEvent = const EventStreamProvider<Event>('webkitpointerlockerror');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   DocumentEvents get on =>
     new DocumentEvents(this);
 
-
-  /** @domName Document.body */
+  @DocsEditable
+  @DomName('Document.body')
   Element get $dom_body native "Document_body_Getter";
 
-
-  /** @domName Document.body */
+  @DocsEditable
+  @DomName('Document.body')
   void set $dom_body(Element value) native "Document_body_Setter";
 
-
-  /** @domName Document.charset */
+  @DocsEditable
+  @DomName('Document.charset')
   String get charset native "Document_charset_Getter";
 
-
-  /** @domName Document.charset */
+  @DocsEditable
+  @DomName('Document.charset')
   void set charset(String value) native "Document_charset_Setter";
 
-
-  /** @domName Document.cookie */
+  @DocsEditable
+  @DomName('Document.cookie')
   String get cookie native "Document_cookie_Getter";
 
-
-  /** @domName Document.cookie */
+  @DocsEditable
+  @DomName('Document.cookie')
   void set cookie(String value) native "Document_cookie_Setter";
 
-
-  /** @domName Document.defaultView */
+  @DocsEditable
+  @DomName('Document.defaultView')
   WindowBase get window native "Document_defaultView_Getter";
 
-
-  /** @domName Document.documentElement */
+  @DocsEditable
+  @DomName('Document.documentElement')
   Element get documentElement native "Document_documentElement_Getter";
 
-
-  /** @domName Document.domain */
+  @DocsEditable
+  @DomName('Document.domain')
   String get domain native "Document_domain_Getter";
 
-
-  /** @domName Document.head */
+  @DocsEditable
+  @DomName('Document.head')
   HeadElement get $dom_head native "Document_head_Getter";
 
-
-  /** @domName Document.implementation */
+  @DocsEditable
+  @DomName('Document.implementation')
   DomImplementation get implementation native "Document_implementation_Getter";
 
-
-  /** @domName Document.lastModified */
+  @DocsEditable
+  @DomName('Document.lastModified')
   String get $dom_lastModified native "Document_lastModified_Getter";
 
-
-  /** @domName Document.preferredStylesheetSet */
+  @DocsEditable
+  @DomName('Document.preferredStylesheetSet')
   String get $dom_preferredStylesheetSet native "Document_preferredStylesheetSet_Getter";
 
-
-  /** @domName Document.readyState */
+  @DocsEditable
+  @DomName('Document.readyState')
   String get readyState native "Document_readyState_Getter";
 
-
-  /** @domName Document.referrer */
+  @DocsEditable
+  @DomName('Document.referrer')
   String get $dom_referrer native "Document_referrer_Getter";
 
-
-  /** @domName Document.selectedStylesheetSet */
+  @DocsEditable
+  @DomName('Document.selectedStylesheetSet')
   String get $dom_selectedStylesheetSet native "Document_selectedStylesheetSet_Getter";
 
-
-  /** @domName Document.selectedStylesheetSet */
+  @DocsEditable
+  @DomName('Document.selectedStylesheetSet')
   void set $dom_selectedStylesheetSet(String value) native "Document_selectedStylesheetSet_Setter";
 
-
-  /** @domName Document.styleSheets */
+  @DocsEditable
+  @DomName('Document.styleSheets')
   List<StyleSheet> get $dom_styleSheets native "Document_styleSheets_Getter";
 
-
-  /** @domName Document.title */
+  @DocsEditable
+  @DomName('Document.title')
   String get $dom_title native "Document_title_Getter";
 
-
-  /** @domName Document.title */
+  @DocsEditable
+  @DomName('Document.title')
   void set $dom_title(String value) native "Document_title_Setter";
 
-
-  /** @domName Document.webkitFullscreenElement */
+  @DocsEditable
+  @DomName('Document.webkitFullscreenElement')
   Element get $dom_webkitFullscreenElement native "Document_webkitFullscreenElement_Getter";
 
-
-  /** @domName Document.webkitFullscreenEnabled */
+  @DocsEditable
+  @DomName('Document.webkitFullscreenEnabled')
   bool get $dom_webkitFullscreenEnabled native "Document_webkitFullscreenEnabled_Getter";
 
-
-  /** @domName Document.webkitHidden */
+  @DocsEditable
+  @DomName('Document.webkitHidden')
   bool get $dom_webkitHidden native "Document_webkitHidden_Getter";
 
-
-  /** @domName Document.webkitIsFullScreen */
+  @DocsEditable
+  @DomName('Document.webkitIsFullScreen')
   bool get $dom_webkitIsFullScreen native "Document_webkitIsFullScreen_Getter";
 
-
-  /** @domName Document.webkitPointerLockElement */
+  @DocsEditable
+  @DomName('Document.webkitPointerLockElement')
   Element get $dom_webkitPointerLockElement native "Document_webkitPointerLockElement_Getter";
 
-
-  /** @domName Document.webkitVisibilityState */
+  @DocsEditable
+  @DomName('Document.webkitVisibilityState')
   String get $dom_webkitVisibilityState native "Document_webkitVisibilityState_Getter";
 
-
-  /** @domName Document.caretRangeFromPoint */
+  @DocsEditable
+  @DomName('Document.caretRangeFromPoint')
   Range $dom_caretRangeFromPoint(int x, int y) native "Document_caretRangeFromPoint_Callback";
 
-
-  /** @domName Document.createCDATASection */
+  @DocsEditable
+  @DomName('Document.createCDATASection')
   CDataSection createCDataSection(String data) native "Document_createCDATASection_Callback";
 
-
-  /** @domName Document.createDocumentFragment */
+  @DocsEditable
+  @DomName('Document.createDocumentFragment')
   DocumentFragment createDocumentFragment() native "Document_createDocumentFragment_Callback";
 
-
-  /** @domName Document.createElement */
+  @DocsEditable
+  @DomName('Document.createElement')
   Element $dom_createElement(String tagName) native "Document_createElement_Callback";
 
-
-  /** @domName Document.createElementNS */
+  @DocsEditable
+  @DomName('Document.createElementNS')
   Element $dom_createElementNS(String namespaceURI, String qualifiedName) native "Document_createElementNS_Callback";
 
-
-  /** @domName Document.createEvent */
+  @DocsEditable
+  @DomName('Document.createEvent')
   Event $dom_createEvent(String eventType) native "Document_createEvent_Callback";
 
-
-  /** @domName Document.createRange */
+  @DocsEditable
+  @DomName('Document.createRange')
   Range $dom_createRange() native "Document_createRange_Callback";
 
-
-  /** @domName Document.createTextNode */
+  @DocsEditable
+  @DomName('Document.createTextNode')
   Text $dom_createTextNode(String data) native "Document_createTextNode_Callback";
 
-
-  /** @domName Document.createTouch */
+  @DocsEditable
+  @DomName('Document.createTouch')
   Touch $dom_createTouch(Window window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) native "Document_createTouch_Callback";
 
-
-  /** @domName Document.createTouchList */
+  @DocsEditable
+  @DomName('Document.createTouchList')
   TouchList $dom_createTouchList() native "Document_createTouchList_Callback";
 
-
-  /** @domName Document.elementFromPoint */
+  @DocsEditable
+  @DomName('Document.elementFromPoint')
   Element $dom_elementFromPoint(int x, int y) native "Document_elementFromPoint_Callback";
 
-
-  /** @domName Document.execCommand */
+  @DocsEditable
+  @DomName('Document.execCommand')
   bool execCommand(String command, bool userInterface, String value) native "Document_execCommand_Callback";
 
-
-  /** @domName Document.getCSSCanvasContext */
+  @DocsEditable
+  @DomName('Document.getCSSCanvasContext')
   CanvasRenderingContext $dom_getCssCanvasContext(String contextId, String name, int width, int height) native "Document_getCSSCanvasContext_Callback";
 
-
-  /** @domName Document.getElementById */
+  @DocsEditable
+  @DomName('Document.getElementById')
   Element $dom_getElementById(String elementId) native "Document_getElementById_Callback";
 
-
-  /** @domName Document.getElementsByClassName */
+  @DocsEditable
+  @DomName('Document.getElementsByClassName')
   List<Node> $dom_getElementsByClassName(String tagname) native "Document_getElementsByClassName_Callback";
 
-
-  /** @domName Document.getElementsByName */
+  @DocsEditable
+  @DomName('Document.getElementsByName')
   List<Node> $dom_getElementsByName(String elementName) native "Document_getElementsByName_Callback";
 
-
-  /** @domName Document.getElementsByTagName */
+  @DocsEditable
+  @DomName('Document.getElementsByTagName')
   List<Node> $dom_getElementsByTagName(String tagname) native "Document_getElementsByTagName_Callback";
 
-
-  /** @domName Document.queryCommandEnabled */
+  @DocsEditable
+  @DomName('Document.queryCommandEnabled')
   bool queryCommandEnabled(String command) native "Document_queryCommandEnabled_Callback";
 
-
-  /** @domName Document.queryCommandIndeterm */
+  @DocsEditable
+  @DomName('Document.queryCommandIndeterm')
   bool queryCommandIndeterm(String command) native "Document_queryCommandIndeterm_Callback";
 
-
-  /** @domName Document.queryCommandState */
+  @DocsEditable
+  @DomName('Document.queryCommandState')
   bool queryCommandState(String command) native "Document_queryCommandState_Callback";
 
-
-  /** @domName Document.queryCommandSupported */
+  @DocsEditable
+  @DomName('Document.queryCommandSupported')
   bool queryCommandSupported(String command) native "Document_queryCommandSupported_Callback";
 
-
-  /** @domName Document.queryCommandValue */
+  @DocsEditable
+  @DomName('Document.queryCommandValue')
   String queryCommandValue(String command) native "Document_queryCommandValue_Callback";
 
-
-  /** @domName Document.querySelector */
+  @DocsEditable
+  @DomName('Document.querySelector')
   Element $dom_querySelector(String selectors) native "Document_querySelector_Callback";
 
-
-  /** @domName Document.querySelectorAll */
+  @DocsEditable
+  @DomName('Document.querySelectorAll')
   List<Node> $dom_querySelectorAll(String selectors) native "Document_querySelectorAll_Callback";
 
-
-  /** @domName Document.webkitCancelFullScreen */
+  @DocsEditable
+  @DomName('Document.webkitCancelFullScreen')
   void $dom_webkitCancelFullScreen() native "Document_webkitCancelFullScreen_Callback";
 
-
-  /** @domName Document.webkitExitFullscreen */
+  @DocsEditable
+  @DomName('Document.webkitExitFullscreen')
   void $dom_webkitExitFullscreen() native "Document_webkitExitFullscreen_Callback";
 
-
-  /** @domName Document.webkitExitPointerLock */
+  @DocsEditable
+  @DomName('Document.webkitExitPointerLock')
   void $dom_webkitExitPointerLock() native "Document_webkitExitPointerLock_Callback";
 
-  Stream<Event> get onAbort => abortEvent.forTarget(this);
+  Stream<Event> get onAbort => Element.abortEvent.forTarget(this);
 
-  Stream<Event> get onBeforeCopy => beforeCopyEvent.forTarget(this);
+  Stream<Event> get onBeforeCopy => Element.beforeCopyEvent.forTarget(this);
 
-  Stream<Event> get onBeforeCut => beforeCutEvent.forTarget(this);
+  Stream<Event> get onBeforeCut => Element.beforeCutEvent.forTarget(this);
 
-  Stream<Event> get onBeforePaste => beforePasteEvent.forTarget(this);
+  Stream<Event> get onBeforePaste => Element.beforePasteEvent.forTarget(this);
 
-  Stream<Event> get onBlur => blurEvent.forTarget(this);
+  Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
-  Stream<Event> get onChange => changeEvent.forTarget(this);
+  Stream<Event> get onChange => Element.changeEvent.forTarget(this);
 
-  Stream<MouseEvent> get onClick => clickEvent.forTarget(this);
+  Stream<MouseEvent> get onClick => Element.clickEvent.forTarget(this);
 
-  Stream<MouseEvent> get onContextMenu => contextMenuEvent.forTarget(this);
+  Stream<MouseEvent> get onContextMenu => Element.contextMenuEvent.forTarget(this);
 
-  Stream<Event> get onCopy => copyEvent.forTarget(this);
+  Stream<Event> get onCopy => Element.copyEvent.forTarget(this);
 
-  Stream<Event> get onCut => cutEvent.forTarget(this);
+  Stream<Event> get onCut => Element.cutEvent.forTarget(this);
 
-  Stream<Event> get onDoubleClick => doubleClickEvent.forTarget(this);
+  Stream<Event> get onDoubleClick => Element.doubleClickEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDrag => dragEvent.forTarget(this);
+  Stream<MouseEvent> get onDrag => Element.dragEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragEnd => dragEndEvent.forTarget(this);
+  Stream<MouseEvent> get onDragEnd => Element.dragEndEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragEnter => dragEnterEvent.forTarget(this);
+  Stream<MouseEvent> get onDragEnter => Element.dragEnterEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragLeave => dragLeaveEvent.forTarget(this);
+  Stream<MouseEvent> get onDragLeave => Element.dragLeaveEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragOver => dragOverEvent.forTarget(this);
+  Stream<MouseEvent> get onDragOver => Element.dragOverEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragStart => dragStartEvent.forTarget(this);
+  Stream<MouseEvent> get onDragStart => Element.dragStartEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDrop => dropEvent.forTarget(this);
+  Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
-  Stream<Event> get onError => errorEvent.forTarget(this);
+  Stream<Event> get onError => Element.errorEvent.forTarget(this);
 
-  Stream<Event> get onFocus => focusEvent.forTarget(this);
+  Stream<Event> get onFocus => Element.focusEvent.forTarget(this);
 
-  Stream<Event> get onInput => inputEvent.forTarget(this);
+  Stream<Event> get onInput => Element.inputEvent.forTarget(this);
 
-  Stream<Event> get onInvalid => invalidEvent.forTarget(this);
+  Stream<Event> get onInvalid => Element.invalidEvent.forTarget(this);
 
-  Stream<KeyboardEvent> get onKeyDown => keyDownEvent.forTarget(this);
+  Stream<KeyboardEvent> get onKeyDown => Element.keyDownEvent.forTarget(this);
 
-  Stream<KeyboardEvent> get onKeyPress => keyPressEvent.forTarget(this);
+  Stream<KeyboardEvent> get onKeyPress => Element.keyPressEvent.forTarget(this);
 
-  Stream<KeyboardEvent> get onKeyUp => keyUpEvent.forTarget(this);
+  Stream<KeyboardEvent> get onKeyUp => Element.keyUpEvent.forTarget(this);
 
-  Stream<Event> get onLoad => loadEvent.forTarget(this);
+  Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseDown => mouseDownEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseMove => mouseMoveEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseOut => mouseOutEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseOut => Element.mouseOutEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseOver => mouseOverEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseOver => Element.mouseOverEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseUp => mouseUpEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseUp => Element.mouseUpEvent.forTarget(this);
 
-  Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
+  Stream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent.forTarget(this);
 
-  Stream<Event> get onPaste => pasteEvent.forTarget(this);
+  Stream<Event> get onPaste => Element.pasteEvent.forTarget(this);
 
   Stream<Event> get onReadyStateChange => readyStateChangeEvent.forTarget(this);
 
-  Stream<Event> get onReset => resetEvent.forTarget(this);
+  Stream<Event> get onReset => Element.resetEvent.forTarget(this);
 
-  Stream<Event> get onScroll => scrollEvent.forTarget(this);
+  Stream<Event> get onScroll => Element.scrollEvent.forTarget(this);
 
-  Stream<Event> get onSearch => searchEvent.forTarget(this);
+  Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
-  Stream<Event> get onSelect => selectEvent.forTarget(this);
+  Stream<Event> get onSelect => Element.selectEvent.forTarget(this);
 
   Stream<Event> get onSelectionChange => selectionChangeEvent.forTarget(this);
 
-  Stream<Event> get onSelectStart => selectStartEvent.forTarget(this);
+  Stream<Event> get onSelectStart => Element.selectStartEvent.forTarget(this);
 
-  Stream<Event> get onSubmit => submitEvent.forTarget(this);
+  Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
-  Stream<TouchEvent> get onTouchCancel => touchCancelEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
 
-  Stream<TouchEvent> get onTouchEnd => touchEndEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
-  Stream<TouchEvent> get onTouchMove => touchMoveEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
-  Stream<TouchEvent> get onTouchStart => touchStartEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
-  Stream<Event> get onFullscreenChange => fullscreenChangeEvent.forTarget(this);
+  Stream<Event> get onFullscreenChange => Element.fullscreenChangeEvent.forTarget(this);
 
-  Stream<Event> get onFullscreenError => fullscreenErrorEvent.forTarget(this);
+  Stream<Event> get onFullscreenError => Element.fullscreenErrorEvent.forTarget(this);
 
   Stream<Event> get onPointerLockChange => pointerLockChangeEvent.forTarget(this);
 
@@ -7378,21 +7183,21 @@
   }
 }
 
-/// @docsEditable true
+@DocsEditable
 class DocumentEvents extends ElementEvents {
-  /// @docsEditable true
+  @DocsEditable
   DocumentEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get readyStateChange => this['readystatechange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get selectionChange => this['selectionchange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get pointerLockChange => this['webkitpointerlockchange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get pointerLockError => this['webkitpointerlockerror'];
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
@@ -7415,7 +7220,8 @@
   bool get frozen => true;
 }
 
-/// @domName DocumentFragment
+@DocsEditable
+@DomName('DocumentFragment')
 class DocumentFragment extends Node {
   factory DocumentFragment() => _DocumentFragmentFactoryProvider.createDocumentFragment();
 
@@ -7661,16 +7467,17 @@
 
   DocumentFragment.internal() : super.internal();
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   ElementEvents get on =>
     new ElementEvents(this);
 
-
-  /** @domName DocumentFragment.querySelector */
+  @DocsEditable
+  @DomName('DocumentFragment.querySelector')
   Element $dom_querySelector(String selectors) native "DocumentFragment_querySelector_Callback";
 
-
-  /** @domName DocumentFragment.querySelectorAll */
+  @DocsEditable
+  @DomName('DocumentFragment.querySelectorAll')
   List<Node> $dom_querySelectorAll(String selectors) native "DocumentFragment_querySelectorAll_Callback";
 
 }
@@ -7681,38 +7488,11 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DocumentType
+@DocsEditable
+@DomName('DocumentType')
 class DocumentType extends Node {
   DocumentType.internal() : super.internal();
 
-
-  /** @domName DocumentType.entities */
-  NamedNodeMap get entities native "DocumentType_entities_Getter";
-
-
-  /** @domName DocumentType.internalSubset */
-  String get internalSubset native "DocumentType_internalSubset_Getter";
-
-
-  /** @domName DocumentType.name */
-  String get name native "DocumentType_name_Getter";
-
-
-  /** @domName DocumentType.notations */
-  NamedNodeMap get notations native "DocumentType_notations_Getter";
-
-
-  /** @domName DocumentType.publicId */
-  String get publicId native "DocumentType_publicId_Getter";
-
-
-  /** @domName DocumentType.systemId */
-  String get systemId native "DocumentType_systemId_Getter";
-
-
-  /** @domName DocumentType.remove */
-  void remove() native "DocumentType_remove_Callback";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -7721,90 +7501,58 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DOMError
+@DocsEditable
+@DomName('DOMError')
 class DomError extends NativeFieldWrapperClass1 {
   DomError.internal();
 
-
-  /** @domName DOMError.name */
+  @DocsEditable
+  @DomName('DOMError.name')
   String get name native "DOMError_name_Getter";
 
 }
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
 
 /// @domName DOMException
 class DomException extends NativeFieldWrapperClass1 {
+
+  static const String INDEX_SIZE = 'IndexSizeError';
+  static const String HIERARCHY_REQUEST = 'HierarchyRequestError';
+  static const String WRONG_DOCUMENT = 'WrongDocumentError';
+  static const String INVALID_CHARACTER = 'InvalidCharacterError';
+  static const String NO_MODIFICATION_ALLOWED = 'NoModificationAllowedError';
+  static const String NOT_FOUND = 'NotFoundError';
+  static const String NOT_SUPPORTED = 'NotSupportedError';
+  static const String INVALID_STATE = 'InvalidStateError';
+  static const String SYNTAX = 'SyntaxError';
+  static const String INVALID_MODIFICATION = 'InvalidModificationError';
+  static const String NAMESPACE = 'NamespaceError';
+  static const String INVALID_ACCESS = 'InvalidAccessError';
+  static const String TYPE_MISMATCH = 'TypeMismatchError';
+  static const String SECURITY = 'SecurityError';
+  static const String NETWORK = 'NetworkError';
+  static const String ABORT = 'AbortError';
+  static const String URL_MISMATCH = 'URLMismatchError';
+  static const String QUOTA_EXCEEDED = 'QuotaExceededError';
+  static const String TIMEOUT = 'TimeoutError';
+  static const String INVALID_NODE_TYPE = 'InvalidNodeTypeError';
+  static const String DATA_CLONE = 'DataCloneError';
+
   DomException.internal();
 
-  static const int ABORT_ERR = 20;
-
-  static const int DATA_CLONE_ERR = 25;
-
-  static const int DOMSTRING_SIZE_ERR = 2;
-
-  static const int HIERARCHY_REQUEST_ERR = 3;
-
-  static const int INDEX_SIZE_ERR = 1;
-
-  static const int INUSE_ATTRIBUTE_ERR = 10;
-
-  static const int INVALID_ACCESS_ERR = 15;
-
-  static const int INVALID_CHARACTER_ERR = 5;
-
-  static const int INVALID_MODIFICATION_ERR = 13;
-
-  static const int INVALID_NODE_TYPE_ERR = 24;
-
-  static const int INVALID_STATE_ERR = 11;
-
-  static const int NAMESPACE_ERR = 14;
-
-  static const int NETWORK_ERR = 19;
-
-  static const int NOT_FOUND_ERR = 8;
-
-  static const int NOT_SUPPORTED_ERR = 9;
-
-  static const int NO_DATA_ALLOWED_ERR = 6;
-
-  static const int NO_MODIFICATION_ALLOWED_ERR = 7;
-
-  static const int QUOTA_EXCEEDED_ERR = 22;
-
-  static const int SECURITY_ERR = 18;
-
-  static const int SYNTAX_ERR = 12;
-
-  static const int TIMEOUT_ERR = 23;
-
-  static const int TYPE_MISMATCH_ERR = 17;
-
-  static const int URL_MISMATCH_ERR = 21;
-
-  static const int VALIDATION_ERR = 16;
-
-  static const int WRONG_DOCUMENT_ERR = 4;
-
-
-  /** @domName DOMCoreException.code */
-  int get code native "DOMCoreException_code_Getter";
-
-
-  /** @domName DOMCoreException.message */
+  @DocsEditable
+  @DomName('DOMCoreException.message')
   String get message native "DOMCoreException_message_Getter";
 
-
-  /** @domName DOMCoreException.name */
+  @DocsEditable
+  @DomName('DOMCoreException.name')
   String get name native "DOMCoreException_name_Getter";
 
-
-  /** @domName DOMCoreException.toString */
+  @DocsEditable
+  @DomName('DOMCoreException.toString')
   String toString() native "DOMCoreException_toString_Callback";
 
 }
@@ -7815,28 +7563,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DOMImplementation
+@DocsEditable
+@DomName('DOMImplementation')
 class DomImplementation extends NativeFieldWrapperClass1 {
   DomImplementation.internal();
 
-
-  /** @domName DOMImplementation.createCSSStyleSheet */
+  @DocsEditable
+  @DomName('DOMImplementation.createCSSStyleSheet')
   CssStyleSheet createCssStyleSheet(String title, String media) native "DOMImplementation_createCSSStyleSheet_Callback";
 
-
-  /** @domName DOMImplementation.createDocument */
+  @DocsEditable
+  @DomName('DOMImplementation.createDocument')
   Document createDocument(String namespaceURI, String qualifiedName, DocumentType doctype) native "DOMImplementation_createDocument_Callback";
 
-
-  /** @domName DOMImplementation.createDocumentType */
+  @DocsEditable
+  @DomName('DOMImplementation.createDocumentType')
   DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) native "DOMImplementation_createDocumentType_Callback";
 
-
-  /** @domName DOMImplementation.createHTMLDocument */
+  @DocsEditable
+  @DomName('DOMImplementation.createHTMLDocument')
   HtmlDocument createHtmlDocument(String title) native "DOMImplementation_createHTMLDocument_Callback";
 
-
-  /** @domName DOMImplementation.hasFeature */
+  @DocsEditable
+  @DomName('DOMImplementation.hasFeature')
   bool hasFeature(String feature, String version) native "DOMImplementation_hasFeature_Callback";
 
 }
@@ -7847,24 +7596,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MimeType
+@DocsEditable
+@DomName('MimeType')
 class DomMimeType extends NativeFieldWrapperClass1 {
   DomMimeType.internal();
 
-
-  /** @domName DOMMimeType.description */
+  @DocsEditable
+  @DomName('DOMMimeType.description')
   String get description native "DOMMimeType_description_Getter";
 
-
-  /** @domName DOMMimeType.enabledPlugin */
+  @DocsEditable
+  @DomName('DOMMimeType.enabledPlugin')
   DomPlugin get enabledPlugin native "DOMMimeType_enabledPlugin_Getter";
 
-
-  /** @domName DOMMimeType.suffixes */
+  @DocsEditable
+  @DomName('DOMMimeType.suffixes')
   String get suffixes native "DOMMimeType_suffixes_Getter";
 
-
-  /** @domName DOMMimeType.type */
+  @DocsEditable
+  @DomName('DOMMimeType.type')
   String get type native "DOMMimeType_type_Getter";
 
 }
@@ -7875,12 +7625,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MimeTypeArray
+@DocsEditable
+@DomName('MimeTypeArray')
 class DomMimeTypeArray extends NativeFieldWrapperClass1 implements List<DomMimeType> {
   DomMimeTypeArray.internal();
 
-
-  /** @domName DOMMimeTypeArray.length */
+  @DocsEditable
+  @DomName('DOMMimeTypeArray.length')
   int get length native "DOMMimeTypeArray_length_Getter";
 
   DomMimeType operator[](int index) native "DOMMimeTypeArray_item_Callback";
@@ -7901,50 +7652,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, DomMimeType)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(DomMimeType element) => Collections.contains(this, element);
+  bool contains(DomMimeType element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(DomMimeType element)) => Collections.forEach(this, f);
+  void forEach(void f(DomMimeType element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(DomMimeType element)) => new MappedList<DomMimeType, dynamic>(this, f);
+  List mappedBy(f(DomMimeType element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<DomMimeType> where(bool f(DomMimeType element)) => new WhereIterable<DomMimeType>(this, f);
+  Iterable<DomMimeType> where(bool f(DomMimeType element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(DomMimeType element)) => Collections.every(this, f);
+  bool every(bool f(DomMimeType element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(DomMimeType element)) => Collections.any(this, f);
+  bool any(bool f(DomMimeType element)) => IterableMixinWorkaround.any(this, f);
 
   List<DomMimeType> toList() => new List<DomMimeType>.from(this);
   Set<DomMimeType> toSet() => new Set<DomMimeType>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<DomMimeType> take(int n) => new ListView<DomMimeType>(this, 0, n);
+  List<DomMimeType> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<DomMimeType> takeWhile(bool test(DomMimeType value)) {
-    return new TakeWhileIterable<DomMimeType>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<DomMimeType> skip(int n) => new ListView<DomMimeType>(this, n, null);
+  List<DomMimeType> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<DomMimeType> skipWhile(bool test(DomMimeType value)) {
-    return new SkipWhileIterable<DomMimeType>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   DomMimeType firstMatching(bool test(DomMimeType value), { DomMimeType orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   DomMimeType lastMatching(bool test(DomMimeType value), {DomMimeType orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   DomMimeType singleMatching(bool test(DomMimeType value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   DomMimeType elementAt(int index) {
@@ -8002,16 +7753,36 @@
     throw new StateError("More than one element");
   }
 
-  DomMimeType min([int compare(DomMimeType a, DomMimeType b)]) => Collections.min(this, compare);
+  DomMimeType min([int compare(DomMimeType a, DomMimeType b)]) => IterableMixinWorkaround.min(this, compare);
 
-  DomMimeType max([int compare(DomMimeType a, DomMimeType b)]) => Collections.max(this, compare);
+  DomMimeType max([int compare(DomMimeType a, DomMimeType b)]) => IterableMixinWorkaround.max(this, compare);
 
   DomMimeType removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   DomMimeType removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(DomMimeType element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(DomMimeType element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<DomMimeType> from, [int startFrom]) {
@@ -8031,12 +7802,12 @@
 
   // -- end List<DomMimeType> mixins.
 
-
-  /** @domName DOMMimeTypeArray.item */
+  @DocsEditable
+  @DomName('DOMMimeTypeArray.item')
   DomMimeType item(int index) native "DOMMimeTypeArray_item_Callback";
 
-
-  /** @domName DOMMimeTypeArray.namedItem */
+  @DocsEditable
+  @DomName('DOMMimeTypeArray.namedItem')
   DomMimeType namedItem(String name) native "DOMMimeTypeArray_namedItem_Callback";
 
 }
@@ -8047,16 +7818,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DOMParser
+@DocsEditable
+@DomName('DOMParser')
 class DomParser extends NativeFieldWrapperClass1 {
   DomParser.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory DomParser() => DomParser._create();
   static DomParser _create() native "DOMParser_constructor_Callback";
 
-
-  /** @domName DOMParser.parseFromString */
+  @DocsEditable
+  @DomName('DOMParser.parseFromString')
   Document parseFromString(String str, String contentType) native "DOMParser_parseFromString_Callback";
 
 }
@@ -8067,32 +7839,33 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Plugin
+@DocsEditable
+@DomName('Plugin')
 class DomPlugin extends NativeFieldWrapperClass1 {
   DomPlugin.internal();
 
-
-  /** @domName DOMPlugin.description */
+  @DocsEditable
+  @DomName('DOMPlugin.description')
   String get description native "DOMPlugin_description_Getter";
 
-
-  /** @domName DOMPlugin.filename */
+  @DocsEditable
+  @DomName('DOMPlugin.filename')
   String get filename native "DOMPlugin_filename_Getter";
 
-
-  /** @domName DOMPlugin.length */
+  @DocsEditable
+  @DomName('DOMPlugin.length')
   int get length native "DOMPlugin_length_Getter";
 
-
-  /** @domName DOMPlugin.name */
+  @DocsEditable
+  @DomName('DOMPlugin.name')
   String get name native "DOMPlugin_name_Getter";
 
-
-  /** @domName DOMPlugin.item */
+  @DocsEditable
+  @DomName('DOMPlugin.item')
   DomMimeType item(int index) native "DOMPlugin_item_Callback";
 
-
-  /** @domName DOMPlugin.namedItem */
+  @DocsEditable
+  @DomName('DOMPlugin.namedItem')
   DomMimeType namedItem(String name) native "DOMPlugin_namedItem_Callback";
 
 }
@@ -8103,12 +7876,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName PluginArray
+@DocsEditable
+@DomName('PluginArray')
 class DomPluginArray extends NativeFieldWrapperClass1 implements List<DomPlugin> {
   DomPluginArray.internal();
 
-
-  /** @domName DOMPluginArray.length */
+  @DocsEditable
+  @DomName('DOMPluginArray.length')
   int get length native "DOMPluginArray_length_Getter";
 
   DomPlugin operator[](int index) native "DOMPluginArray_item_Callback";
@@ -8129,50 +7903,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, DomPlugin)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(DomPlugin element) => Collections.contains(this, element);
+  bool contains(DomPlugin element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(DomPlugin element)) => Collections.forEach(this, f);
+  void forEach(void f(DomPlugin element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(DomPlugin element)) => new MappedList<DomPlugin, dynamic>(this, f);
+  List mappedBy(f(DomPlugin element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<DomPlugin> where(bool f(DomPlugin element)) => new WhereIterable<DomPlugin>(this, f);
+  Iterable<DomPlugin> where(bool f(DomPlugin element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(DomPlugin element)) => Collections.every(this, f);
+  bool every(bool f(DomPlugin element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(DomPlugin element)) => Collections.any(this, f);
+  bool any(bool f(DomPlugin element)) => IterableMixinWorkaround.any(this, f);
 
   List<DomPlugin> toList() => new List<DomPlugin>.from(this);
   Set<DomPlugin> toSet() => new Set<DomPlugin>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<DomPlugin> take(int n) => new ListView<DomPlugin>(this, 0, n);
+  List<DomPlugin> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<DomPlugin> takeWhile(bool test(DomPlugin value)) {
-    return new TakeWhileIterable<DomPlugin>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<DomPlugin> skip(int n) => new ListView<DomPlugin>(this, n, null);
+  List<DomPlugin> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<DomPlugin> skipWhile(bool test(DomPlugin value)) {
-    return new SkipWhileIterable<DomPlugin>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   DomPlugin firstMatching(bool test(DomPlugin value), { DomPlugin orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   DomPlugin lastMatching(bool test(DomPlugin value), {DomPlugin orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   DomPlugin singleMatching(bool test(DomPlugin value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   DomPlugin elementAt(int index) {
@@ -8230,16 +8004,36 @@
     throw new StateError("More than one element");
   }
 
-  DomPlugin min([int compare(DomPlugin a, DomPlugin b)]) => Collections.min(this, compare);
+  DomPlugin min([int compare(DomPlugin a, DomPlugin b)]) => IterableMixinWorkaround.min(this, compare);
 
-  DomPlugin max([int compare(DomPlugin a, DomPlugin b)]) => Collections.max(this, compare);
+  DomPlugin max([int compare(DomPlugin a, DomPlugin b)]) => IterableMixinWorkaround.max(this, compare);
 
   DomPlugin removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   DomPlugin removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(DomPlugin element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(DomPlugin element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<DomPlugin> from, [int startFrom]) {
@@ -8259,16 +8053,16 @@
 
   // -- end List<DomPlugin> mixins.
 
-
-  /** @domName DOMPluginArray.item */
+  @DocsEditable
+  @DomName('DOMPluginArray.item')
   DomPlugin item(int index) native "DOMPluginArray_item_Callback";
 
-
-  /** @domName DOMPluginArray.namedItem */
+  @DocsEditable
+  @DomName('DOMPluginArray.namedItem')
   DomPlugin namedItem(String name) native "DOMPluginArray_namedItem_Callback";
 
-
-  /** @domName DOMPluginArray.refresh */
+  @DocsEditable
+  @DomName('DOMPluginArray.refresh')
   void refresh(bool reload) native "DOMPluginArray_refresh_Callback";
 
 }
@@ -8279,112 +8073,113 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Selection
+@DocsEditable
+@DomName('Selection')
 class DomSelection extends NativeFieldWrapperClass1 {
   DomSelection.internal();
 
-
-  /** @domName DOMSelection.anchorNode */
+  @DocsEditable
+  @DomName('DOMSelection.anchorNode')
   Node get anchorNode native "DOMSelection_anchorNode_Getter";
 
-
-  /** @domName DOMSelection.anchorOffset */
+  @DocsEditable
+  @DomName('DOMSelection.anchorOffset')
   int get anchorOffset native "DOMSelection_anchorOffset_Getter";
 
-
-  /** @domName DOMSelection.baseNode */
+  @DocsEditable
+  @DomName('DOMSelection.baseNode')
   Node get baseNode native "DOMSelection_baseNode_Getter";
 
-
-  /** @domName DOMSelection.baseOffset */
+  @DocsEditable
+  @DomName('DOMSelection.baseOffset')
   int get baseOffset native "DOMSelection_baseOffset_Getter";
 
-
-  /** @domName DOMSelection.extentNode */
+  @DocsEditable
+  @DomName('DOMSelection.extentNode')
   Node get extentNode native "DOMSelection_extentNode_Getter";
 
-
-  /** @domName DOMSelection.extentOffset */
+  @DocsEditable
+  @DomName('DOMSelection.extentOffset')
   int get extentOffset native "DOMSelection_extentOffset_Getter";
 
-
-  /** @domName DOMSelection.focusNode */
+  @DocsEditable
+  @DomName('DOMSelection.focusNode')
   Node get focusNode native "DOMSelection_focusNode_Getter";
 
-
-  /** @domName DOMSelection.focusOffset */
+  @DocsEditable
+  @DomName('DOMSelection.focusOffset')
   int get focusOffset native "DOMSelection_focusOffset_Getter";
 
-
-  /** @domName DOMSelection.isCollapsed */
+  @DocsEditable
+  @DomName('DOMSelection.isCollapsed')
   bool get isCollapsed native "DOMSelection_isCollapsed_Getter";
 
-
-  /** @domName DOMSelection.rangeCount */
+  @DocsEditable
+  @DomName('DOMSelection.rangeCount')
   int get rangeCount native "DOMSelection_rangeCount_Getter";
 
-
-  /** @domName DOMSelection.type */
+  @DocsEditable
+  @DomName('DOMSelection.type')
   String get type native "DOMSelection_type_Getter";
 
-
-  /** @domName DOMSelection.addRange */
+  @DocsEditable
+  @DomName('DOMSelection.addRange')
   void addRange(Range range) native "DOMSelection_addRange_Callback";
 
-
-  /** @domName DOMSelection.collapse */
+  @DocsEditable
+  @DomName('DOMSelection.collapse')
   void collapse(Node node, int index) native "DOMSelection_collapse_Callback";
 
-
-  /** @domName DOMSelection.collapseToEnd */
+  @DocsEditable
+  @DomName('DOMSelection.collapseToEnd')
   void collapseToEnd() native "DOMSelection_collapseToEnd_Callback";
 
-
-  /** @domName DOMSelection.collapseToStart */
+  @DocsEditable
+  @DomName('DOMSelection.collapseToStart')
   void collapseToStart() native "DOMSelection_collapseToStart_Callback";
 
-
-  /** @domName DOMSelection.containsNode */
+  @DocsEditable
+  @DomName('DOMSelection.containsNode')
   bool containsNode(Node node, bool allowPartial) native "DOMSelection_containsNode_Callback";
 
-
-  /** @domName DOMSelection.deleteFromDocument */
+  @DocsEditable
+  @DomName('DOMSelection.deleteFromDocument')
   void deleteFromDocument() native "DOMSelection_deleteFromDocument_Callback";
 
-
-  /** @domName DOMSelection.empty */
+  @DocsEditable
+  @DomName('DOMSelection.empty')
   void empty() native "DOMSelection_empty_Callback";
 
-
-  /** @domName DOMSelection.extend */
+  @DocsEditable
+  @DomName('DOMSelection.extend')
   void extend(Node node, int offset) native "DOMSelection_extend_Callback";
 
-
-  /** @domName DOMSelection.getRangeAt */
+  @DocsEditable
+  @DomName('DOMSelection.getRangeAt')
   Range getRangeAt(int index) native "DOMSelection_getRangeAt_Callback";
 
-
-  /** @domName DOMSelection.modify */
+  @DocsEditable
+  @DomName('DOMSelection.modify')
   void modify(String alter, String direction, String granularity) native "DOMSelection_modify_Callback";
 
-
-  /** @domName DOMSelection.removeAllRanges */
+  @DocsEditable
+  @DomName('DOMSelection.removeAllRanges')
   void removeAllRanges() native "DOMSelection_removeAllRanges_Callback";
 
-
-  /** @domName DOMSelection.selectAllChildren */
+  @DocsEditable
+  @DomName('DOMSelection.selectAllChildren')
   void selectAllChildren(Node node) native "DOMSelection_selectAllChildren_Callback";
 
-
-  /** @domName DOMSelection.setBaseAndExtent */
+  @DocsEditable
+  @DomName('DOMSelection.setBaseAndExtent')
   void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) native "DOMSelection_setBaseAndExtent_Callback";
 
-
-  /** @domName DOMSelection.setPosition */
+  @DocsEditable
+  @DomName('DOMSelection.setPosition')
   void setPosition(Node node, int offset) native "DOMSelection_setPosition_Callback";
 
-
-  /** @domName DOMSelection.toString */
+  @DocsEditable
+  @DomName('DOMSelection.toString')
   String toString() native "DOMSelection_toString_Callback";
 
 }
@@ -8395,16 +8190,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DOMSettableTokenList
+@DocsEditable
+@DomName('DOMSettableTokenList')
 class DomSettableTokenList extends DomTokenList {
   DomSettableTokenList.internal() : super.internal();
 
-
-  /** @domName DOMSettableTokenList.value */
+  @DocsEditable
+  @DomName('DOMSettableTokenList.value')
   String get value native "DOMSettableTokenList_value_Getter";
 
-
-  /** @domName DOMSettableTokenList.value */
+  @DocsEditable
+  @DomName('DOMSettableTokenList.value')
   void set value(String value) native "DOMSettableTokenList_value_Setter";
 
 }
@@ -8415,12 +8211,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DOMStringList
+@DocsEditable
+@DomName('DOMStringList')
 class DomStringList extends NativeFieldWrapperClass1 implements List<String> {
   DomStringList.internal();
 
-
-  /** @domName DOMStringList.length */
+  @DocsEditable
+  @DomName('DOMStringList.length')
   int get length native "DOMStringList_length_Getter";
 
   String operator[](int index) native "DOMStringList_item_Callback";
@@ -8441,50 +8238,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, String)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
   // contains() defined by IDL.
 
-  void forEach(void f(String element)) => Collections.forEach(this, f);
+  void forEach(void f(String element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(String element)) => new MappedList<String, dynamic>(this, f);
+  List mappedBy(f(String element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<String> where(bool f(String element)) => new WhereIterable<String>(this, f);
+  Iterable<String> where(bool f(String element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(String element)) => Collections.every(this, f);
+  bool every(bool f(String element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(String element)) => Collections.any(this, f);
+  bool any(bool f(String element)) => IterableMixinWorkaround.any(this, f);
 
   List<String> toList() => new List<String>.from(this);
   Set<String> toSet() => new Set<String>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<String> take(int n) => new ListView<String>(this, 0, n);
+  List<String> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<String> takeWhile(bool test(String value)) {
-    return new TakeWhileIterable<String>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<String> skip(int n) => new ListView<String>(this, n, null);
+  List<String> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<String> skipWhile(bool test(String value)) {
-    return new SkipWhileIterable<String>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   String firstMatching(bool test(String value), { String orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   String lastMatching(bool test(String value), {String orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   String singleMatching(bool test(String value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   String elementAt(int index) {
@@ -8542,16 +8339,36 @@
     throw new StateError("More than one element");
   }
 
-  String min([int compare(String a, String b)]) => Collections.min(this, compare);
+  String min([int compare(String a, String b)]) => IterableMixinWorkaround.min(this, compare);
 
-  String max([int compare(String a, String b)]) => Collections.max(this, compare);
+  String max([int compare(String a, String b)]) => IterableMixinWorkaround.max(this, compare);
 
   String removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   String removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(String element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(String element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<String> from, [int startFrom]) {
@@ -8571,12 +8388,12 @@
 
   // -- end List<String> mixins.
 
-
-  /** @domName DOMStringList.contains */
+  @DocsEditable
+  @DomName('DOMStringList.contains')
   bool contains(String string) native "DOMStringList_contains_Callback";
 
-
-  /** @domName DOMStringList.item */
+  @DocsEditable
+  @DomName('DOMStringList.item')
   String item(int index) native "DOMStringList_item_Callback";
 
 }
@@ -8587,7 +8404,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DOMStringMap
+@DocsEditable
+@DomName('DOMStringMap')
 class DomStringMap extends NativeFieldWrapperClass1 {
   DomStringMap.internal();
 
@@ -8599,39 +8417,40 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DOMTokenList
+@DocsEditable
+@DomName('DOMTokenList')
 class DomTokenList extends NativeFieldWrapperClass1 {
   DomTokenList.internal();
 
-
-  /** @domName DOMTokenList.length */
+  @DocsEditable
+  @DomName('DOMTokenList.length')
   int get length native "DOMTokenList_length_Getter";
 
-
-  /** @domName DOMTokenList.contains */
+  @DocsEditable
+  @DomName('DOMTokenList.contains')
   bool contains(String token) native "DOMTokenList_contains_Callback";
 
-
-  /** @domName DOMTokenList.item */
+  @DocsEditable
+  @DomName('DOMTokenList.item')
   String item(int index) native "DOMTokenList_item_Callback";
 
-
-  /** @domName DOMTokenList.toString */
+  @DocsEditable
+  @DomName('DOMTokenList.toString')
   String toString() native "DOMTokenList_toString_Callback";
 
-  bool toggle(/*DOMString*/ token, [/*boolean*/ force]) {
+  bool toggle(String token, [bool force]) {
     if (?force) {
       return _toggle_1(token, force);
     }
     return _toggle_2(token);
   }
 
-
-  /** @domName DOMTokenList.toggle_1 */
+  @DocsEditable
+  @DomName('DOMTokenList.toggle_1')
   bool _toggle_1(token, force) native "DOMTokenList_toggle_1_Callback";
 
-
-  /** @domName DOMTokenList.toggle_2 */
+  @DocsEditable
+  @DomName('DOMTokenList.toggle_2')
   bool _toggle_2(token) native "DOMTokenList_toggle_2_Callback";
 
 }
@@ -8694,46 +8513,47 @@
   }
 
   String join([String separator]) {
-    return Collections.joinList(this, separator);
+    return IterableMixinWorkaround.joinList(this, separator);
   }
 
   List mappedBy(f(Element element)) {
-    return new MappedList<Element, dynamic>(this, f);
+    return IterableMixinWorkaround.mappedByList(this, f);
   }
 
-  Iterable<Element> where(bool f(Element element))
-      => new WhereIterable(this, f);
+  Iterable<Element> where(bool f(Element element)) {
+    return IterableMixinWorkaround.where(this, f);
+  }
 
   bool get isEmpty {
     return _element.$dom_firstElementChild == null;
   }
 
   List<Element> take(int n) {
-    return new ListView<Element>(this, 0, n);
+    return IterableMixinWorkaround.takeList(this, n);
   }
 
   Iterable<Element> takeWhile(bool test(Element value)) {
-    return new TakeWhileIterable<Element>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
   List<Element> skip(int n) {
-    return new ListView<Element>(this, n, null);
+    return IterableMixinWorkaround.skipList(this, n);
   }
 
   Iterable<Element> skipWhile(bool test(Element value)) {
-    return new SkipWhileIterable<Element>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Element firstMatching(bool test(Element value), {Element orElse()}) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Element lastMatching(bool test(Element value), {Element orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Element singleMatching(bool test(Element value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Element elementAt(int index) {
@@ -8752,10 +8572,10 @@
     _element.$dom_replaceChild(value, _childElements[index]);
   }
 
-   void set length(int newLength) {
-     // TODO(jacobr): remove children when length is reduced.
-     throw new UnsupportedError('');
-   }
+  void set length(int newLength) {
+    // TODO(jacobr): remove children when length is reduced.
+    throw new UnsupportedError('');
+  }
 
   Element add(Element value) {
     _element.$dom_appendChild(value);
@@ -8778,13 +8598,38 @@
 
   dynamic reduce(dynamic initialValue,
       dynamic combine(dynamic previousValue, Element element)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
   void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
     throw new UnimplementedError();
   }
 
+  void remove(Object object) {
+    if (object is Element) {
+      Element element = object;
+      if (identical(element.parentNode, this)) {
+        _element.$dom_removeChild(element);
+      }
+    }
+  }
+
+  void removeAll(Iterable elements) {
+    Collections.removeAll(this, elements);
+  }
+
+  void retainAll(Iterable elements) {
+    Collections.retainAll(this, elements);
+  }
+
+  void removeMatching(bool test(Element element)) {
+    Collections.removeMatching(this, test);
+  }
+
+  void retainMatching(bool test(Element element)) {
+    Collections.retainMatching(this, test);
+  }
+
   void removeRange(int start, int rangeLength) {
     throw new UnimplementedError();
   }
@@ -8846,11 +8691,11 @@
   }
 
   Element min([int compare(Element a, Element b)]) {
-    return Collections.min(this, compare);
+    return IterableMixinWorkaround.min(this, compare);
   }
 
   Element max([int compare(Element a, Element b)]) {
-    return Collections.max(this, compare);
+    return IterableMixinWorkaround.max(this, compare);
   }
 }
 
@@ -8877,15 +8722,16 @@
   }
 
   String join([String separator]) {
-    return Collections.joinList(this, separator);
+    return IterableMixinWorkaround.joinList(this, separator);
   }
 
   List mappedBy(f(Element element)) {
-    return new MappedList<Element, dynamic>(this, f);
+    return IterableMixinWorkaround.mappedByList(this, f);
   }
 
-  Iterable<Element> where(bool f(Element element))
-      => new WhereIterable(this, f);
+  Iterable<Element> where(bool f(Element element)) {
+    return IterableMixinWorkaround.where(this, f);
+  }
 
   bool every(bool f(Element element)) {
     for(Element element in this) {
@@ -8909,31 +8755,31 @@
   Set<Element> toSet() => new Set<Element>.from(this);
 
   List<Element> take(int n) {
-    return new ListView<Element>(this, 0, n);
+    return IterableMixinWorkaround.takeList(this, n);
   }
 
   Iterable<Element> takeWhile(bool test(Element value)) {
-    return new TakeWhileIterable<Element>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
   List<Element> skip(int n) {
-    return new ListView<Element>(this, n, null);
+    return IterableMixinWorkaround.skipList(this, n);
   }
 
   Iterable<Element> skipWhile(bool test(Element value)) {
-    return new SkipWhileIterable<Element>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Element firstMatching(bool test(Element value), {Element orElse()}) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Element lastMatching(bool test(Element value), {Element orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Element singleMatching(bool test(Element value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Element elementAt(int index) {
@@ -8974,7 +8820,7 @@
 
   dynamic reduce(dynamic initialValue,
       dynamic combine(dynamic previousValue, Element element)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
   void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
@@ -9010,6 +8856,26 @@
     throw new UnsupportedError('');
   }
 
+  void remove(Object element) {
+    throw new UnsupportedError('');
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError('');
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError('');
+  }
+
+  void removeMatching(bool test(Element element)) {
+    throw new UnsupportedError('');
+  }
+
+  void retainMatching(bool test(Element element)) {
+    throw new UnsupportedError('');
+  }
+
   Element get first => _nodeList.first;
 
   Element get last => _nodeList.last;
@@ -9017,11 +8883,11 @@
   Element get single => _nodeList.single;
 
   Element min([int compare(Element a, Element b)]) {
-    return Collections.min(this, compare);
+    return IterableMixinWorkaround.min(this, compare);
   }
 
   Element max([int compare(Element a, Element b)]) {
-    return Collections.max(this, compare);
+    return IterableMixinWorkaround.max(this, compare);
   }
 }
 
@@ -9458,250 +9324,232 @@
 
   static const EventStreamProvider<Event> fullscreenErrorEvent = const EventStreamProvider<Event>('webkitfullscreenerror');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   ElementEvents get on =>
     new ElementEvents(this);
 
-  /// @domName HTMLElement.children; @docsEditable true
   HtmlCollection get $dom_children;
 
-  /// @domName HTMLElement.contentEditable; @docsEditable true
   String contentEditable;
 
-  /// @domName HTMLElement.dir; @docsEditable true
   String dir;
 
-  /// @domName HTMLElement.draggable; @docsEditable true
   bool draggable;
 
-  /// @domName HTMLElement.hidden; @docsEditable true
   bool hidden;
 
-  /// @domName HTMLElement.id; @docsEditable true
   String id;
 
-  /// @domName HTMLElement.innerHTML; @docsEditable true
   String innerHtml;
 
-  /// @domName HTMLElement.isContentEditable; @docsEditable true
   bool get isContentEditable;
 
-  /// @domName HTMLElement.lang; @docsEditable true
   String lang;
 
-  /// @domName HTMLElement.outerHTML; @docsEditable true
   String get outerHtml;
 
-  /// @domName HTMLElement.spellcheck; @docsEditable true
   bool spellcheck;
 
-  /// @domName HTMLElement.tabIndex; @docsEditable true
   int tabIndex;
 
-  /// @domName HTMLElement.title; @docsEditable true
   String title;
 
-  /// @domName HTMLElement.translate; @docsEditable true
   bool translate;
 
-  /// @domName HTMLElement.webkitdropzone; @docsEditable true
   String webkitdropzone;
 
-  /// @domName HTMLElement.click; @docsEditable true
   void click();
 
-  /// @domName HTMLElement.insertAdjacentElement; @docsEditable true
   Element insertAdjacentElement(String where, Element element);
 
-  /// @domName HTMLElement.insertAdjacentHTML; @docsEditable true
   void insertAdjacentHtml(String where, String html);
 
-  /// @domName HTMLElement.insertAdjacentText; @docsEditable true
   void insertAdjacentText(String where, String text);
 
   static const int ALLOW_KEYBOARD_INPUT = 1;
 
-
-  /** @domName Element.childElementCount */
+  @DocsEditable
+  @DomName('Element.childElementCount')
   int get $dom_childElementCount native "Element_childElementCount_Getter";
 
-
-  /** @domName Element.className */
+  @DocsEditable
+  @DomName('Element.className')
   String get $dom_className native "Element_className_Getter";
 
-
-  /** @domName Element.className */
+  @DocsEditable
+  @DomName('Element.className')
   void set $dom_className(String value) native "Element_className_Setter";
 
-
-  /** @domName Element.clientHeight */
+  @DocsEditable
+  @DomName('Element.clientHeight')
   int get clientHeight native "Element_clientHeight_Getter";
 
-
-  /** @domName Element.clientLeft */
+  @DocsEditable
+  @DomName('Element.clientLeft')
   int get clientLeft native "Element_clientLeft_Getter";
 
-
-  /** @domName Element.clientTop */
+  @DocsEditable
+  @DomName('Element.clientTop')
   int get clientTop native "Element_clientTop_Getter";
 
-
-  /** @domName Element.clientWidth */
+  @DocsEditable
+  @DomName('Element.clientWidth')
   int get clientWidth native "Element_clientWidth_Getter";
 
-
-  /** @domName Element.dataset */
+  @DocsEditable
+  @DomName('Element.dataset')
   Map<String, String> get dataset native "Element_dataset_Getter";
 
-
-  /** @domName Element.firstElementChild */
+  @DocsEditable
+  @DomName('Element.firstElementChild')
   Element get $dom_firstElementChild native "Element_firstElementChild_Getter";
 
-
-  /** @domName Element.lastElementChild */
+  @DocsEditable
+  @DomName('Element.lastElementChild')
   Element get $dom_lastElementChild native "Element_lastElementChild_Getter";
 
-
-  /** @domName Element.nextElementSibling */
+  @DocsEditable
+  @DomName('Element.nextElementSibling')
   Element get nextElementSibling native "Element_nextElementSibling_Getter";
 
-
-  /** @domName Element.offsetHeight */
+  @DocsEditable
+  @DomName('Element.offsetHeight')
   int get offsetHeight native "Element_offsetHeight_Getter";
 
-
-  /** @domName Element.offsetLeft */
+  @DocsEditable
+  @DomName('Element.offsetLeft')
   int get offsetLeft native "Element_offsetLeft_Getter";
 
-
-  /** @domName Element.offsetParent */
+  @DocsEditable
+  @DomName('Element.offsetParent')
   Element get offsetParent native "Element_offsetParent_Getter";
 
-
-  /** @domName Element.offsetTop */
+  @DocsEditable
+  @DomName('Element.offsetTop')
   int get offsetTop native "Element_offsetTop_Getter";
 
-
-  /** @domName Element.offsetWidth */
+  @DocsEditable
+  @DomName('Element.offsetWidth')
   int get offsetWidth native "Element_offsetWidth_Getter";
 
-
-  /** @domName Element.previousElementSibling */
+  @DocsEditable
+  @DomName('Element.previousElementSibling')
   Element get previousElementSibling native "Element_previousElementSibling_Getter";
 
-
-  /** @domName Element.scrollHeight */
+  @DocsEditable
+  @DomName('Element.scrollHeight')
   int get scrollHeight native "Element_scrollHeight_Getter";
 
-
-  /** @domName Element.scrollLeft */
+  @DocsEditable
+  @DomName('Element.scrollLeft')
   int get scrollLeft native "Element_scrollLeft_Getter";
 
-
-  /** @domName Element.scrollLeft */
+  @DocsEditable
+  @DomName('Element.scrollLeft')
   void set scrollLeft(int value) native "Element_scrollLeft_Setter";
 
-
-  /** @domName Element.scrollTop */
+  @DocsEditable
+  @DomName('Element.scrollTop')
   int get scrollTop native "Element_scrollTop_Getter";
 
-
-  /** @domName Element.scrollTop */
+  @DocsEditable
+  @DomName('Element.scrollTop')
   void set scrollTop(int value) native "Element_scrollTop_Setter";
 
-
-  /** @domName Element.scrollWidth */
+  @DocsEditable
+  @DomName('Element.scrollWidth')
   int get scrollWidth native "Element_scrollWidth_Getter";
 
-
-  /** @domName Element.style */
+  @DocsEditable
+  @DomName('Element.style')
   CssStyleDeclaration get style native "Element_style_Getter";
 
-
-  /** @domName Element.tagName */
+  @DocsEditable
+  @DomName('Element.tagName')
   String get tagName native "Element_tagName_Getter";
 
-
-  /** @domName Element.webkitPseudo */
+  @DocsEditable
+  @DomName('Element.webkitPseudo')
   String get webkitPseudo native "Element_webkitPseudo_Getter";
 
-
-  /** @domName Element.webkitPseudo */
+  @DocsEditable
+  @DomName('Element.webkitPseudo')
   void set webkitPseudo(String value) native "Element_webkitPseudo_Setter";
 
-
-  /** @domName Element.webkitShadowRoot */
+  @DocsEditable
+  @DomName('Element.webkitShadowRoot')
   ShadowRoot get webkitShadowRoot native "Element_webkitShadowRoot_Getter";
 
-
-  /** @domName Element.blur */
+  @DocsEditable
+  @DomName('Element.blur')
   void blur() native "Element_blur_Callback";
 
-
-  /** @domName Element.focus */
+  @DocsEditable
+  @DomName('Element.focus')
   void focus() native "Element_focus_Callback";
 
-
-  /** @domName Element.getAttribute */
+  @DocsEditable
+  @DomName('Element.getAttribute')
   String $dom_getAttribute(String name) native "Element_getAttribute_Callback";
 
-
-  /** @domName Element.getAttributeNS */
+  @DocsEditable
+  @DomName('Element.getAttributeNS')
   String $dom_getAttributeNS(String namespaceURI, String localName) native "Element_getAttributeNS_Callback";
 
-
-  /** @domName Element.getBoundingClientRect */
+  @DocsEditable
+  @DomName('Element.getBoundingClientRect')
   ClientRect getBoundingClientRect() native "Element_getBoundingClientRect_Callback";
 
-
-  /** @domName Element.getClientRects */
+  @DocsEditable
+  @DomName('Element.getClientRects')
   List<ClientRect> getClientRects() native "Element_getClientRects_Callback";
 
-
-  /** @domName Element.getElementsByClassName */
+  @DocsEditable
+  @DomName('Element.getElementsByClassName')
   List<Node> $dom_getElementsByClassName(String name) native "Element_getElementsByClassName_Callback";
 
-
-  /** @domName Element.getElementsByTagName */
+  @DocsEditable
+  @DomName('Element.getElementsByTagName')
   List<Node> $dom_getElementsByTagName(String name) native "Element_getElementsByTagName_Callback";
 
-
-  /** @domName Element.hasAttribute */
+  @DocsEditable
+  @DomName('Element.hasAttribute')
   bool $dom_hasAttribute(String name) native "Element_hasAttribute_Callback";
 
-
-  /** @domName Element.hasAttributeNS */
+  @DocsEditable
+  @DomName('Element.hasAttributeNS')
   bool $dom_hasAttributeNS(String namespaceURI, String localName) native "Element_hasAttributeNS_Callback";
 
-
-  /** @domName Element.querySelector */
+  @DocsEditable
+  @DomName('Element.querySelector')
   Element $dom_querySelector(String selectors) native "Element_querySelector_Callback";
 
-
-  /** @domName Element.querySelectorAll */
+  @DocsEditable
+  @DomName('Element.querySelectorAll')
   List<Node> $dom_querySelectorAll(String selectors) native "Element_querySelectorAll_Callback";
 
-
-  /** @domName Element.remove */
+  @DocsEditable
+  @DomName('Element.remove')
   void remove() native "Element_remove_Callback";
 
-
-  /** @domName Element.removeAttribute */
+  @DocsEditable
+  @DomName('Element.removeAttribute')
   void $dom_removeAttribute(String name) native "Element_removeAttribute_Callback";
 
-
-  /** @domName Element.removeAttributeNS */
+  @DocsEditable
+  @DomName('Element.removeAttributeNS')
   void $dom_removeAttributeNS(String namespaceURI, String localName) native "Element_removeAttributeNS_Callback";
 
-
-  /** @domName Element.scrollByLines */
+  @DocsEditable
+  @DomName('Element.scrollByLines')
   void scrollByLines(int lines) native "Element_scrollByLines_Callback";
 
-
-  /** @domName Element.scrollByPages */
+  @DocsEditable
+  @DomName('Element.scrollByPages')
   void scrollByPages(int pages) native "Element_scrollByPages_Callback";
 
-  void scrollIntoView([/*boolean*/ centerIfNeeded]) {
+  void scrollIntoView([bool centerIfNeeded]) {
     if (?centerIfNeeded) {
       _scrollIntoViewIfNeeded_1(centerIfNeeded);
       return;
@@ -9709,42 +9557,42 @@
     _scrollIntoViewIfNeeded_2();
   }
 
-
-  /** @domName Element.scrollIntoViewIfNeeded_1 */
+  @DocsEditable
+  @DomName('Element.scrollIntoViewIfNeeded_1')
   void _scrollIntoViewIfNeeded_1(centerIfNeeded) native "Element_scrollIntoViewIfNeeded_1_Callback";
 
-
-  /** @domName Element.scrollIntoViewIfNeeded_2 */
+  @DocsEditable
+  @DomName('Element.scrollIntoViewIfNeeded_2')
   void _scrollIntoViewIfNeeded_2() native "Element_scrollIntoViewIfNeeded_2_Callback";
 
-
-  /** @domName Element.setAttribute */
+  @DocsEditable
+  @DomName('Element.setAttribute')
   void $dom_setAttribute(String name, String value) native "Element_setAttribute_Callback";
 
-
-  /** @domName Element.setAttributeNS */
+  @DocsEditable
+  @DomName('Element.setAttributeNS')
   void $dom_setAttributeNS(String namespaceURI, String qualifiedName, String value) native "Element_setAttributeNS_Callback";
 
-
-  /** @domName Element.webkitCreateShadowRoot */
+  @DocsEditable
+  @DomName('Element.webkitCreateShadowRoot')
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
   @Experimental()
   ShadowRoot createShadowRoot() native "Element_webkitCreateShadowRoot_Callback";
 
-
-  /** @domName Element.webkitMatchesSelector */
+  @DocsEditable
+  @DomName('Element.webkitMatchesSelector')
   bool matches(String selectors) native "Element_webkitMatchesSelector_Callback";
 
-
-  /** @domName Element.webkitRequestFullScreen */
+  @DocsEditable
+  @DomName('Element.webkitRequestFullScreen')
   void webkitRequestFullScreen(int flags) native "Element_webkitRequestFullScreen_Callback";
 
-
-  /** @domName Element.webkitRequestFullscreen */
+  @DocsEditable
+  @DomName('Element.webkitRequestFullscreen')
   void webkitRequestFullscreen() native "Element_webkitRequestFullscreen_Callback";
 
-
-  /** @domName Element.webkitRequestPointerLock */
+  @DocsEditable
+  @DomName('Element.webkitRequestPointerLock')
   void webkitRequestPointerLock() native "Element_webkitRequestPointerLock_Callback";
 
   Stream<Event> get onAbort => abortEvent.forTarget(this);
@@ -9847,11 +9695,12 @@
 
 final _START_TAG_REGEXP = new RegExp('<(\\w+)');
 class _ElementFactoryProvider {
-  static final _CUSTOM_PARENT_TAG_MAP = const {
+  static const _CUSTOM_PARENT_TAG_MAP = const {
     'body' : 'html',
     'head' : 'html',
     'caption' : 'table',
     'td': 'tr',
+    'th': 'tr',
     'colgroup': 'table',
     'col' : 'colgroup',
     'tr' : 'tbody',
@@ -9861,7 +9710,20 @@
     'track' : 'audio',
   };
 
-  /** @domName Document.createElement */
+  // TODO(jmesserly): const set would be better
+  static const _TABLE_TAGS = const {
+    'caption': null,
+    'col': null,
+    'colgroup': null,
+    'tbody': null,
+    'td': null,
+    'tfoot': null,
+    'th': null,
+    'thead': null,
+    'tr': null,
+  };
+
+  @DomName('Document.createElement')
   static Element createElement_html(String html) {
     // TODO(jacobr): this method can be made more robust and performant.
     // 1) Cache the dummy parent elements required to use innerHTML rather than
@@ -9874,181 +9736,241 @@
     final match = _START_TAG_REGEXP.firstMatch(html);
     if (match != null) {
       tag = match.group(1).toLowerCase();
-      if (_CUSTOM_PARENT_TAG_MAP.containsKey(tag)) {
-        parentTag = _CUSTOM_PARENT_TAG_MAP[tag];
+      if (_Device.isIE && _TABLE_TAGS.containsKey(tag)) {
+        return _createTableForIE(html, tag);
       }
+      parentTag = _CUSTOM_PARENT_TAG_MAP[tag];
+      if (parentTag == null) parentTag = 'div';
     }
-    final Element temp = new Element.tag(parentTag);
+
+    final temp = new Element.tag(parentTag);
     temp.innerHtml = html;
 
     Element element;
     if (temp.children.length == 1) {
       element = temp.children[0];
     } else if (parentTag == 'html' && temp.children.length == 2) {
-      // Work around for edge case in WebKit and possibly other browsers where
-      // both body and head elements are created even though the inner html
-      // only contains a head or body element.
+      // In html5 the root <html> tag will always have a <body> and a <head>,
+      // even though the inner html only contains one of them.
       element = temp.children[tag == 'head' ? 0 : 1];
     } else {
-      throw new ArgumentError('HTML had ${temp.children.length} '
-          'top level elements but 1 expected');
+      _singleNode(temp.children);
     }
     element.remove();
     return element;
   }
 
-  /** @domName Document.createElement */
+  /**
+   * IE table elements don't support innerHTML (even in standards mode).
+   * Instead we use a div and inject the table element in the innerHtml string.
+   * This technique works on other browsers too, but it's probably slower,
+   * so we only use it when running on IE.
+   *
+   * See also innerHTML:
+   * <http://msdn.microsoft.com/en-us/library/ie/ms533897(v=vs.85).aspx>
+   * and Building Tables Dynamically:
+   * <http://msdn.microsoft.com/en-us/library/ie/ms532998(v=vs.85).aspx>.
+   */
+  static Element _createTableForIE(String html, String tag) {
+    var div = new Element.tag('div');
+    div.innerHtml = '<table>$html</table>';
+    var table = _singleNode(div.children);
+    Element element;
+    switch (tag) {
+      case 'td':
+      case 'th':
+        element = _singleNode(_singleNode(table.rows).cells);
+        break;
+      case 'tr':
+        element = _singleNode(table.rows);
+        break;
+      case 'tbody':
+        element = _singleNode(table.tBodies);
+        break;
+      case 'thead':
+        element = table.tHead;
+        break;
+      case 'tfoot':
+        element = table.tFoot;
+        break;
+      case 'caption':
+        element = table.caption;
+        break;
+      case 'colgroup':
+        element = _getColgroup(table);
+        break;
+      case 'col':
+        element = _singleNode(_getColgroup(table).children);
+        break;
+    }
+    element.remove();
+    return element;
+  }
+
+  static TableColElement _getColgroup(TableElement table) {
+    // TODO(jmesserly): is there a better way to do this?
+    return _singleNode(table.children.where((n) => n.tagName == 'COLGROUP')
+        .toList());
+  }
+
+  static Node _singleNode(List<Node> list) {
+    if (list.length == 1) return list[0];
+    throw new ArgumentError('HTML had ${list.length} '
+        'top level elements but 1 expected');
+  }
+
+  @DomName('Document.createElement')
   static Element createElement_tag(String tag) =>
       document.$dom_createElement(tag);
 }
 
-/// @docsEditable true
+@DocsEditable
 class ElementEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   ElementEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get beforeCopy => this['beforecopy'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get beforeCut => this['beforecut'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get beforePaste => this['beforepaste'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get blur => this['blur'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get change => this['change'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get click => this['click'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get contextMenu => this['contextmenu'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get copy => this['copy'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get cut => this['cut'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get doubleClick => this['dblclick'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get drag => this['drag'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragEnd => this['dragend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragEnter => this['dragenter'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragLeave => this['dragleave'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragOver => this['dragover'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragStart => this['dragstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get drop => this['drop'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get focus => this['focus'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get input => this['input'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get invalid => this['invalid'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyDown => this['keydown'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyPress => this['keypress'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyUp => this['keyup'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get load => this['load'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseDown => this['mousedown'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseMove => this['mousemove'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseOut => this['mouseout'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseOver => this['mouseover'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseUp => this['mouseup'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseWheel => this['mousewheel'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get paste => this['paste'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get reset => this['reset'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get scroll => this['scroll'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get search => this['search'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get select => this['select'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get selectStart => this['selectstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get submit => this['submit'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchCancel => this['touchcancel'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchEnd => this['touchend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchEnter => this['touchenter'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchLeave => this['touchleave'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchMove => this['touchmove'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchStart => this['touchstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get transitionEnd => this['webkitTransitionEnd'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get fullscreenChange => this['webkitfullscreenchange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get fullscreenError => this['webkitfullscreenerror'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10058,28 +9980,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ElementTraversal
+@DocsEditable
+@DomName('ElementTraversal')
 class ElementTraversal extends NativeFieldWrapperClass1 {
   ElementTraversal.internal();
 
-
-  /** @domName ElementTraversal.childElementCount */
+  @DocsEditable
+  @DomName('ElementTraversal.childElementCount')
   int get $dom_childElementCount native "ElementTraversal_childElementCount_Getter";
 
-
-  /** @domName ElementTraversal.firstElementChild */
+  @DocsEditable
+  @DomName('ElementTraversal.firstElementChild')
   Element get $dom_firstElementChild native "ElementTraversal_firstElementChild_Getter";
 
-
-  /** @domName ElementTraversal.lastElementChild */
+  @DocsEditable
+  @DomName('ElementTraversal.lastElementChild')
   Element get $dom_lastElementChild native "ElementTraversal_lastElementChild_Getter";
 
-
-  /** @domName ElementTraversal.nextElementSibling */
+  @DocsEditable
+  @DomName('ElementTraversal.nextElementSibling')
   Element get nextElementSibling native "ElementTraversal_nextElementSibling_Getter";
 
-
-  /** @domName ElementTraversal.previousElementSibling */
+  @DocsEditable
+  @DomName('ElementTraversal.previousElementSibling')
   Element get previousElementSibling native "ElementTraversal_previousElementSibling_Getter";
 
 }
@@ -10090,65 +10013,66 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLEmbedElement
+@DocsEditable
+@DomName('HTMLEmbedElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 class EmbedElement extends _Element_Merged {
   EmbedElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory EmbedElement() => document.$dom_createElement("embed");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-
-  /** @domName HTMLEmbedElement.align */
+  @DocsEditable
+  @DomName('HTMLEmbedElement.align')
   String get align native "HTMLEmbedElement_align_Getter";
 
-
-  /** @domName HTMLEmbedElement.align */
+  @DocsEditable
+  @DomName('HTMLEmbedElement.align')
   void set align(String value) native "HTMLEmbedElement_align_Setter";
 
-
-  /** @domName HTMLEmbedElement.height */
+  @DocsEditable
+  @DomName('HTMLEmbedElement.height')
   String get height native "HTMLEmbedElement_height_Getter";
 
-
-  /** @domName HTMLEmbedElement.height */
+  @DocsEditable
+  @DomName('HTMLEmbedElement.height')
   void set height(String value) native "HTMLEmbedElement_height_Setter";
 
-
-  /** @domName HTMLEmbedElement.name */
+  @DocsEditable
+  @DomName('HTMLEmbedElement.name')
   String get name native "HTMLEmbedElement_name_Getter";
 
-
-  /** @domName HTMLEmbedElement.name */
+  @DocsEditable
+  @DomName('HTMLEmbedElement.name')
   void set name(String value) native "HTMLEmbedElement_name_Setter";
 
-
-  /** @domName HTMLEmbedElement.src */
+  @DocsEditable
+  @DomName('HTMLEmbedElement.src')
   String get src native "HTMLEmbedElement_src_Getter";
 
-
-  /** @domName HTMLEmbedElement.src */
+  @DocsEditable
+  @DomName('HTMLEmbedElement.src')
   void set src(String value) native "HTMLEmbedElement_src_Setter";
 
-
-  /** @domName HTMLEmbedElement.type */
+  @DocsEditable
+  @DomName('HTMLEmbedElement.type')
   String get type native "HTMLEmbedElement_type_Getter";
 
-
-  /** @domName HTMLEmbedElement.type */
+  @DocsEditable
+  @DomName('HTMLEmbedElement.type')
   void set type(String value) native "HTMLEmbedElement_type_Setter";
 
-
-  /** @domName HTMLEmbedElement.width */
+  @DocsEditable
+  @DomName('HTMLEmbedElement.width')
   String get width native "HTMLEmbedElement_width_Getter";
 
-
-  /** @domName HTMLEmbedElement.width */
+  @DocsEditable
+  @DomName('HTMLEmbedElement.width')
   void set width(String value) native "HTMLEmbedElement_width_Setter";
 
 }
@@ -10159,7 +10083,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName EntityReference
+@DocsEditable
+@DomName('EntityReference')
 class EntityReference extends Node {
   EntityReference.internal() : super.internal();
 
@@ -10179,31 +10104,32 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Entry
+@DocsEditable
+@DomName('Entry')
 class Entry extends NativeFieldWrapperClass1 {
   Entry.internal();
 
-
-  /** @domName Entry.filesystem */
+  @DocsEditable
+  @DomName('Entry.filesystem')
   FileSystem get filesystem native "Entry_filesystem_Getter";
 
-
-  /** @domName Entry.fullPath */
+  @DocsEditable
+  @DomName('Entry.fullPath')
   String get fullPath native "Entry_fullPath_Getter";
 
-
-  /** @domName Entry.isDirectory */
+  @DocsEditable
+  @DomName('Entry.isDirectory')
   bool get isDirectory native "Entry_isDirectory_Getter";
 
-
-  /** @domName Entry.isFile */
+  @DocsEditable
+  @DomName('Entry.isFile')
   bool get isFile native "Entry_isFile_Getter";
 
-
-  /** @domName Entry.name */
+  @DocsEditable
+  @DomName('Entry.name')
   String get name native "Entry_name_Getter";
 
-  void copyTo(/*DirectoryEntry*/ parent, [/*DOMString*/ name, /*EntryCallback*/ successCallback, /*ErrorCallback*/ errorCallback]) {
+  void copyTo(DirectoryEntry parent, [String name, EntryCallback successCallback, ErrorCallback errorCallback]) {
     if (?name) {
       _copyTo_1(parent, name, successCallback, errorCallback);
       return;
@@ -10211,23 +10137,23 @@
     _copyTo_2(parent);
   }
 
-
-  /** @domName Entry.copyTo_1 */
+  @DocsEditable
+  @DomName('Entry.copyTo_1')
   void _copyTo_1(parent, name, successCallback, errorCallback) native "Entry_copyTo_1_Callback";
 
-
-  /** @domName Entry.copyTo_2 */
+  @DocsEditable
+  @DomName('Entry.copyTo_2')
   void _copyTo_2(parent) native "Entry_copyTo_2_Callback";
 
-
-  /** @domName Entry.getMetadata */
+  @DocsEditable
+  @DomName('Entry.getMetadata')
   void getMetadata(MetadataCallback successCallback, [ErrorCallback errorCallback]) native "Entry_getMetadata_Callback";
 
-
-  /** @domName Entry.getParent */
+  @DocsEditable
+  @DomName('Entry.getParent')
   void getParent([EntryCallback successCallback, ErrorCallback errorCallback]) native "Entry_getParent_Callback";
 
-  void moveTo(/*DirectoryEntry*/ parent, [/*DOMString*/ name, /*EntryCallback*/ successCallback, /*ErrorCallback*/ errorCallback]) {
+  void moveTo(DirectoryEntry parent, [String name, EntryCallback successCallback, ErrorCallback errorCallback]) {
     if (?name) {
       _moveTo_1(parent, name, successCallback, errorCallback);
       return;
@@ -10235,20 +10161,20 @@
     _moveTo_2(parent);
   }
 
-
-  /** @domName Entry.moveTo_1 */
+  @DocsEditable
+  @DomName('Entry.moveTo_1')
   void _moveTo_1(parent, name, successCallback, errorCallback) native "Entry_moveTo_1_Callback";
 
-
-  /** @domName Entry.moveTo_2 */
+  @DocsEditable
+  @DomName('Entry.moveTo_2')
   void _moveTo_2(parent) native "Entry_moveTo_2_Callback";
 
-
-  /** @domName Entry.remove */
+  @DocsEditable
+  @DomName('Entry.remove')
   void remove(VoidCallback successCallback, [ErrorCallback errorCallback]) native "Entry_remove_Callback";
 
-
-  /** @domName Entry.toURL */
+  @DocsEditable
+  @DomName('Entry.toURL')
   String toUrl() native "Entry_toURL_Callback";
 
 }
@@ -10267,52 +10193,53 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName EntrySync
+@DocsEditable
+@DomName('EntrySync')
 class EntrySync extends NativeFieldWrapperClass1 {
   EntrySync.internal();
 
-
-  /** @domName EntrySync.filesystem */
+  @DocsEditable
+  @DomName('EntrySync.filesystem')
   FileSystemSync get filesystem native "EntrySync_filesystem_Getter";
 
-
-  /** @domName EntrySync.fullPath */
+  @DocsEditable
+  @DomName('EntrySync.fullPath')
   String get fullPath native "EntrySync_fullPath_Getter";
 
-
-  /** @domName EntrySync.isDirectory */
+  @DocsEditable
+  @DomName('EntrySync.isDirectory')
   bool get isDirectory native "EntrySync_isDirectory_Getter";
 
-
-  /** @domName EntrySync.isFile */
+  @DocsEditable
+  @DomName('EntrySync.isFile')
   bool get isFile native "EntrySync_isFile_Getter";
 
-
-  /** @domName EntrySync.name */
+  @DocsEditable
+  @DomName('EntrySync.name')
   String get name native "EntrySync_name_Getter";
 
-
-  /** @domName EntrySync.copyTo */
+  @DocsEditable
+  @DomName('EntrySync.copyTo')
   EntrySync copyTo(DirectoryEntrySync parent, String name) native "EntrySync_copyTo_Callback";
 
-
-  /** @domName EntrySync.getMetadata */
+  @DocsEditable
+  @DomName('EntrySync.getMetadata')
   Metadata getMetadata() native "EntrySync_getMetadata_Callback";
 
-
-  /** @domName EntrySync.getParent */
+  @DocsEditable
+  @DomName('EntrySync.getParent')
   EntrySync getParent() native "EntrySync_getParent_Callback";
 
-
-  /** @domName EntrySync.moveTo */
+  @DocsEditable
+  @DomName('EntrySync.moveTo')
   EntrySync moveTo(DirectoryEntrySync parent, String name) native "EntrySync_moveTo_Callback";
 
-
-  /** @domName EntrySync.remove */
+  @DocsEditable
+  @DomName('EntrySync.remove')
   void remove() native "EntrySync_remove_Callback";
 
-
-  /** @domName EntrySync.toURL */
+  @DocsEditable
+  @DomName('EntrySync.toURL')
   String toUrl() native "EntrySync_toURL_Callback";
 
 }
@@ -10331,20 +10258,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ErrorEvent
+@DocsEditable
+@DomName('ErrorEvent')
 class ErrorEvent extends Event {
   ErrorEvent.internal() : super.internal();
 
-
-  /** @domName ErrorEvent.filename */
+  @DocsEditable
+  @DomName('ErrorEvent.filename')
   String get filename native "ErrorEvent_filename_Getter";
 
-
-  /** @domName ErrorEvent.lineno */
+  @DocsEditable
+  @DomName('ErrorEvent.lineno')
   int get lineno native "ErrorEvent_lineno_Getter";
 
-
-  /** @domName ErrorEvent.message */
+  @DocsEditable
+  @DomName('ErrorEvent.message')
   String get message native "ErrorEvent_message_Getter";
 
 }
@@ -10355,7 +10283,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Event
+@DocsEditable
+@DomName('Event')
 class Event extends NativeFieldWrapperClass1 {
   // In JS, canBubble and cancelable are technically required parameters to
   // init*Event. In practice, though, if they aren't provided they simply
@@ -10407,72 +10336,72 @@
 
   static const int SELECT = 16384;
 
-
-  /** @domName Event.bubbles */
+  @DocsEditable
+  @DomName('Event.bubbles')
   bool get bubbles native "Event_bubbles_Getter";
 
-
-  /** @domName Event.cancelBubble */
+  @DocsEditable
+  @DomName('Event.cancelBubble')
   bool get cancelBubble native "Event_cancelBubble_Getter";
 
-
-  /** @domName Event.cancelBubble */
+  @DocsEditable
+  @DomName('Event.cancelBubble')
   void set cancelBubble(bool value) native "Event_cancelBubble_Setter";
 
-
-  /** @domName Event.cancelable */
+  @DocsEditable
+  @DomName('Event.cancelable')
   bool get cancelable native "Event_cancelable_Getter";
 
-
-  /** @domName Event.clipboardData */
+  @DocsEditable
+  @DomName('Event.clipboardData')
   Clipboard get clipboardData native "Event_clipboardData_Getter";
 
-
-  /** @domName Event.currentTarget */
+  @DocsEditable
+  @DomName('Event.currentTarget')
   EventTarget get currentTarget native "Event_currentTarget_Getter";
 
-
-  /** @domName Event.defaultPrevented */
+  @DocsEditable
+  @DomName('Event.defaultPrevented')
   bool get defaultPrevented native "Event_defaultPrevented_Getter";
 
-
-  /** @domName Event.eventPhase */
+  @DocsEditable
+  @DomName('Event.eventPhase')
   int get eventPhase native "Event_eventPhase_Getter";
 
-
-  /** @domName Event.returnValue */
+  @DocsEditable
+  @DomName('Event.returnValue')
   bool get returnValue native "Event_returnValue_Getter";
 
-
-  /** @domName Event.returnValue */
+  @DocsEditable
+  @DomName('Event.returnValue')
   void set returnValue(bool value) native "Event_returnValue_Setter";
 
-
-  /** @domName Event.target */
+  @DocsEditable
+  @DomName('Event.target')
   EventTarget get target native "Event_target_Getter";
 
-
-  /** @domName Event.timeStamp */
+  @DocsEditable
+  @DomName('Event.timeStamp')
   int get timeStamp native "Event_timeStamp_Getter";
 
-
-  /** @domName Event.type */
+  @DocsEditable
+  @DomName('Event.type')
   String get type native "Event_type_Getter";
 
-
-  /** @domName Event.initEvent */
+  @DocsEditable
+  @DomName('Event.initEvent')
   void $dom_initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) native "Event_initEvent_Callback";
 
-
-  /** @domName Event.preventDefault */
+  @DocsEditable
+  @DomName('Event.preventDefault')
   void preventDefault() native "Event_preventDefault_Callback";
 
-
-  /** @domName Event.stopImmediatePropagation */
+  @DocsEditable
+  @DomName('Event.stopImmediatePropagation')
   void stopImmediatePropagation() native "Event_stopImmediatePropagation_Callback";
 
-
-  /** @domName Event.stopPropagation */
+  @DocsEditable
+  @DomName('Event.stopPropagation')
   void stopPropagation() native "Event_stopPropagation_Callback";
 
 }
@@ -10483,7 +10412,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName EventException
+@DocsEditable
+@DomName('EventException')
 class EventException extends NativeFieldWrapperClass1 {
   EventException.internal();
 
@@ -10491,20 +10421,20 @@
 
   static const int UNSPECIFIED_EVENT_TYPE_ERR = 0;
 
-
-  /** @domName EventException.code */
+  @DocsEditable
+  @DomName('EventException.code')
   int get code native "EventException_code_Getter";
 
-
-  /** @domName EventException.message */
+  @DocsEditable
+  @DomName('EventException.message')
   String get message native "EventException_message_Getter";
 
-
-  /** @domName EventException.name */
+  @DocsEditable
+  @DomName('EventException.name')
   String get name native "EventException_name_Getter";
 
-
-  /** @domName EventException.toString */
+  @DocsEditable
+  @DomName('EventException.toString')
   String toString() native "EventException_toString_Callback";
 
 }
@@ -10515,7 +10445,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName EventSource
+@DocsEditable
+@DomName('EventSource')
 class EventSource extends EventTarget {
   EventSource.internal() : super.internal();
 
@@ -10525,11 +10456,17 @@
 
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
 
-  ///@docsEditable true
-  factory EventSource(String scriptUrl) => EventSource._create(scriptUrl);
-  static EventSource _create(String scriptUrl) native "EventSource_constructor_Callback";
+  @DocsEditable
+  factory EventSource(String url, [Map eventSourceInit]) {
+    if (!?eventSourceInit) {
+      return EventSource._create(url);
+    }
+    return EventSource._create(url, eventSourceInit);
+  }
+  static EventSource _create(String url, [Map eventSourceInit]) native "EventSource_constructor_Callback";
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   EventSourceEvents get on =>
     new EventSourceEvents(this);
 
@@ -10539,28 +10476,32 @@
 
   static const int OPEN = 1;
 
-
-  /** @domName EventSource.readyState */
+  @DocsEditable
+  @DomName('EventSource.readyState')
   int get readyState native "EventSource_readyState_Getter";
 
-
-  /** @domName EventSource.url */
+  @DocsEditable
+  @DomName('EventSource.url')
   String get url native "EventSource_url_Getter";
 
+  @DocsEditable
+  @DomName('EventSource.withCredentials')
+  bool get withCredentials native "EventSource_withCredentials_Getter";
 
-  /** @domName EventSource.addEventListener */
+  @DocsEditable
+  @DomName('EventSource.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "EventSource_addEventListener_Callback";
 
-
-  /** @domName EventSource.close */
+  @DocsEditable
+  @DomName('EventSource.close')
   void close() native "EventSource_close_Callback";
 
-
-  /** @domName EventSource.dispatchEvent */
+  @DocsEditable
+  @DomName('EventSource.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "EventSource_dispatchEvent_Callback";
 
-
-  /** @domName EventSource.removeEventListener */
+  @DocsEditable
+  @DomName('EventSource.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "EventSource_removeEventListener_Callback";
 
   Stream<Event> get onError => errorEvent.forTarget(this);
@@ -10571,18 +10512,18 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class EventSourceEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   EventSourceEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get message => this['message'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get open => this['open'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10651,7 +10592,8 @@
   }
 }
 
-/// @domName EventTarget
+@DocsEditable
+@DomName('EventTarget')
 /**
  * Base class for all browser objects that support events.
  *
@@ -10662,20 +10604,20 @@
  */ 
 class EventTarget extends NativeFieldWrapperClass1 {
 
-  /** @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent */
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   Events get on => new Events(this);
   EventTarget.internal();
 
-
-  /** @domName EventTarget.addEventListener */
+  @DocsEditable
+  @DomName('EventTarget.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "EventTarget_addEventListener_Callback";
 
-
-  /** @domName EventTarget.dispatchEvent */
+  @DocsEditable
+  @DomName('EventTarget.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native "EventTarget_dispatchEvent_Callback";
 
-
-  /** @domName EventTarget.removeEventListener */
+  @DocsEditable
+  @DomName('EventTarget.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "EventTarget_removeEventListener_Callback";
 
 }
@@ -10686,7 +10628,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName EXTTextureFilterAnisotropic
+@DocsEditable
+@DomName('EXTTextureFilterAnisotropic')
 class ExtTextureFilterAnisotropic extends NativeFieldWrapperClass1 {
   ExtTextureFilterAnisotropic.internal();
 
@@ -10702,59 +10645,60 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLFieldSetElement
+@DocsEditable
+@DomName('HTMLFieldSetElement')
 class FieldSetElement extends _Element_Merged {
   FieldSetElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory FieldSetElement() => document.$dom_createElement("fieldset");
 
-
-  /** @domName HTMLFieldSetElement.disabled */
+  @DocsEditable
+  @DomName('HTMLFieldSetElement.disabled')
   bool get disabled native "HTMLFieldSetElement_disabled_Getter";
 
-
-  /** @domName HTMLFieldSetElement.disabled */
+  @DocsEditable
+  @DomName('HTMLFieldSetElement.disabled')
   void set disabled(bool value) native "HTMLFieldSetElement_disabled_Setter";
 
-
-  /** @domName HTMLFieldSetElement.elements */
+  @DocsEditable
+  @DomName('HTMLFieldSetElement.elements')
   HtmlCollection get elements native "HTMLFieldSetElement_elements_Getter";
 
-
-  /** @domName HTMLFieldSetElement.form */
+  @DocsEditable
+  @DomName('HTMLFieldSetElement.form')
   FormElement get form native "HTMLFieldSetElement_form_Getter";
 
-
-  /** @domName HTMLFieldSetElement.name */
+  @DocsEditable
+  @DomName('HTMLFieldSetElement.name')
   String get name native "HTMLFieldSetElement_name_Getter";
 
-
-  /** @domName HTMLFieldSetElement.name */
+  @DocsEditable
+  @DomName('HTMLFieldSetElement.name')
   void set name(String value) native "HTMLFieldSetElement_name_Setter";
 
-
-  /** @domName HTMLFieldSetElement.type */
+  @DocsEditable
+  @DomName('HTMLFieldSetElement.type')
   String get type native "HTMLFieldSetElement_type_Getter";
 
-
-  /** @domName HTMLFieldSetElement.validationMessage */
+  @DocsEditable
+  @DomName('HTMLFieldSetElement.validationMessage')
   String get validationMessage native "HTMLFieldSetElement_validationMessage_Getter";
 
-
-  /** @domName HTMLFieldSetElement.validity */
+  @DocsEditable
+  @DomName('HTMLFieldSetElement.validity')
   ValidityState get validity native "HTMLFieldSetElement_validity_Getter";
 
-
-  /** @domName HTMLFieldSetElement.willValidate */
+  @DocsEditable
+  @DomName('HTMLFieldSetElement.willValidate')
   bool get willValidate native "HTMLFieldSetElement_willValidate_Getter";
 
-
-  /** @domName HTMLFieldSetElement.checkValidity */
+  @DocsEditable
+  @DomName('HTMLFieldSetElement.checkValidity')
   bool checkValidity() native "HTMLFieldSetElement_checkValidity_Callback";
 
-
-  /** @domName HTMLFieldSetElement.setCustomValidity */
+  @DocsEditable
+  @DomName('HTMLFieldSetElement.setCustomValidity')
   void setCustomValidity(String error) native "HTMLFieldSetElement_setCustomValidity_Callback";
 
 }
@@ -10765,20 +10709,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName File
+@DocsEditable
+@DomName('File')
 class File extends Blob {
   File.internal() : super.internal();
 
-
-  /** @domName File.lastModifiedDate */
+  @DocsEditable
+  @DomName('File.lastModifiedDate')
   Date get lastModifiedDate native "File_lastModifiedDate_Getter";
 
-
-  /** @domName File.name */
+  @DocsEditable
+  @DomName('File.name')
   String get name native "File_name_Getter";
 
-
-  /** @domName File.webkitRelativePath */
+  @DocsEditable
+  @DomName('File.webkitRelativePath')
   String get webkitRelativePath native "File_webkitRelativePath_Getter";
 
 }
@@ -10797,16 +10742,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName FileEntry
+@DocsEditable
+@DomName('FileEntry')
 class FileEntry extends Entry {
   FileEntry.internal() : super.internal();
 
-
-  /** @domName FileEntry.createWriter */
+  @DocsEditable
+  @DomName('FileEntry.createWriter')
   void createWriter(FileWriterCallback successCallback, [ErrorCallback errorCallback]) native "FileEntry_createWriter_Callback";
 
-
-  /** @domName FileEntry.file */
+  @DocsEditable
+  @DomName('FileEntry.file')
   void file(FileCallback successCallback, [ErrorCallback errorCallback]) native "FileEntry_file_Callback";
 
 }
@@ -10817,16 +10763,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName FileEntrySync
+@DocsEditable
+@DomName('FileEntrySync')
 class FileEntrySync extends EntrySync {
   FileEntrySync.internal() : super.internal();
 
-
-  /** @domName FileEntrySync.createWriter */
+  @DocsEditable
+  @DomName('FileEntrySync.createWriter')
   FileWriterSync createWriter() native "FileEntrySync_createWriter_Callback";
 
-
-  /** @domName FileEntrySync.file */
+  @DocsEditable
+  @DomName('FileEntrySync.file')
   File file() native "FileEntrySync_file_Callback";
 
 }
@@ -10837,7 +10784,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName FileError
+@DocsEditable
+@DomName('FileError')
 class FileError extends NativeFieldWrapperClass1 {
   FileError.internal();
 
@@ -10865,8 +10813,8 @@
 
   static const int TYPE_MISMATCH_ERR = 11;
 
-
-  /** @domName FileError.code */
+  @DocsEditable
+  @DomName('FileError.code')
   int get code native "FileError_code_Getter";
 
 }
@@ -10877,7 +10825,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName FileException
+@DocsEditable
+@DomName('FileException')
 class FileException extends NativeFieldWrapperClass1 {
   FileException.internal();
 
@@ -10905,20 +10854,20 @@
 
   static const int TYPE_MISMATCH_ERR = 11;
 
-
-  /** @domName FileException.code */
+  @DocsEditable
+  @DomName('FileException.code')
   int get code native "FileException_code_Getter";
 
-
-  /** @domName FileException.message */
+  @DocsEditable
+  @DomName('FileException.message')
   String get message native "FileException_message_Getter";
 
-
-  /** @domName FileException.name */
+  @DocsEditable
+  @DomName('FileException.name')
   String get name native "FileException_name_Getter";
 
-
-  /** @domName FileException.toString */
+  @DocsEditable
+  @DomName('FileException.toString')
   String toString() native "FileException_toString_Callback";
 
 }
@@ -10929,12 +10878,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName FileList
+@DocsEditable
+@DomName('FileList')
 class FileList extends NativeFieldWrapperClass1 implements List<File> {
   FileList.internal();
 
-
-  /** @domName FileList.length */
+  @DocsEditable
+  @DomName('FileList.length')
   int get length native "FileList_length_Getter";
 
   File operator[](int index) native "FileList_item_Callback";
@@ -10955,50 +10905,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, File)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(File element) => Collections.contains(this, element);
+  bool contains(File element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(File element)) => Collections.forEach(this, f);
+  void forEach(void f(File element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(File element)) => new MappedList<File, dynamic>(this, f);
+  List mappedBy(f(File element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<File> where(bool f(File element)) => new WhereIterable<File>(this, f);
+  Iterable<File> where(bool f(File element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(File element)) => Collections.every(this, f);
+  bool every(bool f(File element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(File element)) => Collections.any(this, f);
+  bool any(bool f(File element)) => IterableMixinWorkaround.any(this, f);
 
   List<File> toList() => new List<File>.from(this);
   Set<File> toSet() => new Set<File>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<File> take(int n) => new ListView<File>(this, 0, n);
+  List<File> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<File> takeWhile(bool test(File value)) {
-    return new TakeWhileIterable<File>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<File> skip(int n) => new ListView<File>(this, n, null);
+  List<File> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<File> skipWhile(bool test(File value)) {
-    return new SkipWhileIterable<File>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   File firstMatching(bool test(File value), { File orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   File lastMatching(bool test(File value), {File orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   File singleMatching(bool test(File value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   File elementAt(int index) {
@@ -11056,16 +11006,36 @@
     throw new StateError("More than one element");
   }
 
-  File min([int compare(File a, File b)]) => Collections.min(this, compare);
+  File min([int compare(File a, File b)]) => IterableMixinWorkaround.min(this, compare);
 
-  File max([int compare(File a, File b)]) => Collections.max(this, compare);
+  File max([int compare(File a, File b)]) => IterableMixinWorkaround.max(this, compare);
 
   File removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   File removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(File element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(File element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<File> from, [int startFrom]) {
@@ -11085,8 +11055,8 @@
 
   // -- end List<File> mixins.
 
-
-  /** @domName FileList.item */
+  @DocsEditable
+  @DomName('FileList.item')
   File item(int index) native "FileList_item_Callback";
 
 }
@@ -11097,7 +11067,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName FileReader
+@DocsEditable
+@DomName('FileReader')
 class FileReader extends EventTarget {
   FileReader.internal() : super.internal();
 
@@ -11113,11 +11084,12 @@
 
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
-  ///@docsEditable true
+  @DocsEditable
   factory FileReader() => FileReader._create();
   static FileReader _create() native "FileReader_constructor_Callback";
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   FileReaderEvents get on =>
     new FileReaderEvents(this);
 
@@ -11127,43 +11099,43 @@
 
   static const int LOADING = 1;
 
-
-  /** @domName FileReader.error */
+  @DocsEditable
+  @DomName('FileReader.error')
   FileError get error native "FileReader_error_Getter";
 
-
-  /** @domName FileReader.readyState */
+  @DocsEditable
+  @DomName('FileReader.readyState')
   int get readyState native "FileReader_readyState_Getter";
 
-
-  /** @domName FileReader.result */
+  @DocsEditable
+  @DomName('FileReader.result')
   Object get result native "FileReader_result_Getter";
 
-
-  /** @domName FileReader.abort */
+  @DocsEditable
+  @DomName('FileReader.abort')
   void abort() native "FileReader_abort_Callback";
 
-
-  /** @domName FileReader.addEventListener */
+  @DocsEditable
+  @DomName('FileReader.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_addEventListener_Callback";
 
-
-  /** @domName FileReader.dispatchEvent */
+  @DocsEditable
+  @DomName('FileReader.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "FileReader_dispatchEvent_Callback";
 
-
-  /** @domName FileReader.readAsArrayBuffer */
+  @DocsEditable
+  @DomName('FileReader.readAsArrayBuffer')
   void readAsArrayBuffer(Blob blob) native "FileReader_readAsArrayBuffer_Callback";
 
-
-  /** @domName FileReader.readAsBinaryString */
+  @DocsEditable
+  @DomName('FileReader.readAsBinaryString')
   void readAsBinaryString(Blob blob) native "FileReader_readAsBinaryString_Callback";
 
-
-  /** @domName FileReader.readAsDataURL */
+  @DocsEditable
+  @DomName('FileReader.readAsDataURL')
   void readAsDataUrl(Blob blob) native "FileReader_readAsDataURL_Callback";
 
-  void readAsText(/*Blob*/ blob, [/*DOMString*/ encoding]) {
+  void readAsText(Blob blob, [String encoding]) {
     if (?encoding) {
       _readAsText_1(blob, encoding);
       return;
@@ -11171,16 +11143,16 @@
     _readAsText_2(blob);
   }
 
-
-  /** @domName FileReader.readAsText_1 */
+  @DocsEditable
+  @DomName('FileReader.readAsText_1')
   void _readAsText_1(blob, encoding) native "FileReader_readAsText_1_Callback";
 
-
-  /** @domName FileReader.readAsText_2 */
+  @DocsEditable
+  @DomName('FileReader.readAsText_2')
   void _readAsText_2(blob) native "FileReader_readAsText_2_Callback";
 
-
-  /** @domName FileReader.removeEventListener */
+  @DocsEditable
+  @DomName('FileReader.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_removeEventListener_Callback";
 
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
@@ -11197,27 +11169,27 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class FileReaderEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   FileReaderEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get load => this['load'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadEnd => this['loadend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadStart => this['loadstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get progress => this['progress'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11227,39 +11199,40 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName FileReaderSync
+@DocsEditable
+@DomName('FileReaderSync')
 class FileReaderSync extends NativeFieldWrapperClass1 {
   FileReaderSync.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory FileReaderSync() => FileReaderSync._create();
   static FileReaderSync _create() native "FileReaderSync_constructor_Callback";
 
-
-  /** @domName FileReaderSync.readAsArrayBuffer */
+  @DocsEditable
+  @DomName('FileReaderSync.readAsArrayBuffer')
   ArrayBuffer readAsArrayBuffer(Blob blob) native "FileReaderSync_readAsArrayBuffer_Callback";
 
-
-  /** @domName FileReaderSync.readAsBinaryString */
+  @DocsEditable
+  @DomName('FileReaderSync.readAsBinaryString')
   String readAsBinaryString(Blob blob) native "FileReaderSync_readAsBinaryString_Callback";
 
-
-  /** @domName FileReaderSync.readAsDataURL */
+  @DocsEditable
+  @DomName('FileReaderSync.readAsDataURL')
   String readAsDataUrl(Blob blob) native "FileReaderSync_readAsDataURL_Callback";
 
-  String readAsText(/*Blob*/ blob, [/*DOMString*/ encoding]) {
+  String readAsText(Blob blob, [String encoding]) {
     if (?encoding) {
       return _readAsText_1(blob, encoding);
     }
     return _readAsText_2(blob);
   }
 
-
-  /** @domName FileReaderSync.readAsText_1 */
+  @DocsEditable
+  @DomName('FileReaderSync.readAsText_1')
   String _readAsText_1(blob, encoding) native "FileReaderSync_readAsText_1_Callback";
 
-
-  /** @domName FileReaderSync.readAsText_2 */
+  @DocsEditable
+  @DomName('FileReaderSync.readAsText_2')
   String _readAsText_2(blob) native "FileReaderSync_readAsText_2_Callback";
 
 }
@@ -11270,19 +11243,20 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DOMFileSystem
+@DocsEditable
+@DomName('DOMFileSystem')
 class FileSystem extends NativeFieldWrapperClass1 {
   FileSystem.internal();
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-
-  /** @domName DOMFileSystem.name */
+  @DocsEditable
+  @DomName('DOMFileSystem.name')
   String get name native "DOMFileSystem_name_Getter";
 
-
-  /** @domName DOMFileSystem.root */
+  @DocsEditable
+  @DomName('DOMFileSystem.root')
   DirectoryEntry get root native "DOMFileSystem_root_Getter";
 
 }
@@ -11301,16 +11275,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DOMFileSystemSync
+@DocsEditable
+@DomName('DOMFileSystemSync')
 class FileSystemSync extends NativeFieldWrapperClass1 {
   FileSystemSync.internal();
 
-
-  /** @domName DOMFileSystemSync.name */
+  @DocsEditable
+  @DomName('DOMFileSystemSync.name')
   String get name native "DOMFileSystemSync_name_Getter";
 
-
-  /** @domName DOMFileSystemSync.root */
+  @DocsEditable
+  @DomName('DOMFileSystemSync.root')
   DirectoryEntrySync get root native "DOMFileSystemSync_root_Getter";
 
 }
@@ -11321,7 +11296,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName FileWriter
+@DocsEditable
+@DomName('FileWriter')
 class FileWriter extends EventTarget {
   FileWriter.internal() : super.internal();
 
@@ -11337,7 +11313,8 @@
 
   static const EventStreamProvider<ProgressEvent> writeStartEvent = const EventStreamProvider<ProgressEvent>('writestart');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   FileWriterEvents get on =>
     new FileWriterEvents(this);
 
@@ -11347,48 +11324,48 @@
 
   static const int WRITING = 1;
 
-
-  /** @domName FileWriter.error */
+  @DocsEditable
+  @DomName('FileWriter.error')
   FileError get error native "FileWriter_error_Getter";
 
-
-  /** @domName FileWriter.length */
+  @DocsEditable
+  @DomName('FileWriter.length')
   int get length native "FileWriter_length_Getter";
 
-
-  /** @domName FileWriter.position */
+  @DocsEditable
+  @DomName('FileWriter.position')
   int get position native "FileWriter_position_Getter";
 
-
-  /** @domName FileWriter.readyState */
+  @DocsEditable
+  @DomName('FileWriter.readyState')
   int get readyState native "FileWriter_readyState_Getter";
 
-
-  /** @domName FileWriter.abort */
+  @DocsEditable
+  @DomName('FileWriter.abort')
   void abort() native "FileWriter_abort_Callback";
 
-
-  /** @domName FileWriter.addEventListener */
+  @DocsEditable
+  @DomName('FileWriter.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_addEventListener_Callback";
 
-
-  /** @domName FileWriter.dispatchEvent */
+  @DocsEditable
+  @DomName('FileWriter.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "FileWriter_dispatchEvent_Callback";
 
-
-  /** @domName FileWriter.removeEventListener */
+  @DocsEditable
+  @DomName('FileWriter.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_removeEventListener_Callback";
 
-
-  /** @domName FileWriter.seek */
+  @DocsEditable
+  @DomName('FileWriter.seek')
   void seek(int position) native "FileWriter_seek_Callback";
 
-
-  /** @domName FileWriter.truncate */
+  @DocsEditable
+  @DomName('FileWriter.truncate')
   void truncate(int size) native "FileWriter_truncate_Callback";
 
-
-  /** @domName FileWriter.write */
+  @DocsEditable
+  @DomName('FileWriter.write')
   void write(Blob data) native "FileWriter_write_Callback";
 
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
@@ -11405,27 +11382,27 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class FileWriterEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   FileWriterEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get progress => this['progress'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get write => this['write'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get writeEnd => this['writeend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get writeStart => this['writestart'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11443,28 +11420,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName FileWriterSync
+@DocsEditable
+@DomName('FileWriterSync')
 class FileWriterSync extends NativeFieldWrapperClass1 {
   FileWriterSync.internal();
 
-
-  /** @domName FileWriterSync.length */
+  @DocsEditable
+  @DomName('FileWriterSync.length')
   int get length native "FileWriterSync_length_Getter";
 
-
-  /** @domName FileWriterSync.position */
+  @DocsEditable
+  @DomName('FileWriterSync.position')
   int get position native "FileWriterSync_position_Getter";
 
-
-  /** @domName FileWriterSync.seek */
+  @DocsEditable
+  @DomName('FileWriterSync.seek')
   void seek(int position) native "FileWriterSync_seek_Callback";
 
-
-  /** @domName FileWriterSync.truncate */
+  @DocsEditable
+  @DomName('FileWriterSync.truncate')
   void truncate(int size) native "FileWriterSync_truncate_Callback";
 
-
-  /** @domName FileWriterSync.write */
+  @DocsEditable
+  @DomName('FileWriterSync.write')
   void write(Blob data) native "FileWriterSync_write_Callback";
 
 }
@@ -11475,7 +11453,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Float32Array
+@DocsEditable
+@DomName('Float32Array')
 class Float32Array extends ArrayBufferView implements List<num> {
   Float32Array.internal() : super.internal();
 
@@ -11490,16 +11469,16 @@
 
   static const int BYTES_PER_ELEMENT = 4;
 
-
-  /** @domName Float32Array.length */
+  @DocsEditable
+  @DomName('Float32Array.length')
   int get length native "Float32Array_length_Getter";
 
-
-  /** @domName Float32Array.numericIndexGetter */
+  @DocsEditable
+  @DomName('Float32Array.numericIndexGetter')
   num operator[](int index) native "Float32Array_numericIndexGetter_Callback";
 
-
-  /** @domName Float32Array.numericIndexSetter */
+  @DocsEditable
+  @DomName('Float32Array.numericIndexSetter')
   void operator[]=(int index, num value) native "Float32Array_numericIndexSetter_Callback";
   // -- start List<num> mixins.
   // num is the element type.
@@ -11514,50 +11493,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, num)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(num element) => Collections.contains(this, element);
+  bool contains(num element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(num element)) => Collections.forEach(this, f);
+  void forEach(void f(num element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(num element)) => new MappedList<num, dynamic>(this, f);
+  List mappedBy(f(num element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<num> where(bool f(num element)) => new WhereIterable<num>(this, f);
+  Iterable<num> where(bool f(num element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(num element)) => Collections.every(this, f);
+  bool every(bool f(num element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(num element)) => Collections.any(this, f);
+  bool any(bool f(num element)) => IterableMixinWorkaround.any(this, f);
 
   List<num> toList() => new List<num>.from(this);
   Set<num> toSet() => new Set<num>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<num> take(int n) => new ListView<num>(this, 0, n);
+  List<num> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<num> takeWhile(bool test(num value)) {
-    return new TakeWhileIterable<num>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<num> skip(int n) => new ListView<num>(this, n, null);
+  List<num> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<num> skipWhile(bool test(num value)) {
-    return new SkipWhileIterable<num>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   num firstMatching(bool test(num value), { num orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   num lastMatching(bool test(num value), {num orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   num singleMatching(bool test(num value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   num elementAt(int index) {
@@ -11615,16 +11594,36 @@
     throw new StateError("More than one element");
   }
 
-  num min([int compare(num a, num b)]) => Collections.min(this, compare);
+  num min([int compare(num a, num b)]) => IterableMixinWorkaround.min(this, compare);
 
-  num max([int compare(num a, num b)]) => Collections.max(this, compare);
+  num max([int compare(num a, num b)]) => IterableMixinWorkaround.max(this, compare);
 
   num removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   num removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(num element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(num element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<num> from, [int startFrom]) {
@@ -11644,23 +11643,23 @@
 
   // -- end List<num> mixins.
 
-
-  /** @domName Float32Array.setElements */
+  @DocsEditable
+  @DomName('Float32Array.setElements')
   void setElements(Object array, [int offset]) native "Float32Array_setElements_Callback";
 
-  Float32Array subarray(/*long*/ start, [/*long*/ end]) {
+  Float32Array subarray(int start, [int end]) {
     if (?end) {
       return _subarray_1(start, end);
     }
     return _subarray_2(start);
   }
 
-
-  /** @domName Float32Array.subarray_1 */
+  @DocsEditable
+  @DomName('Float32Array.subarray_1')
   Float32Array _subarray_1(start, end) native "Float32Array_subarray_1_Callback";
 
-
-  /** @domName Float32Array.subarray_2 */
+  @DocsEditable
+  @DomName('Float32Array.subarray_2')
   Float32Array _subarray_2(start) native "Float32Array_subarray_2_Callback";
 
 }
@@ -11671,7 +11670,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Float64Array
+@DocsEditable
+@DomName('Float64Array')
 class Float64Array extends ArrayBufferView implements List<num> {
   Float64Array.internal() : super.internal();
 
@@ -11686,16 +11686,16 @@
 
   static const int BYTES_PER_ELEMENT = 8;
 
-
-  /** @domName Float64Array.length */
+  @DocsEditable
+  @DomName('Float64Array.length')
   int get length native "Float64Array_length_Getter";
 
-
-  /** @domName Float64Array.numericIndexGetter */
+  @DocsEditable
+  @DomName('Float64Array.numericIndexGetter')
   num operator[](int index) native "Float64Array_numericIndexGetter_Callback";
 
-
-  /** @domName Float64Array.numericIndexSetter */
+  @DocsEditable
+  @DomName('Float64Array.numericIndexSetter')
   void operator[]=(int index, num value) native "Float64Array_numericIndexSetter_Callback";
   // -- start List<num> mixins.
   // num is the element type.
@@ -11710,50 +11710,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, num)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(num element) => Collections.contains(this, element);
+  bool contains(num element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(num element)) => Collections.forEach(this, f);
+  void forEach(void f(num element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(num element)) => new MappedList<num, dynamic>(this, f);
+  List mappedBy(f(num element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<num> where(bool f(num element)) => new WhereIterable<num>(this, f);
+  Iterable<num> where(bool f(num element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(num element)) => Collections.every(this, f);
+  bool every(bool f(num element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(num element)) => Collections.any(this, f);
+  bool any(bool f(num element)) => IterableMixinWorkaround.any(this, f);
 
   List<num> toList() => new List<num>.from(this);
   Set<num> toSet() => new Set<num>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<num> take(int n) => new ListView<num>(this, 0, n);
+  List<num> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<num> takeWhile(bool test(num value)) {
-    return new TakeWhileIterable<num>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<num> skip(int n) => new ListView<num>(this, n, null);
+  List<num> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<num> skipWhile(bool test(num value)) {
-    return new SkipWhileIterable<num>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   num firstMatching(bool test(num value), { num orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   num lastMatching(bool test(num value), {num orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   num singleMatching(bool test(num value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   num elementAt(int index) {
@@ -11811,16 +11811,36 @@
     throw new StateError("More than one element");
   }
 
-  num min([int compare(num a, num b)]) => Collections.min(this, compare);
+  num min([int compare(num a, num b)]) => IterableMixinWorkaround.min(this, compare);
 
-  num max([int compare(num a, num b)]) => Collections.max(this, compare);
+  num max([int compare(num a, num b)]) => IterableMixinWorkaround.max(this, compare);
 
   num removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   num removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(num element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(num element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<num> from, [int startFrom]) {
@@ -11840,23 +11860,23 @@
 
   // -- end List<num> mixins.
 
-
-  /** @domName Float64Array.setElements */
+  @DocsEditable
+  @DomName('Float64Array.setElements')
   void setElements(Object array, [int offset]) native "Float64Array_setElements_Callback";
 
-  Float64Array subarray(/*long*/ start, [/*long*/ end]) {
+  Float64Array subarray(int start, [int end]) {
     if (?end) {
       return _subarray_1(start, end);
     }
     return _subarray_2(start);
   }
 
-
-  /** @domName Float64Array.subarray_1 */
+  @DocsEditable
+  @DomName('Float64Array.subarray_1')
   Float64Array _subarray_1(start, end) native "Float64Array_subarray_1_Callback";
 
-
-  /** @domName Float64Array.subarray_2 */
+  @DocsEditable
+  @DomName('Float64Array.subarray_2')
   Float64Array _subarray_2(start) native "Float64Array_subarray_2_Callback";
 
 }
@@ -11867,47 +11887,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLFontElement
-class FontElement extends _Element_Merged {
-  FontElement.internal() : super.internal();
-
-
-  /** @domName HTMLFontElement.color */
-  String get color native "HTMLFontElement_color_Getter";
-
-
-  /** @domName HTMLFontElement.color */
-  void set color(String value) native "HTMLFontElement_color_Setter";
-
-
-  /** @domName HTMLFontElement.face */
-  String get face native "HTMLFontElement_face_Getter";
-
-
-  /** @domName HTMLFontElement.face */
-  void set face(String value) native "HTMLFontElement_face_Setter";
-
-
-  /** @domName HTMLFontElement.size */
-  String get size native "HTMLFontElement_size_Getter";
-
-
-  /** @domName HTMLFontElement.size */
-  void set size(String value) native "HTMLFontElement_size_Setter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName FormData
+@DocsEditable
+@DomName('FormData')
 class FormData extends NativeFieldWrapperClass1 {
   FormData.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory FormData([FormElement form]) {
     if (!?form) {
       return FormData._create();
@@ -11916,8 +11901,8 @@
   }
   static FormData _create([FormElement form]) native "DOMFormData_constructor_Callback";
 
-
-  /** @domName DOMFormData.append */
+  @DocsEditable
+  @DomName('DOMFormData.append')
   void append(String name, value, [String filename]) native "DOMFormData_append_Callback";
 
 }
@@ -11928,99 +11913,100 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLFormElement
+@DocsEditable
+@DomName('HTMLFormElement')
 class FormElement extends _Element_Merged {
   FormElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory FormElement() => document.$dom_createElement("form");
 
-
-  /** @domName HTMLFormElement.acceptCharset */
+  @DocsEditable
+  @DomName('HTMLFormElement.acceptCharset')
   String get acceptCharset native "HTMLFormElement_acceptCharset_Getter";
 
-
-  /** @domName HTMLFormElement.acceptCharset */
+  @DocsEditable
+  @DomName('HTMLFormElement.acceptCharset')
   void set acceptCharset(String value) native "HTMLFormElement_acceptCharset_Setter";
 
-
-  /** @domName HTMLFormElement.action */
+  @DocsEditable
+  @DomName('HTMLFormElement.action')
   String get action native "HTMLFormElement_action_Getter";
 
-
-  /** @domName HTMLFormElement.action */
+  @DocsEditable
+  @DomName('HTMLFormElement.action')
   void set action(String value) native "HTMLFormElement_action_Setter";
 
-
-  /** @domName HTMLFormElement.autocomplete */
+  @DocsEditable
+  @DomName('HTMLFormElement.autocomplete')
   String get autocomplete native "HTMLFormElement_autocomplete_Getter";
 
-
-  /** @domName HTMLFormElement.autocomplete */
+  @DocsEditable
+  @DomName('HTMLFormElement.autocomplete')
   void set autocomplete(String value) native "HTMLFormElement_autocomplete_Setter";
 
-
-  /** @domName HTMLFormElement.encoding */
+  @DocsEditable
+  @DomName('HTMLFormElement.encoding')
   String get encoding native "HTMLFormElement_encoding_Getter";
 
-
-  /** @domName HTMLFormElement.encoding */
+  @DocsEditable
+  @DomName('HTMLFormElement.encoding')
   void set encoding(String value) native "HTMLFormElement_encoding_Setter";
 
-
-  /** @domName HTMLFormElement.enctype */
+  @DocsEditable
+  @DomName('HTMLFormElement.enctype')
   String get enctype native "HTMLFormElement_enctype_Getter";
 
-
-  /** @domName HTMLFormElement.enctype */
+  @DocsEditable
+  @DomName('HTMLFormElement.enctype')
   void set enctype(String value) native "HTMLFormElement_enctype_Setter";
 
-
-  /** @domName HTMLFormElement.length */
+  @DocsEditable
+  @DomName('HTMLFormElement.length')
   int get length native "HTMLFormElement_length_Getter";
 
-
-  /** @domName HTMLFormElement.method */
+  @DocsEditable
+  @DomName('HTMLFormElement.method')
   String get method native "HTMLFormElement_method_Getter";
 
-
-  /** @domName HTMLFormElement.method */
+  @DocsEditable
+  @DomName('HTMLFormElement.method')
   void set method(String value) native "HTMLFormElement_method_Setter";
 
-
-  /** @domName HTMLFormElement.name */
+  @DocsEditable
+  @DomName('HTMLFormElement.name')
   String get name native "HTMLFormElement_name_Getter";
 
-
-  /** @domName HTMLFormElement.name */
+  @DocsEditable
+  @DomName('HTMLFormElement.name')
   void set name(String value) native "HTMLFormElement_name_Setter";
 
-
-  /** @domName HTMLFormElement.noValidate */
+  @DocsEditable
+  @DomName('HTMLFormElement.noValidate')
   bool get noValidate native "HTMLFormElement_noValidate_Getter";
 
-
-  /** @domName HTMLFormElement.noValidate */
+  @DocsEditable
+  @DomName('HTMLFormElement.noValidate')
   void set noValidate(bool value) native "HTMLFormElement_noValidate_Setter";
 
-
-  /** @domName HTMLFormElement.target */
+  @DocsEditable
+  @DomName('HTMLFormElement.target')
   String get target native "HTMLFormElement_target_Getter";
 
-
-  /** @domName HTMLFormElement.target */
+  @DocsEditable
+  @DomName('HTMLFormElement.target')
   void set target(String value) native "HTMLFormElement_target_Setter";
 
-
-  /** @domName HTMLFormElement.checkValidity */
+  @DocsEditable
+  @DomName('HTMLFormElement.checkValidity')
   bool checkValidity() native "HTMLFormElement_checkValidity_Callback";
 
-
-  /** @domName HTMLFormElement.reset */
+  @DocsEditable
+  @DomName('HTMLFormElement.reset')
   void reset() native "HTMLFormElement_reset_Callback";
 
-
-  /** @domName HTMLFormElement.submit */
+  @DocsEditable
+  @DomName('HTMLFormElement.submit')
   void submit() native "HTMLFormElement_submit_Callback";
 
 }
@@ -12031,253 +12017,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLFrameElement
-class FrameElement extends _Element_Merged {
-  FrameElement.internal() : super.internal();
-
-
-  /** @domName HTMLFrameElement.contentWindow */
-  WindowBase get contentWindow native "HTMLFrameElement_contentWindow_Getter";
-
-
-  /** @domName HTMLFrameElement.frameBorder */
-  String get frameBorder native "HTMLFrameElement_frameBorder_Getter";
-
-
-  /** @domName HTMLFrameElement.frameBorder */
-  void set frameBorder(String value) native "HTMLFrameElement_frameBorder_Setter";
-
-
-  /** @domName HTMLFrameElement.height */
-  int get height native "HTMLFrameElement_height_Getter";
-
-
-  /** @domName HTMLFrameElement.location */
-  String get location native "HTMLFrameElement_location_Getter";
-
-
-  /** @domName HTMLFrameElement.location */
-  void set location(String value) native "HTMLFrameElement_location_Setter";
-
-
-  /** @domName HTMLFrameElement.longDesc */
-  String get longDesc native "HTMLFrameElement_longDesc_Getter";
-
-
-  /** @domName HTMLFrameElement.longDesc */
-  void set longDesc(String value) native "HTMLFrameElement_longDesc_Setter";
-
-
-  /** @domName HTMLFrameElement.marginHeight */
-  String get marginHeight native "HTMLFrameElement_marginHeight_Getter";
-
-
-  /** @domName HTMLFrameElement.marginHeight */
-  void set marginHeight(String value) native "HTMLFrameElement_marginHeight_Setter";
-
-
-  /** @domName HTMLFrameElement.marginWidth */
-  String get marginWidth native "HTMLFrameElement_marginWidth_Getter";
-
-
-  /** @domName HTMLFrameElement.marginWidth */
-  void set marginWidth(String value) native "HTMLFrameElement_marginWidth_Setter";
-
-
-  /** @domName HTMLFrameElement.name */
-  String get name native "HTMLFrameElement_name_Getter";
-
-
-  /** @domName HTMLFrameElement.name */
-  void set name(String value) native "HTMLFrameElement_name_Setter";
-
-
-  /** @domName HTMLFrameElement.noResize */
-  bool get noResize native "HTMLFrameElement_noResize_Getter";
-
-
-  /** @domName HTMLFrameElement.noResize */
-  void set noResize(bool value) native "HTMLFrameElement_noResize_Setter";
-
-
-  /** @domName HTMLFrameElement.scrolling */
-  String get scrolling native "HTMLFrameElement_scrolling_Getter";
-
-
-  /** @domName HTMLFrameElement.scrolling */
-  void set scrolling(String value) native "HTMLFrameElement_scrolling_Setter";
-
-
-  /** @domName HTMLFrameElement.src */
-  String get src native "HTMLFrameElement_src_Getter";
-
-
-  /** @domName HTMLFrameElement.src */
-  void set src(String value) native "HTMLFrameElement_src_Setter";
-
-
-  /** @domName HTMLFrameElement.width */
-  int get width native "HTMLFrameElement_width_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName HTMLFrameSetElement
-class FrameSetElement extends _Element_Merged {
-  FrameSetElement.internal() : super.internal();
-
-  static const EventStreamProvider<Event> beforeUnloadEvent = const EventStreamProvider<Event>('beforeunload');
-
-  static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
-
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
-
-  static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
-
-  static const EventStreamProvider<HashChangeEvent> hashChangeEvent = const EventStreamProvider<HashChangeEvent>('hashchange');
-
-  static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
-
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
-
-  static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');
-
-  static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');
-
-  static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
-
-  static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
-
-  static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');
-
-  static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
-
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
-  FrameSetElementEvents get on =>
-    new FrameSetElementEvents(this);
-
-
-  /** @domName HTMLFrameSetElement.cols */
-  String get cols native "HTMLFrameSetElement_cols_Getter";
-
-
-  /** @domName HTMLFrameSetElement.cols */
-  void set cols(String value) native "HTMLFrameSetElement_cols_Setter";
-
-
-  /** @domName HTMLFrameSetElement.rows */
-  String get rows native "HTMLFrameSetElement_rows_Getter";
-
-
-  /** @domName HTMLFrameSetElement.rows */
-  void set rows(String value) native "HTMLFrameSetElement_rows_Setter";
-
-  Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
-
-  Stream<Event> get onBlur => blurEvent.forTarget(this);
-
-  Stream<Event> get onError => errorEvent.forTarget(this);
-
-  Stream<Event> get onFocus => focusEvent.forTarget(this);
-
-  Stream<HashChangeEvent> get onHashChange => hashChangeEvent.forTarget(this);
-
-  Stream<Event> get onLoad => loadEvent.forTarget(this);
-
-  Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
-
-  Stream<Event> get onOffline => offlineEvent.forTarget(this);
-
-  Stream<Event> get onOnline => onlineEvent.forTarget(this);
-
-  Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);
-
-  Stream<Event> get onResize => resizeEvent.forTarget(this);
-
-  Stream<StorageEvent> get onStorage => storageEvent.forTarget(this);
-
-  Stream<Event> get onUnload => unloadEvent.forTarget(this);
-
-}
-
-/// @docsEditable true
-class FrameSetElementEvents extends ElementEvents {
-  /// @docsEditable true
-  FrameSetElementEvents(EventTarget _ptr) : super(_ptr);
-
-  /// @docsEditable true
-  EventListenerList get beforeUnload => this['beforeunload'];
-
-  /// @docsEditable true
-  EventListenerList get blur => this['blur'];
-
-  /// @docsEditable true
-  EventListenerList get error => this['error'];
-
-  /// @docsEditable true
-  EventListenerList get focus => this['focus'];
-
-  /// @docsEditable true
-  EventListenerList get hashChange => this['hashchange'];
-
-  /// @docsEditable true
-  EventListenerList get load => this['load'];
-
-  /// @docsEditable true
-  EventListenerList get message => this['message'];
-
-  /// @docsEditable true
-  EventListenerList get offline => this['offline'];
-
-  /// @docsEditable true
-  EventListenerList get online => this['online'];
-
-  /// @docsEditable true
-  EventListenerList get popState => this['popstate'];
-
-  /// @docsEditable true
-  EventListenerList get resize => this['resize'];
-
-  /// @docsEditable true
-  EventListenerList get storage => this['storage'];
-
-  /// @docsEditable true
-  EventListenerList get unload => this['unload'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName Gamepad
+@DocsEditable
+@DomName('Gamepad')
 class Gamepad extends NativeFieldWrapperClass1 {
   Gamepad.internal();
 
-
-  /** @domName Gamepad.axes */
+  @DocsEditable
+  @DomName('Gamepad.axes')
   List<num> get axes native "Gamepad_axes_Getter";
 
-
-  /** @domName Gamepad.buttons */
+  @DocsEditable
+  @DomName('Gamepad.buttons')
   List<num> get buttons native "Gamepad_buttons_Getter";
 
-
-  /** @domName Gamepad.id */
+  @DocsEditable
+  @DomName('Gamepad.id')
   String get id native "Gamepad_id_Getter";
 
-
-  /** @domName Gamepad.index */
+  @DocsEditable
+  @DomName('Gamepad.index')
   int get index native "Gamepad_index_Getter";
 
-
-  /** @domName Gamepad.timestamp */
+  @DocsEditable
+  @DomName('Gamepad.timestamp')
   int get timestamp native "Gamepad_timestamp_Getter";
 
 }
@@ -12288,20 +12050,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Geolocation
+@DocsEditable
+@DomName('Geolocation')
 class Geolocation extends NativeFieldWrapperClass1 {
   Geolocation.internal();
 
-
-  /** @domName Geolocation.clearWatch */
+  @DocsEditable
+  @DomName('Geolocation.clearWatch')
   void clearWatch(int watchId) native "Geolocation_clearWatch_Callback";
 
-
-  /** @domName Geolocation.getCurrentPosition */
+  @DocsEditable
+  @DomName('Geolocation.getCurrentPosition')
   void getCurrentPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]) native "Geolocation_getCurrentPosition_Callback";
 
-
-  /** @domName Geolocation.watchPosition */
+  @DocsEditable
+  @DomName('Geolocation.watchPosition')
   int watchPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]) native "Geolocation_watchPosition_Callback";
 
 }
@@ -12312,16 +12075,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Geoposition
+@DocsEditable
+@DomName('Geoposition')
 class Geoposition extends NativeFieldWrapperClass1 {
   Geoposition.internal();
 
-
-  /** @domName Geoposition.coords */
+  @DocsEditable
+  @DomName('Geoposition.coords')
   Coordinates get coords native "Geoposition_coords_Getter";
 
-
-  /** @domName Geoposition.timestamp */
+  @DocsEditable
+  @DomName('Geoposition.timestamp')
   int get timestamp native "Geoposition_timestamp_Getter";
 
 }
@@ -12332,11 +12096,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLHRElement
+@DocsEditable
+@DomName('HTMLHRElement')
 class HRElement extends _Element_Merged {
   HRElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory HRElement() => document.$dom_createElement("hr");
 
 }
@@ -12347,20 +12112,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HashChangeEvent
+@DocsEditable
+@DomName('HashChangeEvent')
 class HashChangeEvent extends Event {
   HashChangeEvent.internal() : super.internal();
 
-
-  /** @domName HashChangeEvent.newURL */
+  @DocsEditable
+  @DomName('HashChangeEvent.newURL')
   String get newUrl native "HashChangeEvent_newURL_Getter";
 
-
-  /** @domName HashChangeEvent.oldURL */
+  @DocsEditable
+  @DomName('HashChangeEvent.oldURL')
   String get oldUrl native "HashChangeEvent_oldURL_Getter";
 
-
-  /** @domName HashChangeEvent.initHashChangeEvent */
+  @DocsEditable
+  @DomName('HashChangeEvent.initHashChangeEvent')
   void initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) native "HashChangeEvent_initHashChangeEvent_Callback";
 
 }
@@ -12371,11 +12137,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLHeadElement
+@DocsEditable
+@DomName('HTMLHeadElement')
 class HeadElement extends _Element_Merged {
   HeadElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory HeadElement() => document.$dom_createElement("head");
 
 }
@@ -12386,26 +12153,27 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLHeadingElement
+@DocsEditable
+@DomName('HTMLHeadingElement')
 class HeadingElement extends _Element_Merged {
   HeadingElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory HeadingElement.h1() => document.$dom_createElement("h1");
 
-  ///@docsEditable true
+  @DocsEditable
   factory HeadingElement.h2() => document.$dom_createElement("h2");
 
-  ///@docsEditable true
+  @DocsEditable
   factory HeadingElement.h3() => document.$dom_createElement("h3");
 
-  ///@docsEditable true
+  @DocsEditable
   factory HeadingElement.h4() => document.$dom_createElement("h4");
 
-  ///@docsEditable true
+  @DocsEditable
   factory HeadingElement.h5() => document.$dom_createElement("h5");
 
-  ///@docsEditable true
+  @DocsEditable
   factory HeadingElement.h6() => document.$dom_createElement("h6");
 
 }
@@ -12414,7 +12182,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName History; @docsEditable true
+
+@DocsEditable
+@DomName('History')
 class History extends NativeFieldWrapperClass1 implements HistoryBase {
 
   /**
@@ -12429,36 +12199,36 @@
   static bool get supportsState => true;
   History.internal();
 
-
-  /** @domName History.length */
+  @DocsEditable
+  @DomName('History.length')
   int get length native "History_length_Getter";
 
-
-  /** @domName History.state */
+  @DocsEditable
+  @DomName('History.state')
   dynamic get state native "History_state_Getter";
 
-
-  /** @domName History.back */
+  @DocsEditable
+  @DomName('History.back')
   void back() native "History_back_Callback";
 
-
-  /** @domName History.forward */
+  @DocsEditable
+  @DomName('History.forward')
   void forward() native "History_forward_Callback";
 
-
-  /** @domName History.go */
+  @DocsEditable
+  @DomName('History.go')
   void go(int distance) native "History_go_Callback";
 
-
-  /** @domName History.pushState */
+  @DocsEditable
+  @DomName('History.pushState')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
   void pushState(Object data, String title, [String url]) native "History_pushState_Callback";
 
-
-  /** @domName History.replaceState */
+  @DocsEditable
+  @DomName('History.replaceState')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -12472,12 +12242,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLAllCollection
+@DocsEditable
+@DomName('HTMLAllCollection')
 class HtmlAllCollection extends NativeFieldWrapperClass1 implements List<Node> {
   HtmlAllCollection.internal();
 
-
-  /** @domName HTMLAllCollection.length */
+  @DocsEditable
+  @DomName('HTMLAllCollection.length')
   int get length native "HTMLAllCollection_length_Getter";
 
   Node operator[](int index) native "HTMLAllCollection_item_Callback";
@@ -12498,50 +12269,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Node element) => Collections.contains(this, element);
+  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Node element)) => Collections.forEach(this, f);
+  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Node element)) => new MappedList<Node, dynamic>(this, f);
+  List mappedBy(f(Node element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Node> where(bool f(Node element)) => new WhereIterable<Node>(this, f);
+  Iterable<Node> where(bool f(Node element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Node element)) => Collections.every(this, f);
+  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Node element)) => Collections.any(this, f);
+  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);
 
   List<Node> toList() => new List<Node>.from(this);
   Set<Node> toSet() => new Set<Node>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Node> take(int n) => new ListView<Node>(this, 0, n);
+  List<Node> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Node> takeWhile(bool test(Node value)) {
-    return new TakeWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Node> skip(int n) => new ListView<Node>(this, n, null);
+  List<Node> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Node> skipWhile(bool test(Node value)) {
-    return new SkipWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Node firstMatching(bool test(Node value), { Node orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Node lastMatching(bool test(Node value), {Node orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Node singleMatching(bool test(Node value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Node elementAt(int index) {
@@ -12599,16 +12370,36 @@
     throw new StateError("More than one element");
   }
 
-  Node min([int compare(Node a, Node b)]) => Collections.min(this, compare);
+  Node min([int compare(Node a, Node b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Node max([int compare(Node a, Node b)]) => Collections.max(this, compare);
+  Node max([int compare(Node a, Node b)]) => IterableMixinWorkaround.max(this, compare);
 
   Node removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Node removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Node element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Node element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
@@ -12628,16 +12419,16 @@
 
   // -- end List<Node> mixins.
 
-
-  /** @domName HTMLAllCollection.item */
+  @DocsEditable
+  @DomName('HTMLAllCollection.item')
   Node item(int index) native "HTMLAllCollection_item_Callback";
 
-
-  /** @domName HTMLAllCollection.namedItem */
+  @DocsEditable
+  @DomName('HTMLAllCollection.namedItem')
   Node namedItem(String name) native "HTMLAllCollection_namedItem_Callback";
 
-
-  /** @domName HTMLAllCollection.tags */
+  @DocsEditable
+  @DomName('HTMLAllCollection.tags')
   List<Node> tags(String name) native "HTMLAllCollection_tags_Callback";
 
 }
@@ -12648,12 +12439,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLCollection
+@DocsEditable
+@DomName('HTMLCollection')
 class HtmlCollection extends NativeFieldWrapperClass1 implements List<Node> {
   HtmlCollection.internal();
 
-
-  /** @domName HTMLCollection.length */
+  @DocsEditable
+  @DomName('HTMLCollection.length')
   int get length native "HTMLCollection_length_Getter";
 
   Node operator[](int index) native "HTMLCollection_item_Callback";
@@ -12674,50 +12466,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Node element) => Collections.contains(this, element);
+  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Node element)) => Collections.forEach(this, f);
+  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Node element)) => new MappedList<Node, dynamic>(this, f);
+  List mappedBy(f(Node element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Node> where(bool f(Node element)) => new WhereIterable<Node>(this, f);
+  Iterable<Node> where(bool f(Node element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Node element)) => Collections.every(this, f);
+  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Node element)) => Collections.any(this, f);
+  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);
 
   List<Node> toList() => new List<Node>.from(this);
   Set<Node> toSet() => new Set<Node>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Node> take(int n) => new ListView<Node>(this, 0, n);
+  List<Node> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Node> takeWhile(bool test(Node value)) {
-    return new TakeWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Node> skip(int n) => new ListView<Node>(this, n, null);
+  List<Node> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Node> skipWhile(bool test(Node value)) {
-    return new SkipWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Node firstMatching(bool test(Node value), { Node orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Node lastMatching(bool test(Node value), {Node orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Node singleMatching(bool test(Node value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Node elementAt(int index) {
@@ -12775,16 +12567,36 @@
     throw new StateError("More than one element");
   }
 
-  Node min([int compare(Node a, Node b)]) => Collections.min(this, compare);
+  Node min([int compare(Node a, Node b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Node max([int compare(Node a, Node b)]) => Collections.max(this, compare);
+  Node max([int compare(Node a, Node b)]) => IterableMixinWorkaround.max(this, compare);
 
   Node removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Node removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Node element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Node element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
@@ -12804,12 +12616,12 @@
 
   // -- end List<Node> mixins.
 
-
-  /** @domName HTMLCollection.item */
+  @DocsEditable
+  @DomName('HTMLCollection.item')
   Node item(int index) native "HTMLCollection_item_Callback";
 
-
-  /** @domName HTMLCollection.namedItem */
+  @DocsEditable
+  @DomName('HTMLCollection.namedItem')
   Node namedItem(String name) native "HTMLCollection_namedItem_Callback";
 
 }
@@ -12820,28 +12632,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLDocument
+@DocsEditable
+@DomName('HTMLDocument')
 class HtmlDocument extends Document {
   HtmlDocument.internal() : super.internal();
 
-
-  /** @domName HTMLDocument.activeElement */
+  @DocsEditable
+  @DomName('HTMLDocument.activeElement')
   Element get activeElement native "HTMLDocument_activeElement_Getter";
 
-  /** @domName Document.body */
+  @DomName('Document.body')
   BodyElement get body => document.$dom_body;
 
-  /** @domName Document.body */
+  @DomName('Document.body')
   void set body(BodyElement value) {
     document.$dom_body = value;
   }
 
-  /** @domName Document.caretRangeFromPoint */
+  @DomName('Document.caretRangeFromPoint')
   Range caretRangeFromPoint(int x, int y) {
     return document.$dom_caretRangeFromPoint(x, y);
   }
 
-  /** @domName Document.elementFromPoint */
+  @DomName('Document.elementFromPoint')
   Element elementFromPoint(int x, int y) {
     return document.$dom_elementFromPoint(x, y);
   }
@@ -12879,72 +12692,73 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
+  @DomName('Document.getCSSCanvasContext')
   CanvasRenderingContext getCssCanvasContext(String contextId, String name,
       int width, int height) {
     return document.$dom_getCssCanvasContext(contextId, name, width, height);
   }
 
-  /** @domName Document.head */
+  @DomName('Document.head')
   HeadElement get head => document.$dom_head;
 
-  /** @domName Document.lastModified */
+  @DomName('Document.lastModified')
   String get lastModified => document.$dom_lastModified;
 
-  /** @domName Document.preferredStylesheetSet */
+  @DomName('Document.preferredStylesheetSet')
   String get preferredStylesheetSet => document.$dom_preferredStylesheetSet;
 
-  /** @domName Document.referrer */
+  @DomName('Document.referrer')
   String get referrer => document.$dom_referrer;
 
-  /** @domName Document.selectedStylesheetSet */
+  @DomName('Document.selectedStylesheetSet')
   String get selectedStylesheetSet => document.$dom_selectedStylesheetSet;
   void set selectedStylesheetSet(String value) {
     document.$dom_selectedStylesheetSet = value;
   }
 
-  /** @domName Document.styleSheets */
+  @DomName('Document.styleSheets')
   List<StyleSheet> get styleSheets => document.$dom_styleSheets;
 
-  /** @domName Document.title */
+  @DomName('Document.title')
   String get title => document.$dom_title;
 
-  /** @domName Document.title */
+  @DomName('Document.title')
   void set title(String value) {
     document.$dom_title = value;
   }
 
-  /** @domName Document.webkitCancelFullScreen */
+  @DomName('Document.webkitCancelFullScreen')
   void webkitCancelFullScreen() {
     document.$dom_webkitCancelFullScreen();
   }
 
-  /** @domName Document.webkitExitFullscreen */
+  @DomName('Document.webkitExitFullscreen')
   void webkitExitFullscreen() {
     document.$dom_webkitExitFullscreen();
   }
 
-  /** @domName Document.webkitExitPointerLock */
+  @DomName('Document.webkitExitPointerLock')
   void webkitExitPointerLock() {
     document.$dom_webkitExitPointerLock();
   }
 
-  /** @domName Document.webkitFullscreenElement */
+  @DomName('Document.webkitFullscreenElement')
   Element get webkitFullscreenElement => document.$dom_webkitFullscreenElement;
 
-  /** @domName Document.webkitFullscreenEnabled */
+  @DomName('Document.webkitFullscreenEnabled')
   bool get webkitFullscreenEnabled => document.$dom_webkitFullscreenEnabled;
 
-  /** @domName Document.webkitHidden */
+  @DomName('Document.webkitHidden')
   bool get webkitHidden => document.$dom_webkitHidden;
 
-  /** @domName Document.webkitIsFullScreen */
+  @DomName('Document.webkitIsFullScreen')
   bool get webkitIsFullScreen => document.$dom_webkitIsFullScreen;
 
-  /** @domName Document.webkitPointerLockElement */
+  @DomName('Document.webkitPointerLockElement')
   Element get webkitPointerLockElement =>
       document.$dom_webkitPointerLockElement;
 
-  /** @domName Document.webkitVisibilityState */
+  @DomName('Document.webkitVisibilityState')
   String get webkitVisibilityState => document.$dom_webkitVisibilityState;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12954,11 +12768,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLHtmlElement
+@DocsEditable
+@DomName('HTMLHtmlElement')
 class HtmlElement extends _Element_Merged {
   HtmlElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory HtmlElement() => document.$dom_createElement("html");
 
 }
@@ -12969,12 +12784,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLFormControlsCollection
+@DocsEditable
+@DomName('HTMLFormControlsCollection')
 class HtmlFormControlsCollection extends HtmlCollection {
   HtmlFormControlsCollection.internal() : super.internal();
 
-
-  /** @domName HTMLFormControlsCollection.namedItem */
+  @DocsEditable
+  @DomName('HTMLFormControlsCollection.namedItem')
   Node namedItem(String name) native "HTMLFormControlsCollection_namedItem_Callback";
 
 }
@@ -12985,38 +12801,15 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLOptionsCollection
+@DocsEditable
+@DomName('HTMLOptionsCollection')
 class HtmlOptionsCollection extends HtmlCollection {
   HtmlOptionsCollection.internal() : super.internal();
 
-
-  /** @domName HTMLOptionsCollection.length */
-  int get length native "HTMLOptionsCollection_length_Getter";
-
-
-  /** @domName HTMLOptionsCollection.length */
-  void set length(int value) native "HTMLOptionsCollection_length_Setter";
-
-
-  /** @domName HTMLOptionsCollection.selectedIndex */
-  int get selectedIndex native "HTMLOptionsCollection_selectedIndex_Getter";
-
-
-  /** @domName HTMLOptionsCollection.selectedIndex */
-  void set selectedIndex(int value) native "HTMLOptionsCollection_selectedIndex_Setter";
-
-
-  /** @domName HTMLOptionsCollection.numericIndexSetter */
+  @DocsEditable
+  @DomName('HTMLOptionsCollection.numericIndexSetter')
   void operator[]=(int index, Node value) native "HTMLOptionsCollection_numericIndexSetter_Callback";
 
-
-  /** @domName HTMLOptionsCollection.namedItem */
-  Node namedItem(String name) native "HTMLOptionsCollection_namedItem_Callback";
-
-
-  /** @domName HTMLOptionsCollection.remove */
-  void remove(int index) native "HTMLOptionsCollection_remove_Callback";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -13048,7 +12841,7 @@
  * * [JS XMLHttpRequest](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest)
  * * [Using XMLHttpRequest](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Using_XMLHttpRequest)
  */
-/// @domName XMLHttpRequest
+@DomName('XMLHttpRequest')
 class HttpRequest extends EventTarget {
   /**
    * Creates a URL get request for the specified `url`.
@@ -13097,11 +12890,12 @@
 
   static const EventStreamProvider<ProgressEvent> readyStateChangeEvent = const EventStreamProvider<ProgressEvent>('readystatechange');
 
-  ///@docsEditable true
+  @DocsEditable
   factory HttpRequest() => HttpRequest._create();
   static HttpRequest _create() native "XMLHttpRequest_constructor_Callback";
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   HttpRequestEvents get on =>
     new HttpRequestEvents(this);
 
@@ -13115,88 +12909,88 @@
 
   static const int UNSENT = 0;
 
-
-  /** @domName XMLHttpRequest.readyState */
+  @DocsEditable
+  @DomName('XMLHttpRequest.readyState')
   int get readyState native "XMLHttpRequest_readyState_Getter";
 
-
-  /** @domName XMLHttpRequest.response */
+  @DocsEditable
+  @DomName('XMLHttpRequest.response')
   Object get response native "XMLHttpRequest_response_Getter";
 
-
-  /** @domName XMLHttpRequest.responseText */
+  @DocsEditable
+  @DomName('XMLHttpRequest.responseText')
   String get responseText native "XMLHttpRequest_responseText_Getter";
 
-
-  /** @domName XMLHttpRequest.responseType */
+  @DocsEditable
+  @DomName('XMLHttpRequest.responseType')
   String get responseType native "XMLHttpRequest_responseType_Getter";
 
-
-  /** @domName XMLHttpRequest.responseType */
+  @DocsEditable
+  @DomName('XMLHttpRequest.responseType')
   void set responseType(String value) native "XMLHttpRequest_responseType_Setter";
 
-
-  /** @domName XMLHttpRequest.responseXML */
+  @DocsEditable
+  @DomName('XMLHttpRequest.responseXML')
   Document get responseXml native "XMLHttpRequest_responseXML_Getter";
 
-
-  /** @domName XMLHttpRequest.status */
+  @DocsEditable
+  @DomName('XMLHttpRequest.status')
   int get status native "XMLHttpRequest_status_Getter";
 
-
-  /** @domName XMLHttpRequest.statusText */
+  @DocsEditable
+  @DomName('XMLHttpRequest.statusText')
   String get statusText native "XMLHttpRequest_statusText_Getter";
 
-
-  /** @domName XMLHttpRequest.upload */
+  @DocsEditable
+  @DomName('XMLHttpRequest.upload')
   HttpRequestUpload get upload native "XMLHttpRequest_upload_Getter";
 
-
-  /** @domName XMLHttpRequest.withCredentials */
+  @DocsEditable
+  @DomName('XMLHttpRequest.withCredentials')
   bool get withCredentials native "XMLHttpRequest_withCredentials_Getter";
 
-
-  /** @domName XMLHttpRequest.withCredentials */
+  @DocsEditable
+  @DomName('XMLHttpRequest.withCredentials')
   void set withCredentials(bool value) native "XMLHttpRequest_withCredentials_Setter";
 
-
-  /** @domName XMLHttpRequest.abort */
+  @DocsEditable
+  @DomName('XMLHttpRequest.abort')
   void abort() native "XMLHttpRequest_abort_Callback";
 
-
-  /** @domName XMLHttpRequest.addEventListener */
+  @DocsEditable
+  @DomName('XMLHttpRequest.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequest_addEventListener_Callback";
 
-
-  /** @domName XMLHttpRequest.dispatchEvent */
+  @DocsEditable
+  @DomName('XMLHttpRequest.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "XMLHttpRequest_dispatchEvent_Callback";
 
-
-  /** @domName XMLHttpRequest.getAllResponseHeaders */
+  @DocsEditable
+  @DomName('XMLHttpRequest.getAllResponseHeaders')
   String getAllResponseHeaders() native "XMLHttpRequest_getAllResponseHeaders_Callback";
 
-
-  /** @domName XMLHttpRequest.getResponseHeader */
+  @DocsEditable
+  @DomName('XMLHttpRequest.getResponseHeader')
   String getResponseHeader(String header) native "XMLHttpRequest_getResponseHeader_Callback";
 
-
-  /** @domName XMLHttpRequest.open */
+  @DocsEditable
+  @DomName('XMLHttpRequest.open')
   void open(String method, String url, [bool async, String user, String password]) native "XMLHttpRequest_open_Callback";
 
-
-  /** @domName XMLHttpRequest.overrideMimeType */
+  @DocsEditable
+  @DomName('XMLHttpRequest.overrideMimeType')
   void overrideMimeType(String override) native "XMLHttpRequest_overrideMimeType_Callback";
 
-
-  /** @domName XMLHttpRequest.removeEventListener */
+  @DocsEditable
+  @DomName('XMLHttpRequest.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequest_removeEventListener_Callback";
 
-
-  /** @domName XMLHttpRequest.send */
+  @DocsEditable
+  @DomName('XMLHttpRequest.send')
   void send([data]) native "XMLHttpRequest_send_Callback";
 
-
-  /** @domName XMLHttpRequest.setRequestHeader */
+  @DocsEditable
+  @DomName('XMLHttpRequest.setRequestHeader')
   void setRequestHeader(String header, String value) native "XMLHttpRequest_setRequestHeader_Callback";
 
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
@@ -13215,30 +13009,30 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class HttpRequestEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   HttpRequestEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get load => this['load'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadEnd => this['loadend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadStart => this['loadstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get progress => this['progress'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get readyStateChange => this['readystatechange'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13248,7 +13042,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName XMLHttpRequestException
+@DocsEditable
+@DomName('XMLHttpRequestException')
 class HttpRequestException extends NativeFieldWrapperClass1 {
   HttpRequestException.internal();
 
@@ -13256,20 +13051,20 @@
 
   static const int NETWORK_ERR = 101;
 
-
-  /** @domName XMLHttpRequestException.code */
+  @DocsEditable
+  @DomName('XMLHttpRequestException.code')
   int get code native "XMLHttpRequestException_code_Getter";
 
-
-  /** @domName XMLHttpRequestException.message */
+  @DocsEditable
+  @DomName('XMLHttpRequestException.message')
   String get message native "XMLHttpRequestException_message_Getter";
 
-
-  /** @domName XMLHttpRequestException.name */
+  @DocsEditable
+  @DomName('XMLHttpRequestException.name')
   String get name native "XMLHttpRequestException_name_Getter";
 
-
-  /** @domName XMLHttpRequestException.toString */
+  @DocsEditable
+  @DomName('XMLHttpRequestException.toString')
   String toString() native "XMLHttpRequestException_toString_Callback";
 
 }
@@ -13280,16 +13075,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName XMLHttpRequestProgressEvent
+@DocsEditable
+@DomName('XMLHttpRequestProgressEvent')
 class HttpRequestProgressEvent extends ProgressEvent {
   HttpRequestProgressEvent.internal() : super.internal();
 
-
-  /** @domName XMLHttpRequestProgressEvent.position */
+  @DocsEditable
+  @DomName('XMLHttpRequestProgressEvent.position')
   int get position native "XMLHttpRequestProgressEvent_position_Getter";
 
-
-  /** @domName XMLHttpRequestProgressEvent.totalSize */
+  @DocsEditable
+  @DomName('XMLHttpRequestProgressEvent.totalSize')
   int get totalSize native "XMLHttpRequestProgressEvent_totalSize_Getter";
 
 }
@@ -13300,7 +13096,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName XMLHttpRequestUpload
+@DocsEditable
+@DomName('XMLHttpRequestUpload')
 class HttpRequestUpload extends EventTarget {
   HttpRequestUpload.internal() : super.internal();
 
@@ -13316,20 +13113,21 @@
 
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   HttpRequestUploadEvents get on =>
     new HttpRequestUploadEvents(this);
 
-
-  /** @domName XMLHttpRequestUpload.addEventListener */
+  @DocsEditable
+  @DomName('XMLHttpRequestUpload.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestUpload_addEventListener_Callback";
 
-
-  /** @domName XMLHttpRequestUpload.dispatchEvent */
+  @DocsEditable
+  @DomName('XMLHttpRequestUpload.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "XMLHttpRequestUpload_dispatchEvent_Callback";
 
-
-  /** @domName XMLHttpRequestUpload.removeEventListener */
+  @DocsEditable
+  @DomName('XMLHttpRequestUpload.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestUpload_removeEventListener_Callback";
 
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
@@ -13346,27 +13144,27 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class HttpRequestUploadEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   HttpRequestUploadEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get load => this['load'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadEnd => this['loadend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadStart => this['loadstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get progress => this['progress'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13376,63 +13174,64 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLIFrameElement
+@DocsEditable
+@DomName('HTMLIFrameElement')
 class IFrameElement extends _Element_Merged {
   IFrameElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory IFrameElement() => document.$dom_createElement("iframe");
 
-
-  /** @domName HTMLIFrameElement.contentWindow */
+  @DocsEditable
+  @DomName('HTMLIFrameElement.contentWindow')
   WindowBase get contentWindow native "HTMLIFrameElement_contentWindow_Getter";
 
-
-  /** @domName HTMLIFrameElement.height */
+  @DocsEditable
+  @DomName('HTMLIFrameElement.height')
   String get height native "HTMLIFrameElement_height_Getter";
 
-
-  /** @domName HTMLIFrameElement.height */
+  @DocsEditable
+  @DomName('HTMLIFrameElement.height')
   void set height(String value) native "HTMLIFrameElement_height_Setter";
 
-
-  /** @domName HTMLIFrameElement.name */
+  @DocsEditable
+  @DomName('HTMLIFrameElement.name')
   String get name native "HTMLIFrameElement_name_Getter";
 
-
-  /** @domName HTMLIFrameElement.name */
+  @DocsEditable
+  @DomName('HTMLIFrameElement.name')
   void set name(String value) native "HTMLIFrameElement_name_Setter";
 
-
-  /** @domName HTMLIFrameElement.sandbox */
+  @DocsEditable
+  @DomName('HTMLIFrameElement.sandbox')
   String get sandbox native "HTMLIFrameElement_sandbox_Getter";
 
-
-  /** @domName HTMLIFrameElement.sandbox */
+  @DocsEditable
+  @DomName('HTMLIFrameElement.sandbox')
   void set sandbox(String value) native "HTMLIFrameElement_sandbox_Setter";
 
-
-  /** @domName HTMLIFrameElement.src */
+  @DocsEditable
+  @DomName('HTMLIFrameElement.src')
   String get src native "HTMLIFrameElement_src_Getter";
 
-
-  /** @domName HTMLIFrameElement.src */
+  @DocsEditable
+  @DomName('HTMLIFrameElement.src')
   void set src(String value) native "HTMLIFrameElement_src_Setter";
 
-
-  /** @domName HTMLIFrameElement.srcdoc */
+  @DocsEditable
+  @DomName('HTMLIFrameElement.srcdoc')
   String get srcdoc native "HTMLIFrameElement_srcdoc_Getter";
 
-
-  /** @domName HTMLIFrameElement.srcdoc */
+  @DocsEditable
+  @DomName('HTMLIFrameElement.srcdoc')
   void set srcdoc(String value) native "HTMLIFrameElement_srcdoc_Setter";
 
-
-  /** @domName HTMLIFrameElement.width */
+  @DocsEditable
+  @DomName('HTMLIFrameElement.width')
   String get width native "HTMLIFrameElement_width_Getter";
 
-
-  /** @domName HTMLIFrameElement.width */
+  @DocsEditable
+  @DomName('HTMLIFrameElement.width')
   void set width(String value) native "HTMLIFrameElement_width_Setter";
 
 }
@@ -13443,20 +13242,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ImageData
+@DocsEditable
+@DomName('ImageData')
 class ImageData extends NativeFieldWrapperClass1 {
   ImageData.internal();
 
-
-  /** @domName ImageData.data */
+  @DocsEditable
+  @DomName('ImageData.data')
   Uint8ClampedArray get data native "ImageData_data_Getter";
 
-
-  /** @domName ImageData.height */
+  @DocsEditable
+  @DomName('ImageData.height')
   int get height native "ImageData_height_Getter";
 
-
-  /** @domName ImageData.width */
+  @DocsEditable
+  @DomName('ImageData.width')
   int get width native "ImageData_width_Getter";
 
 }
@@ -13467,11 +13267,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLImageElement
+@DocsEditable
+@DomName('HTMLImageElement')
 class ImageElement extends _Element_Merged {
   ImageElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory ImageElement({String src, int width, int height}) {
     var e = document.$dom_createElement("img");
     if (src != null) e.src = src;
@@ -13480,96 +13281,96 @@
     return e;
   }
 
-
-  /** @domName HTMLImageElement.alt */
+  @DocsEditable
+  @DomName('HTMLImageElement.alt')
   String get alt native "HTMLImageElement_alt_Getter";
 
-
-  /** @domName HTMLImageElement.alt */
+  @DocsEditable
+  @DomName('HTMLImageElement.alt')
   void set alt(String value) native "HTMLImageElement_alt_Setter";
 
-
-  /** @domName HTMLImageElement.border */
+  @DocsEditable
+  @DomName('HTMLImageElement.border')
   String get border native "HTMLImageElement_border_Getter";
 
-
-  /** @domName HTMLImageElement.border */
+  @DocsEditable
+  @DomName('HTMLImageElement.border')
   void set border(String value) native "HTMLImageElement_border_Setter";
 
-
-  /** @domName HTMLImageElement.complete */
+  @DocsEditable
+  @DomName('HTMLImageElement.complete')
   bool get complete native "HTMLImageElement_complete_Getter";
 
-
-  /** @domName HTMLImageElement.crossOrigin */
+  @DocsEditable
+  @DomName('HTMLImageElement.crossOrigin')
   String get crossOrigin native "HTMLImageElement_crossOrigin_Getter";
 
-
-  /** @domName HTMLImageElement.crossOrigin */
+  @DocsEditable
+  @DomName('HTMLImageElement.crossOrigin')
   void set crossOrigin(String value) native "HTMLImageElement_crossOrigin_Setter";
 
-
-  /** @domName HTMLImageElement.height */
+  @DocsEditable
+  @DomName('HTMLImageElement.height')
   int get height native "HTMLImageElement_height_Getter";
 
-
-  /** @domName HTMLImageElement.height */
+  @DocsEditable
+  @DomName('HTMLImageElement.height')
   void set height(int value) native "HTMLImageElement_height_Setter";
 
-
-  /** @domName HTMLImageElement.isMap */
+  @DocsEditable
+  @DomName('HTMLImageElement.isMap')
   bool get isMap native "HTMLImageElement_isMap_Getter";
 
-
-  /** @domName HTMLImageElement.isMap */
+  @DocsEditable
+  @DomName('HTMLImageElement.isMap')
   void set isMap(bool value) native "HTMLImageElement_isMap_Setter";
 
-
-  /** @domName HTMLImageElement.lowsrc */
+  @DocsEditable
+  @DomName('HTMLImageElement.lowsrc')
   String get lowsrc native "HTMLImageElement_lowsrc_Getter";
 
-
-  /** @domName HTMLImageElement.lowsrc */
+  @DocsEditable
+  @DomName('HTMLImageElement.lowsrc')
   void set lowsrc(String value) native "HTMLImageElement_lowsrc_Setter";
 
-
-  /** @domName HTMLImageElement.naturalHeight */
+  @DocsEditable
+  @DomName('HTMLImageElement.naturalHeight')
   int get naturalHeight native "HTMLImageElement_naturalHeight_Getter";
 
-
-  /** @domName HTMLImageElement.naturalWidth */
+  @DocsEditable
+  @DomName('HTMLImageElement.naturalWidth')
   int get naturalWidth native "HTMLImageElement_naturalWidth_Getter";
 
-
-  /** @domName HTMLImageElement.src */
+  @DocsEditable
+  @DomName('HTMLImageElement.src')
   String get src native "HTMLImageElement_src_Getter";
 
-
-  /** @domName HTMLImageElement.src */
+  @DocsEditable
+  @DomName('HTMLImageElement.src')
   void set src(String value) native "HTMLImageElement_src_Setter";
 
-
-  /** @domName HTMLImageElement.useMap */
+  @DocsEditable
+  @DomName('HTMLImageElement.useMap')
   String get useMap native "HTMLImageElement_useMap_Getter";
 
-
-  /** @domName HTMLImageElement.useMap */
+  @DocsEditable
+  @DomName('HTMLImageElement.useMap')
   void set useMap(String value) native "HTMLImageElement_useMap_Setter";
 
-
-  /** @domName HTMLImageElement.width */
+  @DocsEditable
+  @DomName('HTMLImageElement.width')
   int get width native "HTMLImageElement_width_Getter";
 
-
-  /** @domName HTMLImageElement.width */
+  @DocsEditable
+  @DomName('HTMLImageElement.width')
   void set width(int value) native "HTMLImageElement_width_Setter";
 
-
-  /** @domName HTMLImageElement.x */
+  @DocsEditable
+  @DomName('HTMLImageElement.x')
   int get x native "HTMLImageElement_x_Getter";
 
-
-  /** @domName HTMLImageElement.y */
+  @DocsEditable
+  @DomName('HTMLImageElement.y')
   int get y native "HTMLImageElement_y_Getter";
 
 }
@@ -13578,7 +13379,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLInputElement
+@DocsEditable
+@DomName('HTMLInputElement')
 class InputElement extends _Element_Merged implements
     HiddenInputElement,
     SearchInputElement,
@@ -13604,7 +13406,6 @@
     ButtonInputElement
      {
 
-  ///@docsEditable true
   factory InputElement({String type}) {
     var e = document.$dom_createElement("input");
     if (type != null) {
@@ -13619,387 +13420,388 @@
 
   static const EventStreamProvider<Event> speechChangeEvent = const EventStreamProvider<Event>('webkitSpeechChange');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   InputElementEvents get on =>
     new InputElementEvents(this);
 
-
-  /** @domName HTMLInputElement.accept */
+  @DocsEditable
+  @DomName('HTMLInputElement.accept')
   String get accept native "HTMLInputElement_accept_Getter";
 
-
-  /** @domName HTMLInputElement.accept */
+  @DocsEditable
+  @DomName('HTMLInputElement.accept')
   void set accept(String value) native "HTMLInputElement_accept_Setter";
 
-
-  /** @domName HTMLInputElement.alt */
+  @DocsEditable
+  @DomName('HTMLInputElement.alt')
   String get alt native "HTMLInputElement_alt_Getter";
 
-
-  /** @domName HTMLInputElement.alt */
+  @DocsEditable
+  @DomName('HTMLInputElement.alt')
   void set alt(String value) native "HTMLInputElement_alt_Setter";
 
-
-  /** @domName HTMLInputElement.autocomplete */
+  @DocsEditable
+  @DomName('HTMLInputElement.autocomplete')
   String get autocomplete native "HTMLInputElement_autocomplete_Getter";
 
-
-  /** @domName HTMLInputElement.autocomplete */
+  @DocsEditable
+  @DomName('HTMLInputElement.autocomplete')
   void set autocomplete(String value) native "HTMLInputElement_autocomplete_Setter";
 
-
-  /** @domName HTMLInputElement.autofocus */
+  @DocsEditable
+  @DomName('HTMLInputElement.autofocus')
   bool get autofocus native "HTMLInputElement_autofocus_Getter";
 
-
-  /** @domName HTMLInputElement.autofocus */
+  @DocsEditable
+  @DomName('HTMLInputElement.autofocus')
   void set autofocus(bool value) native "HTMLInputElement_autofocus_Setter";
 
-
-  /** @domName HTMLInputElement.checked */
+  @DocsEditable
+  @DomName('HTMLInputElement.checked')
   bool get checked native "HTMLInputElement_checked_Getter";
 
-
-  /** @domName HTMLInputElement.checked */
+  @DocsEditable
+  @DomName('HTMLInputElement.checked')
   void set checked(bool value) native "HTMLInputElement_checked_Setter";
 
-
-  /** @domName HTMLInputElement.defaultChecked */
+  @DocsEditable
+  @DomName('HTMLInputElement.defaultChecked')
   bool get defaultChecked native "HTMLInputElement_defaultChecked_Getter";
 
-
-  /** @domName HTMLInputElement.defaultChecked */
+  @DocsEditable
+  @DomName('HTMLInputElement.defaultChecked')
   void set defaultChecked(bool value) native "HTMLInputElement_defaultChecked_Setter";
 
-
-  /** @domName HTMLInputElement.defaultValue */
+  @DocsEditable
+  @DomName('HTMLInputElement.defaultValue')
   String get defaultValue native "HTMLInputElement_defaultValue_Getter";
 
-
-  /** @domName HTMLInputElement.defaultValue */
+  @DocsEditable
+  @DomName('HTMLInputElement.defaultValue')
   void set defaultValue(String value) native "HTMLInputElement_defaultValue_Setter";
 
-
-  /** @domName HTMLInputElement.dirName */
+  @DocsEditable
+  @DomName('HTMLInputElement.dirName')
   String get dirName native "HTMLInputElement_dirName_Getter";
 
-
-  /** @domName HTMLInputElement.dirName */
+  @DocsEditable
+  @DomName('HTMLInputElement.dirName')
   void set dirName(String value) native "HTMLInputElement_dirName_Setter";
 
-
-  /** @domName HTMLInputElement.disabled */
+  @DocsEditable
+  @DomName('HTMLInputElement.disabled')
   bool get disabled native "HTMLInputElement_disabled_Getter";
 
-
-  /** @domName HTMLInputElement.disabled */
+  @DocsEditable
+  @DomName('HTMLInputElement.disabled')
   void set disabled(bool value) native "HTMLInputElement_disabled_Setter";
 
-
-  /** @domName HTMLInputElement.files */
+  @DocsEditable
+  @DomName('HTMLInputElement.files')
   List<File> get files native "HTMLInputElement_files_Getter";
 
-
-  /** @domName HTMLInputElement.files */
+  @DocsEditable
+  @DomName('HTMLInputElement.files')
   void set files(List<File> value) native "HTMLInputElement_files_Setter";
 
-
-  /** @domName HTMLInputElement.form */
+  @DocsEditable
+  @DomName('HTMLInputElement.form')
   FormElement get form native "HTMLInputElement_form_Getter";
 
-
-  /** @domName HTMLInputElement.formAction */
+  @DocsEditable
+  @DomName('HTMLInputElement.formAction')
   String get formAction native "HTMLInputElement_formAction_Getter";
 
-
-  /** @domName HTMLInputElement.formAction */
+  @DocsEditable
+  @DomName('HTMLInputElement.formAction')
   void set formAction(String value) native "HTMLInputElement_formAction_Setter";
 
-
-  /** @domName HTMLInputElement.formEnctype */
+  @DocsEditable
+  @DomName('HTMLInputElement.formEnctype')
   String get formEnctype native "HTMLInputElement_formEnctype_Getter";
 
-
-  /** @domName HTMLInputElement.formEnctype */
+  @DocsEditable
+  @DomName('HTMLInputElement.formEnctype')
   void set formEnctype(String value) native "HTMLInputElement_formEnctype_Setter";
 
-
-  /** @domName HTMLInputElement.formMethod */
+  @DocsEditable
+  @DomName('HTMLInputElement.formMethod')
   String get formMethod native "HTMLInputElement_formMethod_Getter";
 
-
-  /** @domName HTMLInputElement.formMethod */
+  @DocsEditable
+  @DomName('HTMLInputElement.formMethod')
   void set formMethod(String value) native "HTMLInputElement_formMethod_Setter";
 
-
-  /** @domName HTMLInputElement.formNoValidate */
+  @DocsEditable
+  @DomName('HTMLInputElement.formNoValidate')
   bool get formNoValidate native "HTMLInputElement_formNoValidate_Getter";
 
-
-  /** @domName HTMLInputElement.formNoValidate */
+  @DocsEditable
+  @DomName('HTMLInputElement.formNoValidate')
   void set formNoValidate(bool value) native "HTMLInputElement_formNoValidate_Setter";
 
-
-  /** @domName HTMLInputElement.formTarget */
+  @DocsEditable
+  @DomName('HTMLInputElement.formTarget')
   String get formTarget native "HTMLInputElement_formTarget_Getter";
 
-
-  /** @domName HTMLInputElement.formTarget */
+  @DocsEditable
+  @DomName('HTMLInputElement.formTarget')
   void set formTarget(String value) native "HTMLInputElement_formTarget_Setter";
 
-
-  /** @domName HTMLInputElement.height */
+  @DocsEditable
+  @DomName('HTMLInputElement.height')
   int get height native "HTMLInputElement_height_Getter";
 
-
-  /** @domName HTMLInputElement.height */
+  @DocsEditable
+  @DomName('HTMLInputElement.height')
   void set height(int value) native "HTMLInputElement_height_Setter";
 
-
-  /** @domName HTMLInputElement.incremental */
+  @DocsEditable
+  @DomName('HTMLInputElement.incremental')
   bool get incremental native "HTMLInputElement_incremental_Getter";
 
-
-  /** @domName HTMLInputElement.incremental */
+  @DocsEditable
+  @DomName('HTMLInputElement.incremental')
   void set incremental(bool value) native "HTMLInputElement_incremental_Setter";
 
-
-  /** @domName HTMLInputElement.indeterminate */
+  @DocsEditable
+  @DomName('HTMLInputElement.indeterminate')
   bool get indeterminate native "HTMLInputElement_indeterminate_Getter";
 
-
-  /** @domName HTMLInputElement.indeterminate */
+  @DocsEditable
+  @DomName('HTMLInputElement.indeterminate')
   void set indeterminate(bool value) native "HTMLInputElement_indeterminate_Setter";
 
-
-  /** @domName HTMLInputElement.labels */
+  @DocsEditable
+  @DomName('HTMLInputElement.labels')
   List<Node> get labels native "HTMLInputElement_labels_Getter";
 
-
-  /** @domName HTMLInputElement.list */
+  @DocsEditable
+  @DomName('HTMLInputElement.list')
   Element get list native "HTMLInputElement_list_Getter";
 
-
-  /** @domName HTMLInputElement.max */
+  @DocsEditable
+  @DomName('HTMLInputElement.max')
   String get max native "HTMLInputElement_max_Getter";
 
-
-  /** @domName HTMLInputElement.max */
+  @DocsEditable
+  @DomName('HTMLInputElement.max')
   void set max(String value) native "HTMLInputElement_max_Setter";
 
-
-  /** @domName HTMLInputElement.maxLength */
+  @DocsEditable
+  @DomName('HTMLInputElement.maxLength')
   int get maxLength native "HTMLInputElement_maxLength_Getter";
 
-
-  /** @domName HTMLInputElement.maxLength */
+  @DocsEditable
+  @DomName('HTMLInputElement.maxLength')
   void set maxLength(int value) native "HTMLInputElement_maxLength_Setter";
 
-
-  /** @domName HTMLInputElement.min */
+  @DocsEditable
+  @DomName('HTMLInputElement.min')
   String get min native "HTMLInputElement_min_Getter";
 
-
-  /** @domName HTMLInputElement.min */
+  @DocsEditable
+  @DomName('HTMLInputElement.min')
   void set min(String value) native "HTMLInputElement_min_Setter";
 
-
-  /** @domName HTMLInputElement.multiple */
+  @DocsEditable
+  @DomName('HTMLInputElement.multiple')
   bool get multiple native "HTMLInputElement_multiple_Getter";
 
-
-  /** @domName HTMLInputElement.multiple */
+  @DocsEditable
+  @DomName('HTMLInputElement.multiple')
   void set multiple(bool value) native "HTMLInputElement_multiple_Setter";
 
-
-  /** @domName HTMLInputElement.name */
+  @DocsEditable
+  @DomName('HTMLInputElement.name')
   String get name native "HTMLInputElement_name_Getter";
 
-
-  /** @domName HTMLInputElement.name */
+  @DocsEditable
+  @DomName('HTMLInputElement.name')
   void set name(String value) native "HTMLInputElement_name_Setter";
 
-
-  /** @domName HTMLInputElement.pattern */
+  @DocsEditable
+  @DomName('HTMLInputElement.pattern')
   String get pattern native "HTMLInputElement_pattern_Getter";
 
-
-  /** @domName HTMLInputElement.pattern */
+  @DocsEditable
+  @DomName('HTMLInputElement.pattern')
   void set pattern(String value) native "HTMLInputElement_pattern_Setter";
 
-
-  /** @domName HTMLInputElement.placeholder */
+  @DocsEditable
+  @DomName('HTMLInputElement.placeholder')
   String get placeholder native "HTMLInputElement_placeholder_Getter";
 
-
-  /** @domName HTMLInputElement.placeholder */
+  @DocsEditable
+  @DomName('HTMLInputElement.placeholder')
   void set placeholder(String value) native "HTMLInputElement_placeholder_Setter";
 
-
-  /** @domName HTMLInputElement.readOnly */
+  @DocsEditable
+  @DomName('HTMLInputElement.readOnly')
   bool get readOnly native "HTMLInputElement_readOnly_Getter";
 
-
-  /** @domName HTMLInputElement.readOnly */
+  @DocsEditable
+  @DomName('HTMLInputElement.readOnly')
   void set readOnly(bool value) native "HTMLInputElement_readOnly_Setter";
 
-
-  /** @domName HTMLInputElement.required */
+  @DocsEditable
+  @DomName('HTMLInputElement.required')
   bool get required native "HTMLInputElement_required_Getter";
 
-
-  /** @domName HTMLInputElement.required */
+  @DocsEditable
+  @DomName('HTMLInputElement.required')
   void set required(bool value) native "HTMLInputElement_required_Setter";
 
-
-  /** @domName HTMLInputElement.selectionDirection */
+  @DocsEditable
+  @DomName('HTMLInputElement.selectionDirection')
   String get selectionDirection native "HTMLInputElement_selectionDirection_Getter";
 
-
-  /** @domName HTMLInputElement.selectionDirection */
+  @DocsEditable
+  @DomName('HTMLInputElement.selectionDirection')
   void set selectionDirection(String value) native "HTMLInputElement_selectionDirection_Setter";
 
-
-  /** @domName HTMLInputElement.selectionEnd */
+  @DocsEditable
+  @DomName('HTMLInputElement.selectionEnd')
   int get selectionEnd native "HTMLInputElement_selectionEnd_Getter";
 
-
-  /** @domName HTMLInputElement.selectionEnd */
+  @DocsEditable
+  @DomName('HTMLInputElement.selectionEnd')
   void set selectionEnd(int value) native "HTMLInputElement_selectionEnd_Setter";
 
-
-  /** @domName HTMLInputElement.selectionStart */
+  @DocsEditable
+  @DomName('HTMLInputElement.selectionStart')
   int get selectionStart native "HTMLInputElement_selectionStart_Getter";
 
-
-  /** @domName HTMLInputElement.selectionStart */
+  @DocsEditable
+  @DomName('HTMLInputElement.selectionStart')
   void set selectionStart(int value) native "HTMLInputElement_selectionStart_Setter";
 
-
-  /** @domName HTMLInputElement.size */
+  @DocsEditable
+  @DomName('HTMLInputElement.size')
   int get size native "HTMLInputElement_size_Getter";
 
-
-  /** @domName HTMLInputElement.size */
+  @DocsEditable
+  @DomName('HTMLInputElement.size')
   void set size(int value) native "HTMLInputElement_size_Setter";
 
-
-  /** @domName HTMLInputElement.src */
+  @DocsEditable
+  @DomName('HTMLInputElement.src')
   String get src native "HTMLInputElement_src_Getter";
 
-
-  /** @domName HTMLInputElement.src */
+  @DocsEditable
+  @DomName('HTMLInputElement.src')
   void set src(String value) native "HTMLInputElement_src_Setter";
 
-
-  /** @domName HTMLInputElement.step */
+  @DocsEditable
+  @DomName('HTMLInputElement.step')
   String get step native "HTMLInputElement_step_Getter";
 
-
-  /** @domName HTMLInputElement.step */
+  @DocsEditable
+  @DomName('HTMLInputElement.step')
   void set step(String value) native "HTMLInputElement_step_Setter";
 
-
-  /** @domName HTMLInputElement.type */
+  @DocsEditable
+  @DomName('HTMLInputElement.type')
   String get type native "HTMLInputElement_type_Getter";
 
-
-  /** @domName HTMLInputElement.type */
+  @DocsEditable
+  @DomName('HTMLInputElement.type')
   void set type(String value) native "HTMLInputElement_type_Setter";
 
-
-  /** @domName HTMLInputElement.useMap */
+  @DocsEditable
+  @DomName('HTMLInputElement.useMap')
   String get useMap native "HTMLInputElement_useMap_Getter";
 
-
-  /** @domName HTMLInputElement.useMap */
+  @DocsEditable
+  @DomName('HTMLInputElement.useMap')
   void set useMap(String value) native "HTMLInputElement_useMap_Setter";
 
-
-  /** @domName HTMLInputElement.validationMessage */
+  @DocsEditable
+  @DomName('HTMLInputElement.validationMessage')
   String get validationMessage native "HTMLInputElement_validationMessage_Getter";
 
-
-  /** @domName HTMLInputElement.validity */
+  @DocsEditable
+  @DomName('HTMLInputElement.validity')
   ValidityState get validity native "HTMLInputElement_validity_Getter";
 
-
-  /** @domName HTMLInputElement.value */
+  @DocsEditable
+  @DomName('HTMLInputElement.value')
   String get value native "HTMLInputElement_value_Getter";
 
-
-  /** @domName HTMLInputElement.value */
+  @DocsEditable
+  @DomName('HTMLInputElement.value')
   void set value(String value) native "HTMLInputElement_value_Setter";
 
-
-  /** @domName HTMLInputElement.valueAsDate */
+  @DocsEditable
+  @DomName('HTMLInputElement.valueAsDate')
   Date get valueAsDate native "HTMLInputElement_valueAsDate_Getter";
 
-
-  /** @domName HTMLInputElement.valueAsDate */
+  @DocsEditable
+  @DomName('HTMLInputElement.valueAsDate')
   void set valueAsDate(Date value) native "HTMLInputElement_valueAsDate_Setter";
 
-
-  /** @domName HTMLInputElement.valueAsNumber */
+  @DocsEditable
+  @DomName('HTMLInputElement.valueAsNumber')
   num get valueAsNumber native "HTMLInputElement_valueAsNumber_Getter";
 
-
-  /** @domName HTMLInputElement.valueAsNumber */
+  @DocsEditable
+  @DomName('HTMLInputElement.valueAsNumber')
   void set valueAsNumber(num value) native "HTMLInputElement_valueAsNumber_Setter";
 
-
-  /** @domName HTMLInputElement.webkitEntries */
+  @DocsEditable
+  @DomName('HTMLInputElement.webkitEntries')
   List<Entry> get webkitEntries native "HTMLInputElement_webkitEntries_Getter";
 
-
-  /** @domName HTMLInputElement.webkitGrammar */
+  @DocsEditable
+  @DomName('HTMLInputElement.webkitGrammar')
   bool get webkitGrammar native "HTMLInputElement_webkitGrammar_Getter";
 
-
-  /** @domName HTMLInputElement.webkitGrammar */
+  @DocsEditable
+  @DomName('HTMLInputElement.webkitGrammar')
   void set webkitGrammar(bool value) native "HTMLInputElement_webkitGrammar_Setter";
 
-
-  /** @domName HTMLInputElement.webkitSpeech */
+  @DocsEditable
+  @DomName('HTMLInputElement.webkitSpeech')
   bool get webkitSpeech native "HTMLInputElement_webkitSpeech_Getter";
 
-
-  /** @domName HTMLInputElement.webkitSpeech */
+  @DocsEditable
+  @DomName('HTMLInputElement.webkitSpeech')
   void set webkitSpeech(bool value) native "HTMLInputElement_webkitSpeech_Setter";
 
-
-  /** @domName HTMLInputElement.webkitdirectory */
+  @DocsEditable
+  @DomName('HTMLInputElement.webkitdirectory')
   bool get webkitdirectory native "HTMLInputElement_webkitdirectory_Getter";
 
-
-  /** @domName HTMLInputElement.webkitdirectory */
+  @DocsEditable
+  @DomName('HTMLInputElement.webkitdirectory')
   void set webkitdirectory(bool value) native "HTMLInputElement_webkitdirectory_Setter";
 
-
-  /** @domName HTMLInputElement.width */
+  @DocsEditable
+  @DomName('HTMLInputElement.width')
   int get width native "HTMLInputElement_width_Getter";
 
-
-  /** @domName HTMLInputElement.width */
+  @DocsEditable
+  @DomName('HTMLInputElement.width')
   void set width(int value) native "HTMLInputElement_width_Setter";
 
-
-  /** @domName HTMLInputElement.willValidate */
+  @DocsEditable
+  @DomName('HTMLInputElement.willValidate')
   bool get willValidate native "HTMLInputElement_willValidate_Getter";
 
-
-  /** @domName HTMLInputElement.checkValidity */
+  @DocsEditable
+  @DomName('HTMLInputElement.checkValidity')
   bool checkValidity() native "HTMLInputElement_checkValidity_Callback";
 
-
-  /** @domName HTMLInputElement.select */
+  @DocsEditable
+  @DomName('HTMLInputElement.select')
   void select() native "HTMLInputElement_select_Callback";
 
-
-  /** @domName HTMLInputElement.setCustomValidity */
+  @DocsEditable
+  @DomName('HTMLInputElement.setCustomValidity')
   void setCustomValidity(String error) native "HTMLInputElement_setCustomValidity_Callback";
 
-  void setRangeText(/*DOMString*/ replacement, [/*unsigned long*/ start, /*unsigned long*/ end, /*DOMString*/ selectionMode]) {
+  void setRangeText(String replacement, [int start, int end, String selectionMode]) {
     if ((replacement is String || replacement == null) && !?start && !?end && !?selectionMode) {
       _setRangeText_1(replacement);
       return;
@@ -14011,19 +13813,19 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName HTMLInputElement.setRangeText_1 */
+  @DocsEditable
+  @DomName('HTMLInputElement.setRangeText_1')
   void _setRangeText_1(replacement) native "HTMLInputElement_setRangeText_1_Callback";
 
-
-  /** @domName HTMLInputElement.setRangeText_2 */
+  @DocsEditable
+  @DomName('HTMLInputElement.setRangeText_2')
   void _setRangeText_2(replacement, start, end, selectionMode) native "HTMLInputElement_setRangeText_2_Callback";
 
-
-  /** @domName HTMLInputElement.setSelectionRange */
+  @DocsEditable
+  @DomName('HTMLInputElement.setSelectionRange')
   void setSelectionRange(int start, int end, [String direction]) native "HTMLInputElement_setSelectionRange_Callback";
 
-  void stepDown([/*long*/ n]) {
+  void stepDown([int n]) {
     if (?n) {
       _stepDown_1(n);
       return;
@@ -14031,15 +13833,15 @@
     _stepDown_2();
   }
 
-
-  /** @domName HTMLInputElement.stepDown_1 */
+  @DocsEditable
+  @DomName('HTMLInputElement.stepDown_1')
   void _stepDown_1(n) native "HTMLInputElement_stepDown_1_Callback";
 
-
-  /** @domName HTMLInputElement.stepDown_2 */
+  @DocsEditable
+  @DomName('HTMLInputElement.stepDown_2')
   void _stepDown_2() native "HTMLInputElement_stepDown_2_Callback";
 
-  void stepUp([/*long*/ n]) {
+  void stepUp([int n]) {
     if (?n) {
       _stepUp_1(n);
       return;
@@ -14047,12 +13849,12 @@
     _stepUp_2();
   }
 
-
-  /** @domName HTMLInputElement.stepUp_1 */
+  @DocsEditable
+  @DomName('HTMLInputElement.stepUp_1')
   void _stepUp_1(n) native "HTMLInputElement_stepUp_1_Callback";
 
-
-  /** @domName HTMLInputElement.stepUp_2 */
+  @DocsEditable
+  @DomName('HTMLInputElement.stepUp_2')
   void _stepUp_2() native "HTMLInputElement_stepUp_2_Callback";
 
   Stream<Event> get onSpeechChange => speechChangeEvent.forTarget(this);
@@ -14068,40 +13870,40 @@
  * Exposes the functionality common between all InputElement types.
  */
 abstract class InputElementBase implements Element {
-  /// @domName HTMLInputElement.autofocus
+  @DomName('HTMLInputElement.autofocus')
   bool autofocus;
 
-  /// @domName HTMLInputElement.disabled
+  @DomName('HTMLInputElement.disabled')
   bool disabled;
 
-  /// @domName HTMLInputElement.incremental
+  @DomName('HTMLInputElement.incremental')
   bool incremental;
 
-  /// @domName HTMLInputElement.indeterminate
+  @DomName('HTMLInputElement.indeterminate')
   bool indeterminate;
 
-  /// @domName HTMLInputElement.labels
+  @DomName('HTMLInputElement.labels')
   List<Node> get labels;
 
-  /// @domName HTMLInputElement.name
+  @DomName('HTMLInputElement.name')
   String name;
 
-  /// @domName HTMLInputElement.validationMessage
+  @DomName('HTMLInputElement.validationMessage')
   String get validationMessage;
 
-  /// @domName HTMLInputElement.validity
+  @DomName('HTMLInputElement.validity')
   ValidityState get validity;
 
-  /// @domName HTMLInputElement.value
+  @DomName('HTMLInputElement.value')
   String value;
 
-  /// @domName HTMLInputElement.willValidate
+  @DomName('HTMLInputElement.willValidate')
   bool get willValidate;
 
-  /// @domName HTMLInputElement.checkValidity
+  @DomName('HTMLInputElement.checkValidity')
   bool checkValidity();
 
-  /// @domName HTMLInputElement.setCustomValidity
+  @DomName('HTMLInputElement.setCustomValidity')
   void setCustomValidity(String error);
 }
 
@@ -14117,40 +13919,40 @@
  * Base interface for all inputs which involve text editing.
  */
 abstract class TextInputElementBase implements InputElementBase {
-  /// @domName HTMLInputElement.autocomplete
+  @DomName('HTMLInputElement.autocomplete')
   String autocomplete;
 
-  /// @domName HTMLInputElement.maxLength
+  @DomName('HTMLInputElement.maxLength')
   int maxLength;
 
-  /// @domName HTMLInputElement.pattern
+  @DomName('HTMLInputElement.pattern')
   String pattern;
 
-  /// @domName HTMLInputElement.placeholder
+  @DomName('HTMLInputElement.placeholder')
   String placeholder;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
-  /// @domName HTMLInputElement.size
+  @DomName('HTMLInputElement.size')
   int size;
 
-  /// @domName HTMLInputElement.select
+  @DomName('HTMLInputElement.select')
   void select();
 
-  /// @domName HTMLInputElement.selectionDirection
+  @DomName('HTMLInputElement.selectionDirection')
   String selectionDirection;
 
-  /// @domName HTMLInputElement.selectionEnd
+  @DomName('HTMLInputElement.selectionEnd')
   int selectionEnd;
 
-  /// @domName HTMLInputElement.selectionStart
+  @DomName('HTMLInputElement.selectionStart')
   int selectionStart;
 
-  /// @domName HTMLInputElement.setSelectionRange
+  @DomName('HTMLInputElement.setSelectionRange')
   void setSelectionRange(int start, int end, [String direction]);
 }
 
@@ -14167,10 +13969,10 @@
 abstract class SearchInputElement implements TextInputElementBase {
   factory SearchInputElement() => new InputElement(type: 'search');
 
-  /// @domName HTMLInputElement.dirName;
+  @DomName('HTMLInputElement.dirName')
   String dirName;
 
-  /// @domName HTMLInputElement.list;
+  @DomName('HTMLInputElement.list')
   Element get list;
 
   /// Returns true if this input type is supported on the current platform.
@@ -14185,10 +13987,10 @@
 abstract class TextInputElement implements TextInputElementBase {
   factory TextInputElement() => new InputElement(type: 'text');
 
-  /// @domName HTMLInputElement.dirName;
+  @DomName('HTMLInputElement.dirName')
   String dirName;
 
-  /// @domName HTMLInputElement.list;
+  @DomName('HTMLInputElement.list')
   Element get list;
 }
 
@@ -14204,7 +14006,7 @@
 abstract class UrlInputElement implements TextInputElementBase {
   factory UrlInputElement() => new InputElement(type: 'url');
 
-  /// @domName HTMLInputElement.list;
+  @DomName('HTMLInputElement.list')
   Element get list;
 
   /// Returns true if this input type is supported on the current platform.
@@ -14228,7 +14030,7 @@
 abstract class TelephoneInputElement implements TextInputElementBase {
   factory TelephoneInputElement() => new InputElement(type: 'tel');
 
-  /// @domName HTMLInputElement.list;
+  @DomName('HTMLInputElement.list')
   Element get list;
 
   /// Returns true if this input type is supported on the current platform.
@@ -14249,34 +14051,34 @@
 abstract class EmailInputElement implements TextInputElementBase {
   factory EmailInputElement() => new InputElement(type: 'email');
 
-  /// @domName HTMLInputElement.autocomplete
+  @DomName('HTMLInputElement.autocomplete')
   String autocomplete;
 
-  /// @domName HTMLInputElement.autofocus
+  @DomName('HTMLInputElement.autofocus')
   bool autofocus;
 
-  /// @domName HTMLInputElement.list;
+  @DomName('HTMLInputElement.list')
   Element get list;
 
-  /// @domName HTMLInputElement.maxLength
+  @DomName('HTMLInputElement.maxLength')
   int maxLength;
 
-  /// @domName HTMLInputElement.multiple;
+  @DomName('HTMLInputElement.multiple')
   bool multiple;
 
-  /// @domName HTMLInputElement.pattern
+  @DomName('HTMLInputElement.pattern')
   String pattern;
 
-  /// @domName HTMLInputElement.placeholder
+  @DomName('HTMLInputElement.placeholder')
   String placeholder;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
-  /// @domName HTMLInputElement.size
+  @DomName('HTMLInputElement.size')
   int size;
 
   /// Returns true if this input type is supported on the current platform.
@@ -14297,25 +14099,25 @@
  */
 abstract class RangeInputElementBase implements InputElementBase {
 
-  /// @domName HTMLInputElement.list
+  @DomName('HTMLInputElement.list')
   Element get list;
 
-  /// @domName HTMLInputElement.max
+  @DomName('HTMLInputElement.max')
   String max;
 
-  /// @domName HTMLInputElement.min
+  @DomName('HTMLInputElement.min')
   String min;
 
-  /// @domName HTMLInputElement.step
+  @DomName('HTMLInputElement.step')
   String step;
 
-  /// @domName HTMLInputElement.valueAsNumber
+  @DomName('HTMLInputElement.valueAsNumber')
   num valueAsNumber;
 
-  /// @domName HTMLInputElement.stepDown
+  @DomName('HTMLInputElement.stepDown')
   void stepDown([int n]);
 
-  /// @domName HTMLInputElement.stepUp
+  @DomName('HTMLInputElement.stepUp')
   void stepUp([int n]);
 }
 
@@ -14330,13 +14132,13 @@
 abstract class DateTimeInputElement implements RangeInputElementBase {
   factory DateTimeInputElement() => new InputElement(type: 'datetime');
 
-  /// @domName HTMLInputElement.valueAsDate
+  @DomName('HTMLInputElement.valueAsDate')
   Date valueAsDate;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -14355,13 +14157,13 @@
 abstract class DateInputElement implements RangeInputElementBase {
   factory DateInputElement() => new InputElement(type: 'date');
 
-  /// @domName HTMLInputElement.valueAsDate
+  @DomName('HTMLInputElement.valueAsDate')
   Date valueAsDate;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -14380,13 +14182,13 @@
 abstract class MonthInputElement implements RangeInputElementBase {
   factory MonthInputElement() => new InputElement(type: 'month');
 
-  /// @domName HTMLInputElement.valueAsDate
+  @DomName('HTMLInputElement.valueAsDate')
   Date valueAsDate;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -14405,13 +14207,13 @@
 abstract class WeekInputElement implements RangeInputElementBase {
   factory WeekInputElement() => new InputElement(type: 'week');
 
-  /// @domName HTMLInputElement.valueAsDate
+  @DomName('HTMLInputElement.valueAsDate')
   Date valueAsDate;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -14430,13 +14232,13 @@
 abstract class TimeInputElement implements RangeInputElementBase {
   factory TimeInputElement() => new InputElement(type: 'time');
 
-  /// @domName HTMLInputElement.valueAsDate
+  @DomName('HTMLInputElement.valueAsDate')
   Date valueAsDate;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -14457,10 +14259,10 @@
   factory LocalDateTimeInputElement() =>
       new InputElement(type: 'datetime-local');
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -14479,13 +14281,13 @@
 abstract class NumberInputElement implements RangeInputElementBase {
   factory NumberInputElement() => new InputElement(type: 'number');
 
-  /// @domName HTMLInputElement.placeholder
+  @DomName('HTMLInputElement.placeholder')
   String placeholder;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -14521,10 +14323,10 @@
 abstract class CheckboxInputElement implements InputElementBase {
   factory CheckboxInputElement() => new InputElement(type: 'checkbox');
 
-  /// @domName HTMLInputElement.checked
+  @DomName('HTMLInputElement.checked')
   bool checked;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 }
 
@@ -14543,10 +14345,10 @@
 abstract class RadioButtonInputElement implements InputElementBase {
   factory RadioButtonInputElement() => new InputElement(type: 'radio');
 
-  /// @domName HTMLInputElement.checked
+  @DomName('HTMLInputElement.checked')
   bool checked;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 }
 
@@ -14556,16 +14358,16 @@
 abstract class FileUploadInputElement implements InputElementBase {
   factory FileUploadInputElement() => new InputElement(type: 'file');
 
-  /// @domName HTMLInputElement.accept
+  @DomName('HTMLInputElement.accept')
   String accept;
 
-  /// @domName HTMLInputElement.multiple
+  @DomName('HTMLInputElement.multiple')
   bool multiple;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
-  /// @domName HTMLInputElement.files
+  @DomName('HTMLInputElement.files')
   List<File> files;
 }
 
@@ -14575,19 +14377,19 @@
 abstract class SubmitButtonInputElement implements InputElementBase {
   factory SubmitButtonInputElement() => new InputElement(type: 'submit');
 
-  /// @domName HTMLInputElement.formAction
+  @DomName('HTMLInputElement.formAction')
   String formAction;
 
-  /// @domName HTMLInputElement.formEnctype
+  @DomName('HTMLInputElement.formEnctype')
   String formEnctype;
 
-  /// @domName HTMLInputElement.formMethod
+  @DomName('HTMLInputElement.formMethod')
   String formMethod;
 
-  /// @domName HTMLInputElement.formNoValidate
+  @DomName('HTMLInputElement.formNoValidate')
   bool formNoValidate;
 
-  /// @domName HTMLInputElement.formTarget
+  @DomName('HTMLInputElement.formTarget')
   String formTarget;
 }
 
@@ -14598,31 +14400,31 @@
 abstract class ImageButtonInputElement implements InputElementBase {
   factory ImageButtonInputElement() => new InputElement(type: 'image');
 
-  /// @domName HTMLInputElement.alt
+  @DomName('HTMLInputElement.alt')
   String alt;
 
-  /// @domName HTMLInputElement.formAction
+  @DomName('HTMLInputElement.formAction')
   String formAction;
 
-  /// @domName HTMLInputElement.formEnctype
+  @DomName('HTMLInputElement.formEnctype')
   String formEnctype;
 
-  /// @domName HTMLInputElement.formMethod
+  @DomName('HTMLInputElement.formMethod')
   String formMethod;
 
-  /// @domName HTMLInputElement.formNoValidate
+  @DomName('HTMLInputElement.formNoValidate')
   bool formNoValidate;
 
-  /// @domName HTMLInputElement.formTarget
+  @DomName('HTMLInputElement.formTarget')
   String formTarget;
 
-  /// @domName HTMLInputElement.height
+  @DomName('HTMLInputElement.height')
   int height;
 
-  /// @domName HTMLInputElement.src
+  @DomName('HTMLInputElement.src')
   String src;
 
-  /// @domName HTMLInputElement.width
+  @DomName('HTMLInputElement.width')
   int width;
 }
 
@@ -14641,12 +14443,12 @@
 }
 
 
-/// @docsEditable true
+@DocsEditable
 class InputElementEvents extends ElementEvents {
-  /// @docsEditable true
+  @DocsEditable
   InputElementEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get speechChange => this['webkitSpeechChange'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14656,7 +14458,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Int16Array
+@DocsEditable
+@DomName('Int16Array')
 class Int16Array extends ArrayBufferView implements List<int> {
   Int16Array.internal() : super.internal();
 
@@ -14671,16 +14474,16 @@
 
   static const int BYTES_PER_ELEMENT = 2;
 
-
-  /** @domName Int16Array.length */
+  @DocsEditable
+  @DomName('Int16Array.length')
   int get length native "Int16Array_length_Getter";
 
-
-  /** @domName Int16Array.numericIndexGetter */
+  @DocsEditable
+  @DomName('Int16Array.numericIndexGetter')
   int operator[](int index) native "Int16Array_numericIndexGetter_Callback";
 
-
-  /** @domName Int16Array.numericIndexSetter */
+  @DocsEditable
+  @DomName('Int16Array.numericIndexSetter')
   void operator[]=(int index, int value) native "Int16Array_numericIndexSetter_Callback";
   // -- start List<int> mixins.
   // int is the element type.
@@ -14695,50 +14498,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(int element) => Collections.contains(this, element);
+  bool contains(int element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(int element)) => Collections.forEach(this, f);
+  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(int element)) => new MappedList<int, dynamic>(this, f);
+  List mappedBy(f(int element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<int> where(bool f(int element)) => new WhereIterable<int>(this, f);
+  Iterable<int> where(bool f(int element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(int element)) => Collections.every(this, f);
+  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(int element)) => Collections.any(this, f);
+  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);
 
   List<int> toList() => new List<int>.from(this);
   Set<int> toSet() => new Set<int>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<int> take(int n) => new ListView<int>(this, 0, n);
+  List<int> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<int> takeWhile(bool test(int value)) {
-    return new TakeWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<int> skip(int n) => new ListView<int>(this, n, null);
+  List<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<int> skipWhile(bool test(int value)) {
-    return new SkipWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   int firstMatching(bool test(int value), { int orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   int lastMatching(bool test(int value), {int orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   int singleMatching(bool test(int value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   int elementAt(int index) {
@@ -14796,16 +14599,36 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) => Collections.min(this, compare);
+  int min([int compare(int a, int b)]) => IterableMixinWorkaround.min(this, compare);
 
-  int max([int compare(int a, int b)]) => Collections.max(this, compare);
+  int max([int compare(int a, int b)]) => IterableMixinWorkaround.max(this, compare);
 
   int removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
@@ -14825,23 +14648,23 @@
 
   // -- end List<int> mixins.
 
-
-  /** @domName Int16Array.setElements */
+  @DocsEditable
+  @DomName('Int16Array.setElements')
   void setElements(Object array, [int offset]) native "Int16Array_setElements_Callback";
 
-  Int16Array subarray(/*long*/ start, [/*long*/ end]) {
+  Int16Array subarray(int start, [int end]) {
     if (?end) {
       return _subarray_1(start, end);
     }
     return _subarray_2(start);
   }
 
-
-  /** @domName Int16Array.subarray_1 */
+  @DocsEditable
+  @DomName('Int16Array.subarray_1')
   Int16Array _subarray_1(start, end) native "Int16Array_subarray_1_Callback";
 
-
-  /** @domName Int16Array.subarray_2 */
+  @DocsEditable
+  @DomName('Int16Array.subarray_2')
   Int16Array _subarray_2(start) native "Int16Array_subarray_2_Callback";
 
 }
@@ -14852,7 +14675,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Int32Array
+@DocsEditable
+@DomName('Int32Array')
 class Int32Array extends ArrayBufferView implements List<int> {
   Int32Array.internal() : super.internal();
 
@@ -14867,16 +14691,16 @@
 
   static const int BYTES_PER_ELEMENT = 4;
 
-
-  /** @domName Int32Array.length */
+  @DocsEditable
+  @DomName('Int32Array.length')
   int get length native "Int32Array_length_Getter";
 
-
-  /** @domName Int32Array.numericIndexGetter */
+  @DocsEditable
+  @DomName('Int32Array.numericIndexGetter')
   int operator[](int index) native "Int32Array_numericIndexGetter_Callback";
 
-
-  /** @domName Int32Array.numericIndexSetter */
+  @DocsEditable
+  @DomName('Int32Array.numericIndexSetter')
   void operator[]=(int index, int value) native "Int32Array_numericIndexSetter_Callback";
   // -- start List<int> mixins.
   // int is the element type.
@@ -14891,50 +14715,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(int element) => Collections.contains(this, element);
+  bool contains(int element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(int element)) => Collections.forEach(this, f);
+  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(int element)) => new MappedList<int, dynamic>(this, f);
+  List mappedBy(f(int element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<int> where(bool f(int element)) => new WhereIterable<int>(this, f);
+  Iterable<int> where(bool f(int element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(int element)) => Collections.every(this, f);
+  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(int element)) => Collections.any(this, f);
+  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);
 
   List<int> toList() => new List<int>.from(this);
   Set<int> toSet() => new Set<int>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<int> take(int n) => new ListView<int>(this, 0, n);
+  List<int> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<int> takeWhile(bool test(int value)) {
-    return new TakeWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<int> skip(int n) => new ListView<int>(this, n, null);
+  List<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<int> skipWhile(bool test(int value)) {
-    return new SkipWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   int firstMatching(bool test(int value), { int orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   int lastMatching(bool test(int value), {int orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   int singleMatching(bool test(int value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   int elementAt(int index) {
@@ -14992,16 +14816,36 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) => Collections.min(this, compare);
+  int min([int compare(int a, int b)]) => IterableMixinWorkaround.min(this, compare);
 
-  int max([int compare(int a, int b)]) => Collections.max(this, compare);
+  int max([int compare(int a, int b)]) => IterableMixinWorkaround.max(this, compare);
 
   int removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
@@ -15021,23 +14865,23 @@
 
   // -- end List<int> mixins.
 
-
-  /** @domName Int32Array.setElements */
+  @DocsEditable
+  @DomName('Int32Array.setElements')
   void setElements(Object array, [int offset]) native "Int32Array_setElements_Callback";
 
-  Int32Array subarray(/*long*/ start, [/*long*/ end]) {
+  Int32Array subarray(int start, [int end]) {
     if (?end) {
       return _subarray_1(start, end);
     }
     return _subarray_2(start);
   }
 
-
-  /** @domName Int32Array.subarray_1 */
+  @DocsEditable
+  @DomName('Int32Array.subarray_1')
   Int32Array _subarray_1(start, end) native "Int32Array_subarray_1_Callback";
 
-
-  /** @domName Int32Array.subarray_2 */
+  @DocsEditable
+  @DomName('Int32Array.subarray_2')
   Int32Array _subarray_2(start) native "Int32Array_subarray_2_Callback";
 
 }
@@ -15048,7 +14892,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Int8Array
+@DocsEditable
+@DomName('Int8Array')
 class Int8Array extends ArrayBufferView implements List<int> {
   Int8Array.internal() : super.internal();
 
@@ -15063,16 +14908,16 @@
 
   static const int BYTES_PER_ELEMENT = 1;
 
-
-  /** @domName Int8Array.length */
+  @DocsEditable
+  @DomName('Int8Array.length')
   int get length native "Int8Array_length_Getter";
 
-
-  /** @domName Int8Array.numericIndexGetter */
+  @DocsEditable
+  @DomName('Int8Array.numericIndexGetter')
   int operator[](int index) native "Int8Array_numericIndexGetter_Callback";
 
-
-  /** @domName Int8Array.numericIndexSetter */
+  @DocsEditable
+  @DomName('Int8Array.numericIndexSetter')
   void operator[]=(int index, int value) native "Int8Array_numericIndexSetter_Callback";
   // -- start List<int> mixins.
   // int is the element type.
@@ -15087,50 +14932,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(int element) => Collections.contains(this, element);
+  bool contains(int element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(int element)) => Collections.forEach(this, f);
+  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(int element)) => new MappedList<int, dynamic>(this, f);
+  List mappedBy(f(int element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<int> where(bool f(int element)) => new WhereIterable<int>(this, f);
+  Iterable<int> where(bool f(int element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(int element)) => Collections.every(this, f);
+  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(int element)) => Collections.any(this, f);
+  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);
 
   List<int> toList() => new List<int>.from(this);
   Set<int> toSet() => new Set<int>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<int> take(int n) => new ListView<int>(this, 0, n);
+  List<int> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<int> takeWhile(bool test(int value)) {
-    return new TakeWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<int> skip(int n) => new ListView<int>(this, n, null);
+  List<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<int> skipWhile(bool test(int value)) {
-    return new SkipWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   int firstMatching(bool test(int value), { int orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   int lastMatching(bool test(int value), {int orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   int singleMatching(bool test(int value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   int elementAt(int index) {
@@ -15188,16 +15033,36 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) => Collections.min(this, compare);
+  int min([int compare(int a, int b)]) => IterableMixinWorkaround.min(this, compare);
 
-  int max([int compare(int a, int b)]) => Collections.max(this, compare);
+  int max([int compare(int a, int b)]) => IterableMixinWorkaround.max(this, compare);
 
   int removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
@@ -15217,23 +15082,23 @@
 
   // -- end List<int> mixins.
 
-
-  /** @domName Int8Array.setElements */
+  @DocsEditable
+  @DomName('Int8Array.setElements')
   void setElements(Object array, [int offset]) native "Int8Array_setElements_Callback";
 
-  Int8Array subarray(/*long*/ start, [/*long*/ end]) {
+  Int8Array subarray(int start, [int end]) {
     if (?end) {
       return _subarray_1(start, end);
     }
     return _subarray_2(start);
   }
 
-
-  /** @domName Int8Array.subarray_1 */
+  @DocsEditable
+  @DomName('Int8Array.subarray_1')
   Int8Array _subarray_1(start, end) native "Int8Array_subarray_1_Callback";
 
-
-  /** @domName Int8Array.subarray_2 */
+  @DocsEditable
+  @DomName('Int8Array.subarray_2')
   Int8Array _subarray_2(start) native "Int8Array_subarray_2_Callback";
 
 }
@@ -15244,7 +15109,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName JavaScriptCallFrame
+@DocsEditable
+@DomName('JavaScriptCallFrame')
 class JavaScriptCallFrame extends NativeFieldWrapperClass1 {
   JavaScriptCallFrame.internal();
 
@@ -15258,48 +15124,48 @@
 
   static const int WITH_SCOPE = 2;
 
-
-  /** @domName JavaScriptCallFrame.caller */
+  @DocsEditable
+  @DomName('JavaScriptCallFrame.caller')
   JavaScriptCallFrame get caller native "JavaScriptCallFrame_caller_Getter";
 
-
-  /** @domName JavaScriptCallFrame.column */
+  @DocsEditable
+  @DomName('JavaScriptCallFrame.column')
   int get column native "JavaScriptCallFrame_column_Getter";
 
-
-  /** @domName JavaScriptCallFrame.functionName */
+  @DocsEditable
+  @DomName('JavaScriptCallFrame.functionName')
   String get functionName native "JavaScriptCallFrame_functionName_Getter";
 
-
-  /** @domName JavaScriptCallFrame.line */
+  @DocsEditable
+  @DomName('JavaScriptCallFrame.line')
   int get line native "JavaScriptCallFrame_line_Getter";
 
-
-  /** @domName JavaScriptCallFrame.scopeChain */
+  @DocsEditable
+  @DomName('JavaScriptCallFrame.scopeChain')
   List get scopeChain native "JavaScriptCallFrame_scopeChain_Getter";
 
-
-  /** @domName JavaScriptCallFrame.sourceID */
+  @DocsEditable
+  @DomName('JavaScriptCallFrame.sourceID')
   int get sourceID native "JavaScriptCallFrame_sourceID_Getter";
 
-
-  /** @domName JavaScriptCallFrame.thisObject */
+  @DocsEditable
+  @DomName('JavaScriptCallFrame.thisObject')
   Object get thisObject native "JavaScriptCallFrame_thisObject_Getter";
 
-
-  /** @domName JavaScriptCallFrame.type */
+  @DocsEditable
+  @DomName('JavaScriptCallFrame.type')
   String get type native "JavaScriptCallFrame_type_Getter";
 
-
-  /** @domName JavaScriptCallFrame.evaluate */
+  @DocsEditable
+  @DomName('JavaScriptCallFrame.evaluate')
   void evaluate(String script) native "JavaScriptCallFrame_evaluate_Callback";
 
-
-  /** @domName JavaScriptCallFrame.restart */
+  @DocsEditable
+  @DomName('JavaScriptCallFrame.restart')
   Object restart() native "JavaScriptCallFrame_restart_Callback";
 
-
-  /** @domName JavaScriptCallFrame.scopeType */
+  @DocsEditable
+  @DomName('JavaScriptCallFrame.scopeType')
   int scopeType(int scopeIndex) native "JavaScriptCallFrame_scopeType_Callback";
 
 }
@@ -15308,7 +15174,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName KeyboardEvent; @docsEditable true
+@DomName('KeyboardEvent')
 class KeyboardEvent extends UIEvent {
 
   factory KeyboardEvent(String type, Window view,
@@ -15322,43 +15188,43 @@
     return e;
   }
 
-  /** @domName KeyboardEvent.keyCode */
+  @DomName('KeyboardEvent.keyCode')
   int get keyCode => $dom_keyCode;
   
-  /** @domName KeyboardEvent.charCode */
+  @DomName('KeyboardEvent.charCode')
   int get charCode => $dom_charCode;
   KeyboardEvent.internal() : super.internal();
 
-
-  /** @domName KeyboardEvent.altGraphKey */
+  @DocsEditable
+  @DomName('KeyboardEvent.altGraphKey')
   bool get altGraphKey native "KeyboardEvent_altGraphKey_Getter";
 
-
-  /** @domName KeyboardEvent.altKey */
+  @DocsEditable
+  @DomName('KeyboardEvent.altKey')
   bool get altKey native "KeyboardEvent_altKey_Getter";
 
-
-  /** @domName KeyboardEvent.ctrlKey */
+  @DocsEditable
+  @DomName('KeyboardEvent.ctrlKey')
   bool get ctrlKey native "KeyboardEvent_ctrlKey_Getter";
 
-
-  /** @domName KeyboardEvent.keyIdentifier */
+  @DocsEditable
+  @DomName('KeyboardEvent.keyIdentifier')
   String get $dom_keyIdentifier native "KeyboardEvent_keyIdentifier_Getter";
 
-
-  /** @domName KeyboardEvent.keyLocation */
+  @DocsEditable
+  @DomName('KeyboardEvent.keyLocation')
   int get keyLocation native "KeyboardEvent_keyLocation_Getter";
 
-
-  /** @domName KeyboardEvent.metaKey */
+  @DocsEditable
+  @DomName('KeyboardEvent.metaKey')
   bool get metaKey native "KeyboardEvent_metaKey_Getter";
 
-
-  /** @domName KeyboardEvent.shiftKey */
+  @DocsEditable
+  @DomName('KeyboardEvent.shiftKey')
   bool get shiftKey native "KeyboardEvent_shiftKey_Getter";
 
-
-  /** @domName KeyboardEvent.initKeyboardEvent */
+  @DocsEditable
+  @DomName('KeyboardEvent.initKeyboardEvent')
   void $dom_initKeyboardEvent(String type, bool canBubble, bool cancelable, Window view, String keyIdentifier, int keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) native "KeyboardEvent_initKeyboardEvent_Callback";
 
 }
@@ -15369,89 +15235,90 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLKeygenElement
+@DocsEditable
+@DomName('HTMLKeygenElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental()
 class KeygenElement extends _Element_Merged {
   KeygenElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory KeygenElement() => document.$dom_createElement("keygen");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-
-  /** @domName HTMLKeygenElement.autofocus */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.autofocus')
   bool get autofocus native "HTMLKeygenElement_autofocus_Getter";
 
-
-  /** @domName HTMLKeygenElement.autofocus */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.autofocus')
   void set autofocus(bool value) native "HTMLKeygenElement_autofocus_Setter";
 
-
-  /** @domName HTMLKeygenElement.challenge */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.challenge')
   String get challenge native "HTMLKeygenElement_challenge_Getter";
 
-
-  /** @domName HTMLKeygenElement.challenge */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.challenge')
   void set challenge(String value) native "HTMLKeygenElement_challenge_Setter";
 
-
-  /** @domName HTMLKeygenElement.disabled */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.disabled')
   bool get disabled native "HTMLKeygenElement_disabled_Getter";
 
-
-  /** @domName HTMLKeygenElement.disabled */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.disabled')
   void set disabled(bool value) native "HTMLKeygenElement_disabled_Setter";
 
-
-  /** @domName HTMLKeygenElement.form */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.form')
   FormElement get form native "HTMLKeygenElement_form_Getter";
 
-
-  /** @domName HTMLKeygenElement.keytype */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.keytype')
   String get keytype native "HTMLKeygenElement_keytype_Getter";
 
-
-  /** @domName HTMLKeygenElement.keytype */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.keytype')
   void set keytype(String value) native "HTMLKeygenElement_keytype_Setter";
 
-
-  /** @domName HTMLKeygenElement.labels */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.labels')
   List<Node> get labels native "HTMLKeygenElement_labels_Getter";
 
-
-  /** @domName HTMLKeygenElement.name */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.name')
   String get name native "HTMLKeygenElement_name_Getter";
 
-
-  /** @domName HTMLKeygenElement.name */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.name')
   void set name(String value) native "HTMLKeygenElement_name_Setter";
 
-
-  /** @domName HTMLKeygenElement.type */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.type')
   String get type native "HTMLKeygenElement_type_Getter";
 
-
-  /** @domName HTMLKeygenElement.validationMessage */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.validationMessage')
   String get validationMessage native "HTMLKeygenElement_validationMessage_Getter";
 
-
-  /** @domName HTMLKeygenElement.validity */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.validity')
   ValidityState get validity native "HTMLKeygenElement_validity_Getter";
 
-
-  /** @domName HTMLKeygenElement.willValidate */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.willValidate')
   bool get willValidate native "HTMLKeygenElement_willValidate_Getter";
 
-
-  /** @domName HTMLKeygenElement.checkValidity */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.checkValidity')
   bool checkValidity() native "HTMLKeygenElement_checkValidity_Callback";
 
-
-  /** @domName HTMLKeygenElement.setCustomValidity */
+  @DocsEditable
+  @DomName('HTMLKeygenElement.setCustomValidity')
   void setCustomValidity(String error) native "HTMLKeygenElement_setCustomValidity_Callback";
 
 }
@@ -15462,27 +15329,28 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLLIElement
+@DocsEditable
+@DomName('HTMLLIElement')
 class LIElement extends _Element_Merged {
   LIElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory LIElement() => document.$dom_createElement("li");
 
-
-  /** @domName HTMLLIElement.type */
+  @DocsEditable
+  @DomName('HTMLLIElement.type')
   String get type native "HTMLLIElement_type_Getter";
 
-
-  /** @domName HTMLLIElement.type */
+  @DocsEditable
+  @DomName('HTMLLIElement.type')
   void set type(String value) native "HTMLLIElement_type_Setter";
 
-
-  /** @domName HTMLLIElement.value */
+  @DocsEditable
+  @DomName('HTMLLIElement.value')
   int get value native "HTMLLIElement_value_Getter";
 
-
-  /** @domName HTMLLIElement.value */
+  @DocsEditable
+  @DomName('HTMLLIElement.value')
   void set value(int value) native "HTMLLIElement_value_Setter";
 
 }
@@ -15493,27 +15361,28 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLLabelElement
+@DocsEditable
+@DomName('HTMLLabelElement')
 class LabelElement extends _Element_Merged {
   LabelElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory LabelElement() => document.$dom_createElement("label");
 
-
-  /** @domName HTMLLabelElement.control */
+  @DocsEditable
+  @DomName('HTMLLabelElement.control')
   Element get control native "HTMLLabelElement_control_Getter";
 
-
-  /** @domName HTMLLabelElement.form */
+  @DocsEditable
+  @DomName('HTMLLabelElement.form')
   FormElement get form native "HTMLLabelElement_form_Getter";
 
-
-  /** @domName HTMLLabelElement.htmlFor */
+  @DocsEditable
+  @DomName('HTMLLabelElement.htmlFor')
   String get htmlFor native "HTMLLabelElement_htmlFor_Getter";
 
-
-  /** @domName HTMLLabelElement.htmlFor */
+  @DocsEditable
+  @DomName('HTMLLabelElement.htmlFor')
   void set htmlFor(String value) native "HTMLLabelElement_htmlFor_Setter";
 
 }
@@ -15524,23 +15393,16 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLLegendElement
+@DocsEditable
+@DomName('HTMLLegendElement')
 class LegendElement extends _Element_Merged {
   LegendElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory LegendElement() => document.$dom_createElement("legend");
 
-
-  /** @domName HTMLLegendElement.align */
-  String get align native "HTMLLegendElement_align_Getter";
-
-
-  /** @domName HTMLLegendElement.align */
-  void set align(String value) native "HTMLLegendElement_align_Setter";
-
-
-  /** @domName HTMLLegendElement.form */
+  @DocsEditable
+  @DomName('HTMLLegendElement.form')
   FormElement get form native "HTMLLegendElement_form_Getter";
 
 }
@@ -15551,71 +15413,72 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLLinkElement
+@DocsEditable
+@DomName('HTMLLinkElement')
 class LinkElement extends _Element_Merged {
   LinkElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory LinkElement() => document.$dom_createElement("link");
 
-
-  /** @domName HTMLLinkElement.disabled */
+  @DocsEditable
+  @DomName('HTMLLinkElement.disabled')
   bool get disabled native "HTMLLinkElement_disabled_Getter";
 
-
-  /** @domName HTMLLinkElement.disabled */
+  @DocsEditable
+  @DomName('HTMLLinkElement.disabled')
   void set disabled(bool value) native "HTMLLinkElement_disabled_Setter";
 
-
-  /** @domName HTMLLinkElement.href */
+  @DocsEditable
+  @DomName('HTMLLinkElement.href')
   String get href native "HTMLLinkElement_href_Getter";
 
-
-  /** @domName HTMLLinkElement.href */
+  @DocsEditable
+  @DomName('HTMLLinkElement.href')
   void set href(String value) native "HTMLLinkElement_href_Setter";
 
-
-  /** @domName HTMLLinkElement.hreflang */
+  @DocsEditable
+  @DomName('HTMLLinkElement.hreflang')
   String get hreflang native "HTMLLinkElement_hreflang_Getter";
 
-
-  /** @domName HTMLLinkElement.hreflang */
+  @DocsEditable
+  @DomName('HTMLLinkElement.hreflang')
   void set hreflang(String value) native "HTMLLinkElement_hreflang_Setter";
 
-
-  /** @domName HTMLLinkElement.media */
+  @DocsEditable
+  @DomName('HTMLLinkElement.media')
   String get media native "HTMLLinkElement_media_Getter";
 
-
-  /** @domName HTMLLinkElement.media */
+  @DocsEditable
+  @DomName('HTMLLinkElement.media')
   void set media(String value) native "HTMLLinkElement_media_Setter";
 
-
-  /** @domName HTMLLinkElement.rel */
+  @DocsEditable
+  @DomName('HTMLLinkElement.rel')
   String get rel native "HTMLLinkElement_rel_Getter";
 
-
-  /** @domName HTMLLinkElement.rel */
+  @DocsEditable
+  @DomName('HTMLLinkElement.rel')
   void set rel(String value) native "HTMLLinkElement_rel_Setter";
 
-
-  /** @domName HTMLLinkElement.sheet */
+  @DocsEditable
+  @DomName('HTMLLinkElement.sheet')
   StyleSheet get sheet native "HTMLLinkElement_sheet_Getter";
 
-
-  /** @domName HTMLLinkElement.sizes */
+  @DocsEditable
+  @DomName('HTMLLinkElement.sizes')
   DomSettableTokenList get sizes native "HTMLLinkElement_sizes_Getter";
 
-
-  /** @domName HTMLLinkElement.sizes */
+  @DocsEditable
+  @DomName('HTMLLinkElement.sizes')
   void set sizes(DomSettableTokenList value) native "HTMLLinkElement_sizes_Setter";
 
-
-  /** @domName HTMLLinkElement.type */
+  @DocsEditable
+  @DomName('HTMLLinkElement.type')
   String get type native "HTMLLinkElement_type_Getter";
 
-
-  /** @domName HTMLLinkElement.type */
+  @DocsEditable
+  @DomName('HTMLLinkElement.type')
   void set type(String value) native "HTMLLinkElement_type_Setter";
 
 }
@@ -15626,12 +15489,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName LocalMediaStream
+@DocsEditable
+@DomName('LocalMediaStream')
 class LocalMediaStream extends MediaStream implements EventTarget {
   LocalMediaStream.internal() : super.internal();
 
-
-  /** @domName LocalMediaStream.stop */
+  @DocsEditable
+  @DomName('LocalMediaStream.stop')
   void stop() native "LocalMediaStream_stop_Callback";
 
 }
@@ -15642,96 +15506,97 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Location
+@DocsEditable
+@DomName('Location')
 class Location extends NativeFieldWrapperClass1 implements LocationBase {
   Location.internal();
 
-
-  /** @domName Location.ancestorOrigins */
+  @DocsEditable
+  @DomName('Location.ancestorOrigins')
   List<String> get ancestorOrigins native "Location_ancestorOrigins_Getter";
 
-
-  /** @domName Location.hash */
+  @DocsEditable
+  @DomName('Location.hash')
   String get hash native "Location_hash_Getter";
 
-
-  /** @domName Location.hash */
+  @DocsEditable
+  @DomName('Location.hash')
   void set hash(String value) native "Location_hash_Setter";
 
-
-  /** @domName Location.host */
+  @DocsEditable
+  @DomName('Location.host')
   String get host native "Location_host_Getter";
 
-
-  /** @domName Location.host */
+  @DocsEditable
+  @DomName('Location.host')
   void set host(String value) native "Location_host_Setter";
 
-
-  /** @domName Location.hostname */
+  @DocsEditable
+  @DomName('Location.hostname')
   String get hostname native "Location_hostname_Getter";
 
-
-  /** @domName Location.hostname */
+  @DocsEditable
+  @DomName('Location.hostname')
   void set hostname(String value) native "Location_hostname_Setter";
 
-
-  /** @domName Location.href */
+  @DocsEditable
+  @DomName('Location.href')
   String get href native "Location_href_Getter";
 
-
-  /** @domName Location.href */
+  @DocsEditable
+  @DomName('Location.href')
   void set href(String value) native "Location_href_Setter";
 
-
-  /** @domName Location.origin */
+  @DocsEditable
+  @DomName('Location.origin')
   String get origin native "Location_origin_Getter";
 
-
-  /** @domName Location.pathname */
+  @DocsEditable
+  @DomName('Location.pathname')
   String get pathname native "Location_pathname_Getter";
 
-
-  /** @domName Location.pathname */
+  @DocsEditable
+  @DomName('Location.pathname')
   void set pathname(String value) native "Location_pathname_Setter";
 
-
-  /** @domName Location.port */
+  @DocsEditable
+  @DomName('Location.port')
   String get port native "Location_port_Getter";
 
-
-  /** @domName Location.port */
+  @DocsEditable
+  @DomName('Location.port')
   void set port(String value) native "Location_port_Setter";
 
-
-  /** @domName Location.protocol */
+  @DocsEditable
+  @DomName('Location.protocol')
   String get protocol native "Location_protocol_Getter";
 
-
-  /** @domName Location.protocol */
+  @DocsEditable
+  @DomName('Location.protocol')
   void set protocol(String value) native "Location_protocol_Setter";
 
-
-  /** @domName Location.search */
+  @DocsEditable
+  @DomName('Location.search')
   String get search native "Location_search_Getter";
 
-
-  /** @domName Location.search */
+  @DocsEditable
+  @DomName('Location.search')
   void set search(String value) native "Location_search_Setter";
 
-
-  /** @domName Location.assign */
+  @DocsEditable
+  @DomName('Location.assign')
   void assign(String url) native "Location_assign_Callback";
 
-
-  /** @domName Location.reload */
+  @DocsEditable
+  @DomName('Location.reload')
   void reload() native "Location_reload_Callback";
 
-
-  /** @domName Location.replace */
+  @DocsEditable
+  @DomName('Location.replace')
   void replace(String url) native "Location_replace_Callback";
 
-
-  /** @domName Location.toString */
+  @DocsEditable
+  @DomName('Location.toString')
   String toString() native "Location_toString_Callback";
 
 }
@@ -15742,23 +15607,24 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLMapElement
+@DocsEditable
+@DomName('HTMLMapElement')
 class MapElement extends _Element_Merged {
   MapElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory MapElement() => document.$dom_createElement("map");
 
-
-  /** @domName HTMLMapElement.areas */
+  @DocsEditable
+  @DomName('HTMLMapElement.areas')
   HtmlCollection get areas native "HTMLMapElement_areas_Getter";
 
-
-  /** @domName HTMLMapElement.name */
+  @DocsEditable
+  @DomName('HTMLMapElement.name')
   String get name native "HTMLMapElement_name_Getter";
 
-
-  /** @domName HTMLMapElement.name */
+  @DocsEditable
+  @DomName('HTMLMapElement.name')
   void set name(String value) native "HTMLMapElement_name_Setter";
 
 }
@@ -15769,211 +15635,101 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLMarqueeElement
-class MarqueeElement extends _Element_Merged {
-  MarqueeElement.internal() : super.internal();
-
-  /// Checks if this type is supported on the current platform.
-  static bool get supported => true;
-
-
-  /** @domName HTMLMarqueeElement.behavior */
-  String get behavior native "HTMLMarqueeElement_behavior_Getter";
-
-
-  /** @domName HTMLMarqueeElement.behavior */
-  void set behavior(String value) native "HTMLMarqueeElement_behavior_Setter";
-
-
-  /** @domName HTMLMarqueeElement.bgColor */
-  String get bgColor native "HTMLMarqueeElement_bgColor_Getter";
-
-
-  /** @domName HTMLMarqueeElement.bgColor */
-  void set bgColor(String value) native "HTMLMarqueeElement_bgColor_Setter";
-
-
-  /** @domName HTMLMarqueeElement.direction */
-  String get direction native "HTMLMarqueeElement_direction_Getter";
-
-
-  /** @domName HTMLMarqueeElement.direction */
-  void set direction(String value) native "HTMLMarqueeElement_direction_Setter";
-
-
-  /** @domName HTMLMarqueeElement.height */
-  String get height native "HTMLMarqueeElement_height_Getter";
-
-
-  /** @domName HTMLMarqueeElement.height */
-  void set height(String value) native "HTMLMarqueeElement_height_Setter";
-
-
-  /** @domName HTMLMarqueeElement.hspace */
-  int get hspace native "HTMLMarqueeElement_hspace_Getter";
-
-
-  /** @domName HTMLMarqueeElement.hspace */
-  void set hspace(int value) native "HTMLMarqueeElement_hspace_Setter";
-
-
-  /** @domName HTMLMarqueeElement.loop */
-  int get loop native "HTMLMarqueeElement_loop_Getter";
-
-
-  /** @domName HTMLMarqueeElement.loop */
-  void set loop(int value) native "HTMLMarqueeElement_loop_Setter";
-
-
-  /** @domName HTMLMarqueeElement.scrollAmount */
-  int get scrollAmount native "HTMLMarqueeElement_scrollAmount_Getter";
-
-
-  /** @domName HTMLMarqueeElement.scrollAmount */
-  void set scrollAmount(int value) native "HTMLMarqueeElement_scrollAmount_Setter";
-
-
-  /** @domName HTMLMarqueeElement.scrollDelay */
-  int get scrollDelay native "HTMLMarqueeElement_scrollDelay_Getter";
-
-
-  /** @domName HTMLMarqueeElement.scrollDelay */
-  void set scrollDelay(int value) native "HTMLMarqueeElement_scrollDelay_Setter";
-
-
-  /** @domName HTMLMarqueeElement.trueSpeed */
-  bool get trueSpeed native "HTMLMarqueeElement_trueSpeed_Getter";
-
-
-  /** @domName HTMLMarqueeElement.trueSpeed */
-  void set trueSpeed(bool value) native "HTMLMarqueeElement_trueSpeed_Setter";
-
-
-  /** @domName HTMLMarqueeElement.vspace */
-  int get vspace native "HTMLMarqueeElement_vspace_Getter";
-
-
-  /** @domName HTMLMarqueeElement.vspace */
-  void set vspace(int value) native "HTMLMarqueeElement_vspace_Setter";
-
-
-  /** @domName HTMLMarqueeElement.width */
-  String get width native "HTMLMarqueeElement_width_Getter";
-
-
-  /** @domName HTMLMarqueeElement.width */
-  void set width(String value) native "HTMLMarqueeElement_width_Setter";
-
-
-  /** @domName HTMLMarqueeElement.start */
-  void start() native "HTMLMarqueeElement_start_Callback";
-
-
-  /** @domName HTMLMarqueeElement.stop */
-  void stop() native "HTMLMarqueeElement_stop_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName MediaController
+@DocsEditable
+@DomName('MediaController')
 class MediaController extends EventTarget {
   MediaController.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory MediaController() => MediaController._create();
   static MediaController _create() native "MediaController_constructor_Callback";
 
-
-  /** @domName MediaController.buffered */
+  @DocsEditable
+  @DomName('MediaController.buffered')
   TimeRanges get buffered native "MediaController_buffered_Getter";
 
-
-  /** @domName MediaController.currentTime */
+  @DocsEditable
+  @DomName('MediaController.currentTime')
   num get currentTime native "MediaController_currentTime_Getter";
 
-
-  /** @domName MediaController.currentTime */
+  @DocsEditable
+  @DomName('MediaController.currentTime')
   void set currentTime(num value) native "MediaController_currentTime_Setter";
 
-
-  /** @domName MediaController.defaultPlaybackRate */
+  @DocsEditable
+  @DomName('MediaController.defaultPlaybackRate')
   num get defaultPlaybackRate native "MediaController_defaultPlaybackRate_Getter";
 
-
-  /** @domName MediaController.defaultPlaybackRate */
+  @DocsEditable
+  @DomName('MediaController.defaultPlaybackRate')
   void set defaultPlaybackRate(num value) native "MediaController_defaultPlaybackRate_Setter";
 
-
-  /** @domName MediaController.duration */
+  @DocsEditable
+  @DomName('MediaController.duration')
   num get duration native "MediaController_duration_Getter";
 
-
-  /** @domName MediaController.muted */
+  @DocsEditable
+  @DomName('MediaController.muted')
   bool get muted native "MediaController_muted_Getter";
 
-
-  /** @domName MediaController.muted */
+  @DocsEditable
+  @DomName('MediaController.muted')
   void set muted(bool value) native "MediaController_muted_Setter";
 
-
-  /** @domName MediaController.paused */
+  @DocsEditable
+  @DomName('MediaController.paused')
   bool get paused native "MediaController_paused_Getter";
 
-
-  /** @domName MediaController.playbackRate */
+  @DocsEditable
+  @DomName('MediaController.playbackRate')
   num get playbackRate native "MediaController_playbackRate_Getter";
 
-
-  /** @domName MediaController.playbackRate */
+  @DocsEditable
+  @DomName('MediaController.playbackRate')
   void set playbackRate(num value) native "MediaController_playbackRate_Setter";
 
-
-  /** @domName MediaController.playbackState */
+  @DocsEditable
+  @DomName('MediaController.playbackState')
   String get playbackState native "MediaController_playbackState_Getter";
 
-
-  /** @domName MediaController.played */
+  @DocsEditable
+  @DomName('MediaController.played')
   TimeRanges get played native "MediaController_played_Getter";
 
-
-  /** @domName MediaController.seekable */
+  @DocsEditable
+  @DomName('MediaController.seekable')
   TimeRanges get seekable native "MediaController_seekable_Getter";
 
-
-  /** @domName MediaController.volume */
+  @DocsEditable
+  @DomName('MediaController.volume')
   num get volume native "MediaController_volume_Getter";
 
-
-  /** @domName MediaController.volume */
+  @DocsEditable
+  @DomName('MediaController.volume')
   void set volume(num value) native "MediaController_volume_Setter";
 
-
-  /** @domName MediaController.addEventListener */
+  @DocsEditable
+  @DomName('MediaController.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaController_addEventListener_Callback";
 
-
-  /** @domName MediaController.dispatchEvent */
+  @DocsEditable
+  @DomName('MediaController.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "MediaController_dispatchEvent_Callback";
 
-
-  /** @domName MediaController.pause */
+  @DocsEditable
+  @DomName('MediaController.pause')
   void pause() native "MediaController_pause_Callback";
 
-
-  /** @domName MediaController.play */
+  @DocsEditable
+  @DomName('MediaController.play')
   void play() native "MediaController_play_Callback";
 
-
-  /** @domName MediaController.removeEventListener */
+  @DocsEditable
+  @DomName('MediaController.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaController_removeEventListener_Callback";
 
-
-  /** @domName MediaController.unpause */
+  @DocsEditable
+  @DomName('MediaController.unpause')
   void unpause() native "MediaController_unpause_Callback";
 
 }
@@ -15984,7 +15740,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLMediaElement
+@DocsEditable
+@DomName('HTMLMediaElement')
 class MediaElement extends _Element_Merged {
   MediaElement.internal() : super.internal();
 
@@ -16038,7 +15795,8 @@
 
   static const EventStreamProvider<MediaKeyEvent> needKeyEvent = const EventStreamProvider<MediaKeyEvent>('webkitneedkey');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   MediaElementEvents get on =>
     new MediaElementEvents(this);
 
@@ -16060,195 +15818,195 @@
 
   static const int NETWORK_NO_SOURCE = 3;
 
-
-  /** @domName HTMLMediaElement.autoplay */
+  @DocsEditable
+  @DomName('HTMLMediaElement.autoplay')
   bool get autoplay native "HTMLMediaElement_autoplay_Getter";
 
-
-  /** @domName HTMLMediaElement.autoplay */
+  @DocsEditable
+  @DomName('HTMLMediaElement.autoplay')
   void set autoplay(bool value) native "HTMLMediaElement_autoplay_Setter";
 
-
-  /** @domName HTMLMediaElement.buffered */
+  @DocsEditable
+  @DomName('HTMLMediaElement.buffered')
   TimeRanges get buffered native "HTMLMediaElement_buffered_Getter";
 
-
-  /** @domName HTMLMediaElement.controller */
+  @DocsEditable
+  @DomName('HTMLMediaElement.controller')
   MediaController get controller native "HTMLMediaElement_controller_Getter";
 
-
-  /** @domName HTMLMediaElement.controller */
+  @DocsEditable
+  @DomName('HTMLMediaElement.controller')
   void set controller(MediaController value) native "HTMLMediaElement_controller_Setter";
 
-
-  /** @domName HTMLMediaElement.controls */
+  @DocsEditable
+  @DomName('HTMLMediaElement.controls')
   bool get controls native "HTMLMediaElement_controls_Getter";
 
-
-  /** @domName HTMLMediaElement.controls */
+  @DocsEditable
+  @DomName('HTMLMediaElement.controls')
   void set controls(bool value) native "HTMLMediaElement_controls_Setter";
 
-
-  /** @domName HTMLMediaElement.currentSrc */
+  @DocsEditable
+  @DomName('HTMLMediaElement.currentSrc')
   String get currentSrc native "HTMLMediaElement_currentSrc_Getter";
 
-
-  /** @domName HTMLMediaElement.currentTime */
+  @DocsEditable
+  @DomName('HTMLMediaElement.currentTime')
   num get currentTime native "HTMLMediaElement_currentTime_Getter";
 
-
-  /** @domName HTMLMediaElement.currentTime */
+  @DocsEditable
+  @DomName('HTMLMediaElement.currentTime')
   void set currentTime(num value) native "HTMLMediaElement_currentTime_Setter";
 
-
-  /** @domName HTMLMediaElement.defaultMuted */
+  @DocsEditable
+  @DomName('HTMLMediaElement.defaultMuted')
   bool get defaultMuted native "HTMLMediaElement_defaultMuted_Getter";
 
-
-  /** @domName HTMLMediaElement.defaultMuted */
+  @DocsEditable
+  @DomName('HTMLMediaElement.defaultMuted')
   void set defaultMuted(bool value) native "HTMLMediaElement_defaultMuted_Setter";
 
-
-  /** @domName HTMLMediaElement.defaultPlaybackRate */
+  @DocsEditable
+  @DomName('HTMLMediaElement.defaultPlaybackRate')
   num get defaultPlaybackRate native "HTMLMediaElement_defaultPlaybackRate_Getter";
 
-
-  /** @domName HTMLMediaElement.defaultPlaybackRate */
+  @DocsEditable
+  @DomName('HTMLMediaElement.defaultPlaybackRate')
   void set defaultPlaybackRate(num value) native "HTMLMediaElement_defaultPlaybackRate_Setter";
 
-
-  /** @domName HTMLMediaElement.duration */
+  @DocsEditable
+  @DomName('HTMLMediaElement.duration')
   num get duration native "HTMLMediaElement_duration_Getter";
 
-
-  /** @domName HTMLMediaElement.ended */
+  @DocsEditable
+  @DomName('HTMLMediaElement.ended')
   bool get ended native "HTMLMediaElement_ended_Getter";
 
-
-  /** @domName HTMLMediaElement.error */
+  @DocsEditable
+  @DomName('HTMLMediaElement.error')
   MediaError get error native "HTMLMediaElement_error_Getter";
 
-
-  /** @domName HTMLMediaElement.initialTime */
+  @DocsEditable
+  @DomName('HTMLMediaElement.initialTime')
   num get initialTime native "HTMLMediaElement_initialTime_Getter";
 
-
-  /** @domName HTMLMediaElement.loop */
+  @DocsEditable
+  @DomName('HTMLMediaElement.loop')
   bool get loop native "HTMLMediaElement_loop_Getter";
 
-
-  /** @domName HTMLMediaElement.loop */
+  @DocsEditable
+  @DomName('HTMLMediaElement.loop')
   void set loop(bool value) native "HTMLMediaElement_loop_Setter";
 
-
-  /** @domName HTMLMediaElement.mediaGroup */
+  @DocsEditable
+  @DomName('HTMLMediaElement.mediaGroup')
   String get mediaGroup native "HTMLMediaElement_mediaGroup_Getter";
 
-
-  /** @domName HTMLMediaElement.mediaGroup */
+  @DocsEditable
+  @DomName('HTMLMediaElement.mediaGroup')
   void set mediaGroup(String value) native "HTMLMediaElement_mediaGroup_Setter";
 
-
-  /** @domName HTMLMediaElement.muted */
+  @DocsEditable
+  @DomName('HTMLMediaElement.muted')
   bool get muted native "HTMLMediaElement_muted_Getter";
 
-
-  /** @domName HTMLMediaElement.muted */
+  @DocsEditable
+  @DomName('HTMLMediaElement.muted')
   void set muted(bool value) native "HTMLMediaElement_muted_Setter";
 
-
-  /** @domName HTMLMediaElement.networkState */
+  @DocsEditable
+  @DomName('HTMLMediaElement.networkState')
   int get networkState native "HTMLMediaElement_networkState_Getter";
 
-
-  /** @domName HTMLMediaElement.paused */
+  @DocsEditable
+  @DomName('HTMLMediaElement.paused')
   bool get paused native "HTMLMediaElement_paused_Getter";
 
-
-  /** @domName HTMLMediaElement.playbackRate */
+  @DocsEditable
+  @DomName('HTMLMediaElement.playbackRate')
   num get playbackRate native "HTMLMediaElement_playbackRate_Getter";
 
-
-  /** @domName HTMLMediaElement.playbackRate */
+  @DocsEditable
+  @DomName('HTMLMediaElement.playbackRate')
   void set playbackRate(num value) native "HTMLMediaElement_playbackRate_Setter";
 
-
-  /** @domName HTMLMediaElement.played */
+  @DocsEditable
+  @DomName('HTMLMediaElement.played')
   TimeRanges get played native "HTMLMediaElement_played_Getter";
 
-
-  /** @domName HTMLMediaElement.preload */
+  @DocsEditable
+  @DomName('HTMLMediaElement.preload')
   String get preload native "HTMLMediaElement_preload_Getter";
 
-
-  /** @domName HTMLMediaElement.preload */
+  @DocsEditable
+  @DomName('HTMLMediaElement.preload')
   void set preload(String value) native "HTMLMediaElement_preload_Setter";
 
-
-  /** @domName HTMLMediaElement.readyState */
+  @DocsEditable
+  @DomName('HTMLMediaElement.readyState')
   int get readyState native "HTMLMediaElement_readyState_Getter";
 
-
-  /** @domName HTMLMediaElement.seekable */
+  @DocsEditable
+  @DomName('HTMLMediaElement.seekable')
   TimeRanges get seekable native "HTMLMediaElement_seekable_Getter";
 
-
-  /** @domName HTMLMediaElement.seeking */
+  @DocsEditable
+  @DomName('HTMLMediaElement.seeking')
   bool get seeking native "HTMLMediaElement_seeking_Getter";
 
-
-  /** @domName HTMLMediaElement.src */
+  @DocsEditable
+  @DomName('HTMLMediaElement.src')
   String get src native "HTMLMediaElement_src_Getter";
 
-
-  /** @domName HTMLMediaElement.src */
+  @DocsEditable
+  @DomName('HTMLMediaElement.src')
   void set src(String value) native "HTMLMediaElement_src_Setter";
 
-
-  /** @domName HTMLMediaElement.startTime */
+  @DocsEditable
+  @DomName('HTMLMediaElement.startTime')
   num get startTime native "HTMLMediaElement_startTime_Getter";
 
-
-  /** @domName HTMLMediaElement.textTracks */
+  @DocsEditable
+  @DomName('HTMLMediaElement.textTracks')
   TextTrackList get textTracks native "HTMLMediaElement_textTracks_Getter";
 
-
-  /** @domName HTMLMediaElement.volume */
+  @DocsEditable
+  @DomName('HTMLMediaElement.volume')
   num get volume native "HTMLMediaElement_volume_Getter";
 
-
-  /** @domName HTMLMediaElement.volume */
+  @DocsEditable
+  @DomName('HTMLMediaElement.volume')
   void set volume(num value) native "HTMLMediaElement_volume_Setter";
 
-
-  /** @domName HTMLMediaElement.webkitAudioDecodedByteCount */
+  @DocsEditable
+  @DomName('HTMLMediaElement.webkitAudioDecodedByteCount')
   int get webkitAudioDecodedByteCount native "HTMLMediaElement_webkitAudioDecodedByteCount_Getter";
 
-
-  /** @domName HTMLMediaElement.webkitClosedCaptionsVisible */
+  @DocsEditable
+  @DomName('HTMLMediaElement.webkitClosedCaptionsVisible')
   bool get webkitClosedCaptionsVisible native "HTMLMediaElement_webkitClosedCaptionsVisible_Getter";
 
-
-  /** @domName HTMLMediaElement.webkitClosedCaptionsVisible */
+  @DocsEditable
+  @DomName('HTMLMediaElement.webkitClosedCaptionsVisible')
   void set webkitClosedCaptionsVisible(bool value) native "HTMLMediaElement_webkitClosedCaptionsVisible_Setter";
 
-
-  /** @domName HTMLMediaElement.webkitHasClosedCaptions */
+  @DocsEditable
+  @DomName('HTMLMediaElement.webkitHasClosedCaptions')
   bool get webkitHasClosedCaptions native "HTMLMediaElement_webkitHasClosedCaptions_Getter";
 
-
-  /** @domName HTMLMediaElement.webkitPreservesPitch */
+  @DocsEditable
+  @DomName('HTMLMediaElement.webkitPreservesPitch')
   bool get webkitPreservesPitch native "HTMLMediaElement_webkitPreservesPitch_Getter";
 
-
-  /** @domName HTMLMediaElement.webkitPreservesPitch */
+  @DocsEditable
+  @DomName('HTMLMediaElement.webkitPreservesPitch')
   void set webkitPreservesPitch(bool value) native "HTMLMediaElement_webkitPreservesPitch_Setter";
 
-
-  /** @domName HTMLMediaElement.webkitVideoDecodedByteCount */
+  @DocsEditable
+  @DomName('HTMLMediaElement.webkitVideoDecodedByteCount')
   int get webkitVideoDecodedByteCount native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";
 
-  TextTrack addTextTrack(/*DOMString*/ kind, [/*DOMString*/ label, /*DOMString*/ language]) {
+  TextTrack addTextTrack(String kind, [String label, String language]) {
     if (?language) {
       return _addTextTrack_1(kind, label, language);
     }
@@ -16258,35 +16016,35 @@
     return _addTextTrack_3(kind);
   }
 
-
-  /** @domName HTMLMediaElement.addTextTrack_1 */
+  @DocsEditable
+  @DomName('HTMLMediaElement.addTextTrack_1')
   TextTrack _addTextTrack_1(kind, label, language) native "HTMLMediaElement_addTextTrack_1_Callback";
 
-
-  /** @domName HTMLMediaElement.addTextTrack_2 */
+  @DocsEditable
+  @DomName('HTMLMediaElement.addTextTrack_2')
   TextTrack _addTextTrack_2(kind, label) native "HTMLMediaElement_addTextTrack_2_Callback";
 
-
-  /** @domName HTMLMediaElement.addTextTrack_3 */
+  @DocsEditable
+  @DomName('HTMLMediaElement.addTextTrack_3')
   TextTrack _addTextTrack_3(kind) native "HTMLMediaElement_addTextTrack_3_Callback";
 
-
-  /** @domName HTMLMediaElement.canPlayType */
+  @DocsEditable
+  @DomName('HTMLMediaElement.canPlayType')
   String canPlayType(String type, String keySystem) native "HTMLMediaElement_canPlayType_Callback";
 
-
-  /** @domName HTMLMediaElement.load */
+  @DocsEditable
+  @DomName('HTMLMediaElement.load')
   void load() native "HTMLMediaElement_load_Callback";
 
-
-  /** @domName HTMLMediaElement.pause */
+  @DocsEditable
+  @DomName('HTMLMediaElement.pause')
   void pause() native "HTMLMediaElement_pause_Callback";
 
-
-  /** @domName HTMLMediaElement.play */
+  @DocsEditable
+  @DomName('HTMLMediaElement.play')
   void play() native "HTMLMediaElement_play_Callback";
 
-  void webkitAddKey(/*DOMString*/ keySystem, /*Uint8Array*/ key, [/*Uint8Array*/ initData, /*DOMString*/ sessionId]) {
+  void webkitAddKey(String keySystem, Uint8Array key, [Uint8Array initData, String sessionId]) {
     if (?initData) {
       _webkitAddKey_1(keySystem, key, initData, sessionId);
       return;
@@ -16294,19 +16052,19 @@
     _webkitAddKey_2(keySystem, key);
   }
 
-
-  /** @domName HTMLMediaElement.webkitAddKey_1 */
+  @DocsEditable
+  @DomName('HTMLMediaElement.webkitAddKey_1')
   void _webkitAddKey_1(keySystem, key, initData, sessionId) native "HTMLMediaElement_webkitAddKey_1_Callback";
 
-
-  /** @domName HTMLMediaElement.webkitAddKey_2 */
+  @DocsEditable
+  @DomName('HTMLMediaElement.webkitAddKey_2')
   void _webkitAddKey_2(keySystem, key) native "HTMLMediaElement_webkitAddKey_2_Callback";
 
-
-  /** @domName HTMLMediaElement.webkitCancelKeyRequest */
+  @DocsEditable
+  @DomName('HTMLMediaElement.webkitCancelKeyRequest')
   void webkitCancelKeyRequest(String keySystem, String sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
 
-  void webkitGenerateKeyRequest(/*DOMString*/ keySystem, [/*Uint8Array*/ initData]) {
+  void webkitGenerateKeyRequest(String keySystem, [Uint8Array initData]) {
     if (?initData) {
       _webkitGenerateKeyRequest_1(keySystem, initData);
       return;
@@ -16314,12 +16072,12 @@
     _webkitGenerateKeyRequest_2(keySystem);
   }
 
-
-  /** @domName HTMLMediaElement.webkitGenerateKeyRequest_1 */
+  @DocsEditable
+  @DomName('HTMLMediaElement.webkitGenerateKeyRequest_1')
   void _webkitGenerateKeyRequest_1(keySystem, initData) native "HTMLMediaElement_webkitGenerateKeyRequest_1_Callback";
 
-
-  /** @domName HTMLMediaElement.webkitGenerateKeyRequest_2 */
+  @DocsEditable
+  @DomName('HTMLMediaElement.webkitGenerateKeyRequest_2')
   void _webkitGenerateKeyRequest_2(keySystem) native "HTMLMediaElement_webkitGenerateKeyRequest_2_Callback";
 
   Stream<Event> get onCanPlay => canPlayEvent.forTarget(this);
@@ -16374,84 +16132,84 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class MediaElementEvents extends ElementEvents {
-  /// @docsEditable true
+  @DocsEditable
   MediaElementEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get canPlay => this['canplay'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get canPlayThrough => this['canplaythrough'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get durationChange => this['durationchange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get emptied => this['emptied'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get ended => this['ended'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadedData => this['loadeddata'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadedMetadata => this['loadedmetadata'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadStart => this['loadstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get pause => this['pause'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get play => this['play'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get playing => this['playing'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get progress => this['progress'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get rateChange => this['ratechange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get seeked => this['seeked'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get seeking => this['seeking'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get show => this['show'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get stalled => this['stalled'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get suspend => this['suspend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get timeUpdate => this['timeupdate'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get volumeChange => this['volumechange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get waiting => this['waiting'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyAdded => this['webkitkeyadded'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyError => this['webkitkeyerror'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyMessage => this['webkitkeymessage'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get needKey => this['webkitneedkey'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16461,7 +16219,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaError
+@DocsEditable
+@DomName('MediaError')
 class MediaError extends NativeFieldWrapperClass1 {
   MediaError.internal();
 
@@ -16475,8 +16234,8 @@
 
   static const int MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
 
-
-  /** @domName MediaError.code */
+  @DocsEditable
+  @DomName('MediaError.code')
   int get code native "MediaError_code_Getter";
 
 }
@@ -16487,7 +16246,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaKeyError
+@DocsEditable
+@DomName('MediaKeyError')
 class MediaKeyError extends NativeFieldWrapperClass1 {
   MediaKeyError.internal();
 
@@ -16503,8 +16263,8 @@
 
   static const int MEDIA_KEYERR_UNKNOWN = 1;
 
-
-  /** @domName MediaKeyError.code */
+  @DocsEditable
+  @DomName('MediaKeyError.code')
   int get code native "MediaKeyError_code_Getter";
 
 }
@@ -16515,36 +16275,37 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaKeyEvent
+@DocsEditable
+@DomName('MediaKeyEvent')
 class MediaKeyEvent extends Event {
   MediaKeyEvent.internal() : super.internal();
 
-
-  /** @domName MediaKeyEvent.defaultURL */
+  @DocsEditable
+  @DomName('MediaKeyEvent.defaultURL')
   String get defaultUrl native "MediaKeyEvent_defaultURL_Getter";
 
-
-  /** @domName MediaKeyEvent.errorCode */
+  @DocsEditable
+  @DomName('MediaKeyEvent.errorCode')
   MediaKeyError get errorCode native "MediaKeyEvent_errorCode_Getter";
 
-
-  /** @domName MediaKeyEvent.initData */
+  @DocsEditable
+  @DomName('MediaKeyEvent.initData')
   Uint8Array get initData native "MediaKeyEvent_initData_Getter";
 
-
-  /** @domName MediaKeyEvent.keySystem */
+  @DocsEditable
+  @DomName('MediaKeyEvent.keySystem')
   String get keySystem native "MediaKeyEvent_keySystem_Getter";
 
-
-  /** @domName MediaKeyEvent.message */
+  @DocsEditable
+  @DomName('MediaKeyEvent.message')
   Uint8Array get message native "MediaKeyEvent_message_Getter";
 
-
-  /** @domName MediaKeyEvent.sessionId */
+  @DocsEditable
+  @DomName('MediaKeyEvent.sessionId')
   String get sessionId native "MediaKeyEvent_sessionId_Getter";
 
-
-  /** @domName MediaKeyEvent.systemCode */
+  @DocsEditable
+  @DomName('MediaKeyEvent.systemCode')
   int get systemCode native "MediaKeyEvent_systemCode_Getter";
 
 }
@@ -16555,32 +16316,33 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaList
+@DocsEditable
+@DomName('MediaList')
 class MediaList extends NativeFieldWrapperClass1 {
   MediaList.internal();
 
-
-  /** @domName MediaList.length */
+  @DocsEditable
+  @DomName('MediaList.length')
   int get length native "MediaList_length_Getter";
 
-
-  /** @domName MediaList.mediaText */
+  @DocsEditable
+  @DomName('MediaList.mediaText')
   String get mediaText native "MediaList_mediaText_Getter";
 
-
-  /** @domName MediaList.mediaText */
+  @DocsEditable
+  @DomName('MediaList.mediaText')
   void set mediaText(String value) native "MediaList_mediaText_Setter";
 
-
-  /** @domName MediaList.appendMedium */
+  @DocsEditable
+  @DomName('MediaList.appendMedium')
   void appendMedium(String newMedium) native "MediaList_appendMedium_Callback";
 
-
-  /** @domName MediaList.deleteMedium */
+  @DocsEditable
+  @DomName('MediaList.deleteMedium')
   void deleteMedium(String oldMedium) native "MediaList_deleteMedium_Callback";
 
-
-  /** @domName MediaList.item */
+  @DocsEditable
+  @DomName('MediaList.item')
   String item(int index) native "MediaList_item_Callback";
 
 }
@@ -16591,24 +16353,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaQueryList
+@DocsEditable
+@DomName('MediaQueryList')
 class MediaQueryList extends NativeFieldWrapperClass1 {
   MediaQueryList.internal();
 
-
-  /** @domName MediaQueryList.matches */
+  @DocsEditable
+  @DomName('MediaQueryList.matches')
   bool get matches native "MediaQueryList_matches_Getter";
 
-
-  /** @domName MediaQueryList.media */
+  @DocsEditable
+  @DomName('MediaQueryList.media')
   String get media native "MediaQueryList_media_Getter";
 
-
-  /** @domName MediaQueryList.addListener */
+  @DocsEditable
+  @DomName('MediaQueryList.addListener')
   void addListener(MediaQueryListListener listener) native "MediaQueryList_addListener_Callback";
 
-
-  /** @domName MediaQueryList.removeListener */
+  @DocsEditable
+  @DomName('MediaQueryList.removeListener')
   void removeListener(MediaQueryListListener listener) native "MediaQueryList_removeListener_Callback";
 
 }
@@ -16619,12 +16382,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaQueryListListener
+@DocsEditable
+@DomName('MediaQueryListListener')
 class MediaQueryListListener extends NativeFieldWrapperClass1 {
   MediaQueryListListener.internal();
 
-
-  /** @domName MediaQueryListListener.queryChanged */
+  @DocsEditable
+  @DomName('MediaQueryListListener.queryChanged')
   void queryChanged(MediaQueryList list) native "MediaQueryListListener_queryChanged_Callback";
 
 }
@@ -16635,123 +16399,152 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaSource
+@DocsEditable
+@DomName('MediaSource')
 class MediaSource extends EventTarget {
   MediaSource.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory MediaSource() => MediaSource._create();
   static MediaSource _create() native "MediaSource_constructor_Callback";
 
-
-  /** @domName MediaSource.activeSourceBuffers */
+  @DocsEditable
+  @DomName('MediaSource.activeSourceBuffers')
   SourceBufferList get activeSourceBuffers native "MediaSource_activeSourceBuffers_Getter";
 
-
-  /** @domName MediaSource.duration */
+  @DocsEditable
+  @DomName('MediaSource.duration')
   num get duration native "MediaSource_duration_Getter";
 
-
-  /** @domName MediaSource.duration */
+  @DocsEditable
+  @DomName('MediaSource.duration')
   void set duration(num value) native "MediaSource_duration_Setter";
 
-
-  /** @domName MediaSource.readyState */
+  @DocsEditable
+  @DomName('MediaSource.readyState')
   String get readyState native "MediaSource_readyState_Getter";
 
-
-  /** @domName MediaSource.sourceBuffers */
+  @DocsEditable
+  @DomName('MediaSource.sourceBuffers')
   SourceBufferList get sourceBuffers native "MediaSource_sourceBuffers_Getter";
 
-
-  /** @domName MediaSource.addEventListener */
+  @DocsEditable
+  @DomName('MediaSource.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_addEventListener_Callback";
 
-
-  /** @domName MediaSource.addSourceBuffer */
+  @DocsEditable
+  @DomName('MediaSource.addSourceBuffer')
   SourceBuffer addSourceBuffer(String type) native "MediaSource_addSourceBuffer_Callback";
 
-
-  /** @domName MediaSource.dispatchEvent */
+  @DocsEditable
+  @DomName('MediaSource.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native "MediaSource_dispatchEvent_Callback";
 
-
-  /** @domName MediaSource.endOfStream */
+  @DocsEditable
+  @DomName('MediaSource.endOfStream')
   void endOfStream(String error) native "MediaSource_endOfStream_Callback";
 
-
-  /** @domName MediaSource.removeEventListener */
+  @DocsEditable
+  @DomName('MediaSource.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_removeEventListener_Callback";
 
-
-  /** @domName MediaSource.removeSourceBuffer */
+  @DocsEditable
+  @DomName('MediaSource.removeSourceBuffer')
   void removeSourceBuffer(SourceBuffer buffer) native "MediaSource_removeSourceBuffer_Callback";
 
 }
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
 
-
-/// @domName MediaStream
+/// @domName MediaStream; @docsEditable true
+@DocsEditable
+@DomName('MediaStream')
 class MediaStream extends EventTarget {
   MediaStream.internal() : super.internal();
 
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
-  ///@docsEditable true
-  factory MediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) => MediaStream._create(audioTracks, videoTracks);
-  static MediaStream _create(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) native "MediaStream_constructor_Callback";
+  @DocsEditable
+  factory MediaStream() => MediaStream._create();
+  static MediaStream _create() native "MediaStream_constructor_Callback";
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   MediaStreamEvents get on =>
     new MediaStreamEvents(this);
 
-  static const int ENDED = 2;
+  @DocsEditable
+  @DomName('MediaStream.ended')
+  bool get ended native "MediaStream_ended_Getter";
 
-  static const int LIVE = 1;
+  @DocsEditable
+  @DomName('MediaStream.id')
+  String get id native "MediaStream_id_Getter";
 
-
-  /** @domName MediaStream.audioTracks */
-  MediaStreamTrackList get audioTracks native "MediaStream_audioTracks_Getter";
-
-
-  /** @domName MediaStream.label */
+  @DocsEditable
+  @DomName('MediaStream.label')
   String get label native "MediaStream_label_Getter";
 
-
-  /** @domName MediaStream.readyState */
-  int get readyState native "MediaStream_readyState_Getter";
-
-
-  /** @domName MediaStream.videoTracks */
-  MediaStreamTrackList get videoTracks native "MediaStream_videoTracks_Getter";
-
-
-  /** @domName MediaStream.addEventListener */
+  @DocsEditable
+  @DomName('MediaStream.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_addEventListener_Callback";
 
+  @DocsEditable
+  @DomName('MediaStream.addTrack')
+  void addTrack(MediaStreamTrack track) native "MediaStream_addTrack_Callback";
 
-  /** @domName MediaStream.dispatchEvent */
+  @DocsEditable
+  @DomName('MediaStream.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native "MediaStream_dispatchEvent_Callback";
 
+  @DocsEditable
+  @DomName('MediaStream.getAudioTracks')
+  List<MediaStreamTrack> getAudioTracks() native "MediaStream_getAudioTracks_Callback";
 
-  /** @domName MediaStream.removeEventListener */
+  @DocsEditable
+  @DomName('MediaStream.getTrackById')
+  MediaStreamTrack getTrackById(String trackId) native "MediaStream_getTrackById_Callback";
+
+  @DocsEditable
+  @DomName('MediaStream.getVideoTracks')
+  List<MediaStreamTrack> getVideoTracks() native "MediaStream_getVideoTracks_Callback";
+
+  @DocsEditable
+  @DomName('MediaStream.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_removeEventListener_Callback";
 
+  @DocsEditable
+  @DomName('MediaStream.removeTrack')
+  void removeTrack(MediaStreamTrack track) native "MediaStream_removeTrack_Callback";
+
   Stream<Event> get onEnded => endedEvent.forTarget(this);
 
+
+  /**
+   * Checks if the MediaStream APIs are supported on the current platform.
+   *
+   * See also:
+   *
+   * * [Navigator.getUserMedia]
+   */
+  static bool get supported => true;
 }
 
-/// @docsEditable true
+@DocsEditable
 class MediaStreamEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   MediaStreamEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
+  EventListenerList get addTrack => this['addtrack'];
+
+  @DocsEditable
   EventListenerList get ended => this['ended'];
+
+  @DocsEditable
+  EventListenerList get removeTrack => this['removetrack'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -16760,12 +16553,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaStreamEvent
+@DocsEditable
+@DomName('MediaStreamEvent')
 class MediaStreamEvent extends Event {
   MediaStreamEvent.internal() : super.internal();
 
-
-  /** @domName MediaStreamEvent.stream */
+  @DocsEditable
+  @DomName('MediaStreamEvent.stream')
   MediaStream get stream native "MediaStreamEvent_stream_Getter";
 
 }
@@ -16776,7 +16570,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaStreamTrack
+@DocsEditable
+@DomName('MediaStreamTrack')
 class MediaStreamTrack extends EventTarget {
   MediaStreamTrack.internal() : super.internal();
 
@@ -16786,7 +16581,8 @@
 
   static const EventStreamProvider<Event> unmuteEvent = const EventStreamProvider<Event>('unmute');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   MediaStreamTrackEvents get on =>
     new MediaStreamTrackEvents(this);
 
@@ -16796,36 +16592,40 @@
 
   static const int MUTED = 1;
 
-
-  /** @domName MediaStreamTrack.enabled */
+  @DocsEditable
+  @DomName('MediaStreamTrack.enabled')
   bool get enabled native "MediaStreamTrack_enabled_Getter";
 
-
-  /** @domName MediaStreamTrack.enabled */
+  @DocsEditable
+  @DomName('MediaStreamTrack.enabled')
   void set enabled(bool value) native "MediaStreamTrack_enabled_Setter";
 
+  @DocsEditable
+  @DomName('MediaStreamTrack.id')
+  String get id native "MediaStreamTrack_id_Getter";
 
-  /** @domName MediaStreamTrack.kind */
+  @DocsEditable
+  @DomName('MediaStreamTrack.kind')
   String get kind native "MediaStreamTrack_kind_Getter";
 
-
-  /** @domName MediaStreamTrack.label */
+  @DocsEditable
+  @DomName('MediaStreamTrack.label')
   String get label native "MediaStreamTrack_label_Getter";
 
-
-  /** @domName MediaStreamTrack.readyState */
+  @DocsEditable
+  @DomName('MediaStreamTrack.readyState')
   int get readyState native "MediaStreamTrack_readyState_Getter";
 
-
-  /** @domName MediaStreamTrack.addEventListener */
+  @DocsEditable
+  @DomName('MediaStreamTrack.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrack_addEventListener_Callback";
 
-
-  /** @domName MediaStreamTrack.dispatchEvent */
+  @DocsEditable
+  @DomName('MediaStreamTrack.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native "MediaStreamTrack_dispatchEvent_Callback";
 
-
-  /** @domName MediaStreamTrack.removeEventListener */
+  @DocsEditable
+  @DomName('MediaStreamTrack.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrack_removeEventListener_Callback";
 
   Stream<Event> get onEnded => endedEvent.forTarget(this);
@@ -16836,18 +16636,18 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class MediaStreamTrackEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   MediaStreamTrackEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get ended => this['ended'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mute => this['mute'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get unmute => this['unmute'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16857,12 +16657,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaStreamTrackEvent
+@DocsEditable
+@DomName('MediaStreamTrackEvent')
 class MediaStreamTrackEvent extends Event {
   MediaStreamTrackEvent.internal() : super.internal();
 
-
-  /** @domName MediaStreamTrackEvent.track */
+  @DocsEditable
+  @DomName('MediaStreamTrackEvent.track')
   MediaStreamTrack get track native "MediaStreamTrackEvent_track_Getter";
 
 }
@@ -16873,84 +16674,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaStreamTrackList
-class MediaStreamTrackList extends EventTarget {
-  MediaStreamTrackList.internal() : super.internal();
-
-  static const EventStreamProvider<MediaStreamTrackEvent> addTrackEvent = const EventStreamProvider<MediaStreamTrackEvent>('addtrack');
-
-  static const EventStreamProvider<MediaStreamTrackEvent> removeTrackEvent = const EventStreamProvider<MediaStreamTrackEvent>('removetrack');
-
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
-  MediaStreamTrackListEvents get on =>
-    new MediaStreamTrackListEvents(this);
-
-
-  /** @domName MediaStreamTrackList.length */
-  int get length native "MediaStreamTrackList_length_Getter";
-
-
-  /** @domName MediaStreamTrackList.add */
-  void add(MediaStreamTrack track) native "MediaStreamTrackList_add_Callback";
-
-
-  /** @domName MediaStreamTrackList.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrackList_addEventListener_Callback";
-
-
-  /** @domName MediaStreamTrackList.dispatchEvent */
-  bool $dom_dispatchEvent(Event event) native "MediaStreamTrackList_dispatchEvent_Callback";
-
-
-  /** @domName MediaStreamTrackList.item */
-  MediaStreamTrack item(int index) native "MediaStreamTrackList_item_Callback";
-
-
-  /** @domName MediaStreamTrackList.remove */
-  void remove(MediaStreamTrack track) native "MediaStreamTrackList_remove_Callback";
-
-
-  /** @domName MediaStreamTrackList.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrackList_removeEventListener_Callback";
-
-  Stream<MediaStreamTrackEvent> get onAddTrack => addTrackEvent.forTarget(this);
-
-  Stream<MediaStreamTrackEvent> get onRemoveTrack => removeTrackEvent.forTarget(this);
-
-}
-
-/// @docsEditable true
-class MediaStreamTrackListEvents extends Events {
-  /// @docsEditable true
-  MediaStreamTrackListEvents(EventTarget _ptr) : super(_ptr);
-
-  /// @docsEditable true
-  EventListenerList get addTrack => this['addtrack'];
-
-  /// @docsEditable true
-  EventListenerList get removeTrack => this['removetrack'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName MemoryInfo
+@DocsEditable
+@DomName('MemoryInfo')
 class MemoryInfo extends NativeFieldWrapperClass1 {
   MemoryInfo.internal();
 
-
-  /** @domName MemoryInfo.jsHeapSizeLimit */
+  @DocsEditable
+  @DomName('MemoryInfo.jsHeapSizeLimit')
   int get jsHeapSizeLimit native "MemoryInfo_jsHeapSizeLimit_Getter";
 
-
-  /** @domName MemoryInfo.totalJSHeapSize */
+  @DocsEditable
+  @DomName('MemoryInfo.totalJSHeapSize')
   int get totalJSHeapSize native "MemoryInfo_totalJSHeapSize_Getter";
 
-
-  /** @domName MemoryInfo.usedJSHeapSize */
+  @DocsEditable
+  @DomName('MemoryInfo.usedJSHeapSize')
   int get usedJSHeapSize native "MemoryInfo_usedJSHeapSize_Getter";
 
 }
@@ -16961,11 +16699,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLMenuElement
+@DocsEditable
+@DomName('HTMLMenuElement')
 class MenuElement extends _Element_Merged {
   MenuElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory MenuElement() => document.$dom_createElement("menu");
 
 }
@@ -16976,20 +16715,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MessageChannel
+@DocsEditable
+@DomName('MessageChannel')
 class MessageChannel extends NativeFieldWrapperClass1 {
   MessageChannel.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory MessageChannel() => MessageChannel._create();
   static MessageChannel _create() native "MessageChannel_constructor_Callback";
 
-
-  /** @domName MessageChannel.port1 */
+  @DocsEditable
+  @DomName('MessageChannel.port1')
   MessagePort get port1 native "MessageChannel_port1_Getter";
 
-
-  /** @domName MessageChannel.port2 */
+  @DocsEditable
+  @DomName('MessageChannel.port2')
   MessagePort get port2 native "MessageChannel_port2_Getter";
 
 }
@@ -17000,36 +16740,37 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MessageEvent
+@DocsEditable
+@DomName('MessageEvent')
 class MessageEvent extends Event {
   MessageEvent.internal() : super.internal();
 
-
-  /** @domName MessageEvent.data */
+  @DocsEditable
+  @DomName('MessageEvent.data')
   Object get data native "MessageEvent_data_Getter";
 
-
-  /** @domName MessageEvent.lastEventId */
+  @DocsEditable
+  @DomName('MessageEvent.lastEventId')
   String get lastEventId native "MessageEvent_lastEventId_Getter";
 
-
-  /** @domName MessageEvent.origin */
+  @DocsEditable
+  @DomName('MessageEvent.origin')
   String get origin native "MessageEvent_origin_Getter";
 
-
-  /** @domName MessageEvent.ports */
+  @DocsEditable
+  @DomName('MessageEvent.ports')
   List get ports native "MessageEvent_ports_Getter";
 
-
-  /** @domName MessageEvent.source */
+  @DocsEditable
+  @DomName('MessageEvent.source')
   WindowBase get source native "MessageEvent_source_Getter";
 
-
-  /** @domName MessageEvent.initMessageEvent */
+  @DocsEditable
+  @DomName('MessageEvent.initMessageEvent')
   void initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List messagePorts) native "MessageEvent_initMessageEvent_Callback";
 
-
-  /** @domName MessageEvent.webkitInitMessageEvent */
+  @DocsEditable
+  @DomName('MessageEvent.webkitInitMessageEvent')
   void webkitInitMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List transferables) native "MessageEvent_webkitInitMessageEvent_Callback";
 
 }
@@ -17040,50 +16781,52 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MessagePort
+@DocsEditable
+@DomName('MessagePort')
 class MessagePort extends EventTarget {
   MessagePort.internal() : super.internal();
 
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   MessagePortEvents get on =>
     new MessagePortEvents(this);
 
-
-  /** @domName MessagePort.addEventListener */
+  @DocsEditable
+  @DomName('MessagePort.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_addEventListener_Callback";
 
-
-  /** @domName MessagePort.close */
+  @DocsEditable
+  @DomName('MessagePort.close')
   void close() native "MessagePort_close_Callback";
 
-
-  /** @domName MessagePort.dispatchEvent */
+  @DocsEditable
+  @DomName('MessagePort.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "MessagePort_dispatchEvent_Callback";
 
-
-  /** @domName MessagePort.postMessage */
+  @DocsEditable
+  @DomName('MessagePort.postMessage')
   void postMessage(Object message, [List messagePorts]) native "MessagePort_postMessage_Callback";
 
-
-  /** @domName MessagePort.removeEventListener */
+  @DocsEditable
+  @DomName('MessagePort.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_removeEventListener_Callback";
 
-
-  /** @domName MessagePort.start */
+  @DocsEditable
+  @DomName('MessagePort.start')
   void start() native "MessagePort_start_Callback";
 
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class MessagePortEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   MessagePortEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get message => this['message'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17093,32 +16836,33 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLMetaElement
+@DocsEditable
+@DomName('HTMLMetaElement')
 class MetaElement extends _Element_Merged {
   MetaElement.internal() : super.internal();
 
-
-  /** @domName HTMLMetaElement.content */
+  @DocsEditable
+  @DomName('HTMLMetaElement.content')
   String get content native "HTMLMetaElement_content_Getter";
 
-
-  /** @domName HTMLMetaElement.content */
+  @DocsEditable
+  @DomName('HTMLMetaElement.content')
   void set content(String value) native "HTMLMetaElement_content_Setter";
 
-
-  /** @domName HTMLMetaElement.httpEquiv */
+  @DocsEditable
+  @DomName('HTMLMetaElement.httpEquiv')
   String get httpEquiv native "HTMLMetaElement_httpEquiv_Getter";
 
-
-  /** @domName HTMLMetaElement.httpEquiv */
+  @DocsEditable
+  @DomName('HTMLMetaElement.httpEquiv')
   void set httpEquiv(String value) native "HTMLMetaElement_httpEquiv_Setter";
 
-
-  /** @domName HTMLMetaElement.name */
+  @DocsEditable
+  @DomName('HTMLMetaElement.name')
   String get name native "HTMLMetaElement_name_Getter";
 
-
-  /** @domName HTMLMetaElement.name */
+  @DocsEditable
+  @DomName('HTMLMetaElement.name')
   void set name(String value) native "HTMLMetaElement_name_Setter";
 
 }
@@ -17129,16 +16873,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Metadata
+@DocsEditable
+@DomName('Metadata')
 class Metadata extends NativeFieldWrapperClass1 {
   Metadata.internal();
 
-
-  /** @domName Metadata.modificationTime */
+  @DocsEditable
+  @DomName('Metadata.modificationTime')
   Date get modificationTime native "Metadata_modificationTime_Getter";
 
-
-  /** @domName Metadata.size */
+  @DocsEditable
+  @DomName('Metadata.size')
   int get size native "Metadata_size_Getter";
 
 }
@@ -17157,69 +16902,70 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLMeterElement
+@DocsEditable
+@DomName('HTMLMeterElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 class MeterElement extends _Element_Merged {
   MeterElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory MeterElement() => document.$dom_createElement("meter");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-
-  /** @domName HTMLMeterElement.high */
+  @DocsEditable
+  @DomName('HTMLMeterElement.high')
   num get high native "HTMLMeterElement_high_Getter";
 
-
-  /** @domName HTMLMeterElement.high */
+  @DocsEditable
+  @DomName('HTMLMeterElement.high')
   void set high(num value) native "HTMLMeterElement_high_Setter";
 
-
-  /** @domName HTMLMeterElement.labels */
+  @DocsEditable
+  @DomName('HTMLMeterElement.labels')
   List<Node> get labels native "HTMLMeterElement_labels_Getter";
 
-
-  /** @domName HTMLMeterElement.low */
+  @DocsEditable
+  @DomName('HTMLMeterElement.low')
   num get low native "HTMLMeterElement_low_Getter";
 
-
-  /** @domName HTMLMeterElement.low */
+  @DocsEditable
+  @DomName('HTMLMeterElement.low')
   void set low(num value) native "HTMLMeterElement_low_Setter";
 
-
-  /** @domName HTMLMeterElement.max */
+  @DocsEditable
+  @DomName('HTMLMeterElement.max')
   num get max native "HTMLMeterElement_max_Getter";
 
-
-  /** @domName HTMLMeterElement.max */
+  @DocsEditable
+  @DomName('HTMLMeterElement.max')
   void set max(num value) native "HTMLMeterElement_max_Setter";
 
-
-  /** @domName HTMLMeterElement.min */
+  @DocsEditable
+  @DomName('HTMLMeterElement.min')
   num get min native "HTMLMeterElement_min_Getter";
 
-
-  /** @domName HTMLMeterElement.min */
+  @DocsEditable
+  @DomName('HTMLMeterElement.min')
   void set min(num value) native "HTMLMeterElement_min_Setter";
 
-
-  /** @domName HTMLMeterElement.optimum */
+  @DocsEditable
+  @DomName('HTMLMeterElement.optimum')
   num get optimum native "HTMLMeterElement_optimum_Getter";
 
-
-  /** @domName HTMLMeterElement.optimum */
+  @DocsEditable
+  @DomName('HTMLMeterElement.optimum')
   void set optimum(num value) native "HTMLMeterElement_optimum_Setter";
 
-
-  /** @domName HTMLMeterElement.value */
+  @DocsEditable
+  @DomName('HTMLMeterElement.value')
   num get value native "HTMLMeterElement_value_Getter";
 
-
-  /** @domName HTMLMeterElement.value */
+  @DocsEditable
+  @DomName('HTMLMeterElement.value')
   void set value(num value) native "HTMLMeterElement_value_Setter";
 
 }
@@ -17230,24 +16976,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLModElement
+@DocsEditable
+@DomName('HTMLModElement')
 class ModElement extends _Element_Merged {
   ModElement.internal() : super.internal();
 
-
-  /** @domName HTMLModElement.cite */
+  @DocsEditable
+  @DomName('HTMLModElement.cite')
   String get cite native "HTMLModElement_cite_Getter";
 
-
-  /** @domName HTMLModElement.cite */
+  @DocsEditable
+  @DomName('HTMLModElement.cite')
   void set cite(String value) native "HTMLModElement_cite_Setter";
 
-
-  /** @domName HTMLModElement.dateTime */
+  @DocsEditable
+  @DomName('HTMLModElement.dateTime')
   String get dateTime native "HTMLModElement_dateTime_Getter";
 
-
-  /** @domName HTMLModElement.dateTime */
+  @DocsEditable
+  @DomName('HTMLModElement.dateTime')
   void set dateTime(String value) native "HTMLModElement_dateTime_Setter";
 
 }
@@ -17258,7 +17005,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MouseEvent
+@DocsEditable
+@DomName('MouseEvent')
 class MouseEvent extends UIEvent {
   factory MouseEvent(String type, Window view, int detail, int screenX,
       int screenY, int clientX, int clientY, int button, [bool canBubble = true,
@@ -17272,84 +17020,84 @@
           relatedTarget);
   MouseEvent.internal() : super.internal();
 
-
-  /** @domName MouseEvent.altKey */
+  @DocsEditable
+  @DomName('MouseEvent.altKey')
   bool get altKey native "MouseEvent_altKey_Getter";
 
-
-  /** @domName MouseEvent.button */
+  @DocsEditable
+  @DomName('MouseEvent.button')
   int get button native "MouseEvent_button_Getter";
 
-
-  /** @domName MouseEvent.clientX */
+  @DocsEditable
+  @DomName('MouseEvent.clientX')
   int get clientX native "MouseEvent_clientX_Getter";
 
-
-  /** @domName MouseEvent.clientY */
+  @DocsEditable
+  @DomName('MouseEvent.clientY')
   int get clientY native "MouseEvent_clientY_Getter";
 
-
-  /** @domName MouseEvent.ctrlKey */
+  @DocsEditable
+  @DomName('MouseEvent.ctrlKey')
   bool get ctrlKey native "MouseEvent_ctrlKey_Getter";
 
-
-  /** @domName MouseEvent.dataTransfer */
+  @DocsEditable
+  @DomName('MouseEvent.dataTransfer')
   Clipboard get dataTransfer native "MouseEvent_dataTransfer_Getter";
 
-
-  /** @domName MouseEvent.fromElement */
+  @DocsEditable
+  @DomName('MouseEvent.fromElement')
   Node get fromElement native "MouseEvent_fromElement_Getter";
 
-
-  /** @domName MouseEvent.metaKey */
+  @DocsEditable
+  @DomName('MouseEvent.metaKey')
   bool get metaKey native "MouseEvent_metaKey_Getter";
 
-
-  /** @domName MouseEvent.offsetX */
+  @DocsEditable
+  @DomName('MouseEvent.offsetX')
   int get offsetX native "MouseEvent_offsetX_Getter";
 
-
-  /** @domName MouseEvent.offsetY */
+  @DocsEditable
+  @DomName('MouseEvent.offsetY')
   int get offsetY native "MouseEvent_offsetY_Getter";
 
-
-  /** @domName MouseEvent.relatedTarget */
+  @DocsEditable
+  @DomName('MouseEvent.relatedTarget')
   EventTarget get relatedTarget native "MouseEvent_relatedTarget_Getter";
 
-
-  /** @domName MouseEvent.screenX */
+  @DocsEditable
+  @DomName('MouseEvent.screenX')
   int get screenX native "MouseEvent_screenX_Getter";
 
-
-  /** @domName MouseEvent.screenY */
+  @DocsEditable
+  @DomName('MouseEvent.screenY')
   int get screenY native "MouseEvent_screenY_Getter";
 
-
-  /** @domName MouseEvent.shiftKey */
+  @DocsEditable
+  @DomName('MouseEvent.shiftKey')
   bool get shiftKey native "MouseEvent_shiftKey_Getter";
 
-
-  /** @domName MouseEvent.toElement */
+  @DocsEditable
+  @DomName('MouseEvent.toElement')
   Node get toElement native "MouseEvent_toElement_Getter";
 
-
-  /** @domName MouseEvent.webkitMovementX */
+  @DocsEditable
+  @DomName('MouseEvent.webkitMovementX')
   int get webkitMovementX native "MouseEvent_webkitMovementX_Getter";
 
-
-  /** @domName MouseEvent.webkitMovementY */
+  @DocsEditable
+  @DomName('MouseEvent.webkitMovementY')
   int get webkitMovementY native "MouseEvent_webkitMovementY_Getter";
 
-
-  /** @domName MouseEvent.x */
+  @DocsEditable
+  @DomName('MouseEvent.x')
   int get x native "MouseEvent_x_Getter";
 
-
-  /** @domName MouseEvent.y */
+  @DocsEditable
+  @DomName('MouseEvent.y')
   int get y native "MouseEvent_y_Getter";
 
-
-  /** @domName MouseEvent.initMouseEvent */
+  @DocsEditable
+  @DomName('MouseEvent.initMouseEvent')
   void $dom_initMouseEvent(String type, bool canBubble, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) native "MouseEvent_initMouseEvent_Callback";
 
 }
@@ -17368,7 +17116,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MutationEvent
+@DocsEditable
+@DomName('MutationEvent')
 class MutationEvent extends Event {
   MutationEvent.internal() : super.internal();
 
@@ -17378,28 +17127,28 @@
 
   static const int REMOVAL = 3;
 
-
-  /** @domName MutationEvent.attrChange */
+  @DocsEditable
+  @DomName('MutationEvent.attrChange')
   int get attrChange native "MutationEvent_attrChange_Getter";
 
-
-  /** @domName MutationEvent.attrName */
+  @DocsEditable
+  @DomName('MutationEvent.attrName')
   String get attrName native "MutationEvent_attrName_Getter";
 
-
-  /** @domName MutationEvent.newValue */
+  @DocsEditable
+  @DomName('MutationEvent.newValue')
   String get newValue native "MutationEvent_newValue_Getter";
 
-
-  /** @domName MutationEvent.prevValue */
+  @DocsEditable
+  @DomName('MutationEvent.prevValue')
   String get prevValue native "MutationEvent_prevValue_Getter";
 
-
-  /** @domName MutationEvent.relatedNode */
+  @DocsEditable
+  @DomName('MutationEvent.relatedNode')
   Node get relatedNode native "MutationEvent_relatedNode_Getter";
 
-
-  /** @domName MutationEvent.initMutationEvent */
+  @DocsEditable
+  @DomName('MutationEvent.initMutationEvent')
   void initMutationEvent(String type, bool canBubble, bool cancelable, Node relatedNode, String prevValue, String newValue, String attrName, int attrChange) native "MutationEvent_initMutationEvent_Callback";
 
 }
@@ -17408,7 +17157,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MutationObserver
+@DocsEditable
+@DomName('MutationObserver')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -17416,20 +17166,20 @@
 class MutationObserver extends NativeFieldWrapperClass1 {
   MutationObserver.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory MutationObserver(MutationCallback callback) => MutationObserver._create(callback);
   static MutationObserver _create(MutationCallback callback) native "MutationObserver_constructor_Callback";
 
-
-  /** @domName MutationObserver.disconnect */
+  @DocsEditable
+  @DomName('MutationObserver.disconnect')
   void disconnect() native "MutationObserver_disconnect_Callback";
 
-
-  /** @domName MutationObserver._observe */
+  @DocsEditable
+  @DomName('MutationObserver._observe')
   void _observe(Node target, Map options) native "MutationObserver__observe_Callback";
 
-
-  /** @domName MutationObserver.takeRecords */
+  @DocsEditable
+  @DomName('MutationObserver.takeRecords')
   List<MutationRecord> takeRecords() native "MutationObserver_takeRecords_Callback";
 
   /**
@@ -17509,44 +17259,45 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MutationRecord
+@DocsEditable
+@DomName('MutationRecord')
 class MutationRecord extends NativeFieldWrapperClass1 {
   MutationRecord.internal();
 
-
-  /** @domName MutationRecord.addedNodes */
+  @DocsEditable
+  @DomName('MutationRecord.addedNodes')
   List<Node> get addedNodes native "MutationRecord_addedNodes_Getter";
 
-
-  /** @domName MutationRecord.attributeName */
+  @DocsEditable
+  @DomName('MutationRecord.attributeName')
   String get attributeName native "MutationRecord_attributeName_Getter";
 
-
-  /** @domName MutationRecord.attributeNamespace */
+  @DocsEditable
+  @DomName('MutationRecord.attributeNamespace')
   String get attributeNamespace native "MutationRecord_attributeNamespace_Getter";
 
-
-  /** @domName MutationRecord.nextSibling */
+  @DocsEditable
+  @DomName('MutationRecord.nextSibling')
   Node get nextSibling native "MutationRecord_nextSibling_Getter";
 
-
-  /** @domName MutationRecord.oldValue */
+  @DocsEditable
+  @DomName('MutationRecord.oldValue')
   String get oldValue native "MutationRecord_oldValue_Getter";
 
-
-  /** @domName MutationRecord.previousSibling */
+  @DocsEditable
+  @DomName('MutationRecord.previousSibling')
   Node get previousSibling native "MutationRecord_previousSibling_Getter";
 
-
-  /** @domName MutationRecord.removedNodes */
+  @DocsEditable
+  @DomName('MutationRecord.removedNodes')
   List<Node> get removedNodes native "MutationRecord_removedNodes_Getter";
 
-
-  /** @domName MutationRecord.target */
+  @DocsEditable
+  @DomName('MutationRecord.target')
   Node get target native "MutationRecord_target_Getter";
 
-
-  /** @domName MutationRecord.type */
+  @DocsEditable
+  @DomName('MutationRecord.type')
   String get type native "MutationRecord_type_Getter";
 
 }
@@ -17557,12 +17308,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName NamedNodeMap
+@DocsEditable
+@DomName('NamedNodeMap')
 class NamedNodeMap extends NativeFieldWrapperClass1 implements List<Node> {
   NamedNodeMap.internal();
 
-
-  /** @domName NamedNodeMap.length */
+  @DocsEditable
+  @DomName('NamedNodeMap.length')
   int get length native "NamedNodeMap_length_Getter";
 
   Node operator[](int index) native "NamedNodeMap_item_Callback";
@@ -17583,50 +17335,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Node element) => Collections.contains(this, element);
+  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Node element)) => Collections.forEach(this, f);
+  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Node element)) => new MappedList<Node, dynamic>(this, f);
+  List mappedBy(f(Node element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Node> where(bool f(Node element)) => new WhereIterable<Node>(this, f);
+  Iterable<Node> where(bool f(Node element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Node element)) => Collections.every(this, f);
+  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Node element)) => Collections.any(this, f);
+  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);
 
   List<Node> toList() => new List<Node>.from(this);
   Set<Node> toSet() => new Set<Node>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Node> take(int n) => new ListView<Node>(this, 0, n);
+  List<Node> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Node> takeWhile(bool test(Node value)) {
-    return new TakeWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Node> skip(int n) => new ListView<Node>(this, n, null);
+  List<Node> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Node> skipWhile(bool test(Node value)) {
-    return new SkipWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Node firstMatching(bool test(Node value), { Node orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Node lastMatching(bool test(Node value), {Node orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Node singleMatching(bool test(Node value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Node elementAt(int index) {
@@ -17684,16 +17436,36 @@
     throw new StateError("More than one element");
   }
 
-  Node min([int compare(Node a, Node b)]) => Collections.min(this, compare);
+  Node min([int compare(Node a, Node b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Node max([int compare(Node a, Node b)]) => Collections.max(this, compare);
+  Node max([int compare(Node a, Node b)]) => IterableMixinWorkaround.max(this, compare);
 
   Node removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Node removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Node element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Node element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
@@ -17713,32 +17485,32 @@
 
   // -- end List<Node> mixins.
 
-
-  /** @domName NamedNodeMap.getNamedItem */
+  @DocsEditable
+  @DomName('NamedNodeMap.getNamedItem')
   Node getNamedItem(String name) native "NamedNodeMap_getNamedItem_Callback";
 
-
-  /** @domName NamedNodeMap.getNamedItemNS */
+  @DocsEditable
+  @DomName('NamedNodeMap.getNamedItemNS')
   Node getNamedItemNS(String namespaceURI, String localName) native "NamedNodeMap_getNamedItemNS_Callback";
 
-
-  /** @domName NamedNodeMap.item */
+  @DocsEditable
+  @DomName('NamedNodeMap.item')
   Node item(int index) native "NamedNodeMap_item_Callback";
 
-
-  /** @domName NamedNodeMap.removeNamedItem */
+  @DocsEditable
+  @DomName('NamedNodeMap.removeNamedItem')
   Node removeNamedItem(String name) native "NamedNodeMap_removeNamedItem_Callback";
 
-
-  /** @domName NamedNodeMap.removeNamedItemNS */
+  @DocsEditable
+  @DomName('NamedNodeMap.removeNamedItemNS')
   Node removeNamedItemNS(String namespaceURI, String localName) native "NamedNodeMap_removeNamedItemNS_Callback";
 
-
-  /** @domName NamedNodeMap.setNamedItem */
+  @DocsEditable
+  @DomName('NamedNodeMap.setNamedItem')
   Node setNamedItem(Node node) native "NamedNodeMap_setNamedItem_Callback";
 
-
-  /** @domName NamedNodeMap.setNamedItemNS */
+  @DocsEditable
+  @DomName('NamedNodeMap.setNamedItemNS')
   Node setNamedItemNS(Node node) native "NamedNodeMap_setNamedItemNS_Callback";
 
 }
@@ -17746,92 +17518,132 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
 
-
-/// @domName Navigator
+@DocsEditable
+@DomName('Navigator')
 class Navigator extends NativeFieldWrapperClass1 {
+
+
+  /**
+   * Gets a stream (video and or audio) from the local computer.
+   *
+   * Use [MediaStream.supported] to check if this is supported by the current
+   * platform.
+   *
+   * Example use:
+   *
+   *     window.navigator.getUserMedia(audio:true, video: true).then((stream) {
+   *       var video = new VideoElement()
+   *         ..autoplay = true
+   *         ..src = Url.createObjectUrl(stream);
+   *       document.body.append(video);
+   *     });
+   *
+   * See also:
+   * * [MediaStream.supported]
+   */
+  @DomName('Navigator.webkitGetUserMedia')
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @Experimental()
+  Future<LocalMediaStream> getUserMedia({bool audio: false,
+      bool video: false}) {
+    var completer = new Completer<LocalMediaStream>();
+    var options = {
+      'audio': audio,
+      'video': video
+    };
+    this._getUserMedia(options,
+      (stream) {
+        completer.complete(stream);
+      },
+      (error) {
+        completer.completeError(error);
+      });
+    return completer.future;
+  }
+
+
   Navigator.internal();
 
-
-  /** @domName Navigator.appCodeName */
+  @DocsEditable
+  @DomName('Navigator.appCodeName')
   String get appCodeName native "Navigator_appCodeName_Getter";
 
-
-  /** @domName Navigator.appName */
+  @DocsEditable
+  @DomName('Navigator.appName')
   String get appName native "Navigator_appName_Getter";
 
-
-  /** @domName Navigator.appVersion */
+  @DocsEditable
+  @DomName('Navigator.appVersion')
   String get appVersion native "Navigator_appVersion_Getter";
 
-
-  /** @domName Navigator.cookieEnabled */
+  @DocsEditable
+  @DomName('Navigator.cookieEnabled')
   bool get cookieEnabled native "Navigator_cookieEnabled_Getter";
 
-
-  /** @domName Navigator.geolocation */
+  @DocsEditable
+  @DomName('Navigator.geolocation')
   Geolocation get geolocation native "Navigator_geolocation_Getter";
 
-
-  /** @domName Navigator.language */
+  @DocsEditable
+  @DomName('Navigator.language')
   String get language native "Navigator_language_Getter";
 
-
-  /** @domName Navigator.mimeTypes */
+  @DocsEditable
+  @DomName('Navigator.mimeTypes')
   DomMimeTypeArray get mimeTypes native "Navigator_mimeTypes_Getter";
 
-
-  /** @domName Navigator.onLine */
+  @DocsEditable
+  @DomName('Navigator.onLine')
   bool get onLine native "Navigator_onLine_Getter";
 
-
-  /** @domName Navigator.platform */
+  @DocsEditable
+  @DomName('Navigator.platform')
   String get platform native "Navigator_platform_Getter";
 
-
-  /** @domName Navigator.plugins */
+  @DocsEditable
+  @DomName('Navigator.plugins')
   DomPluginArray get plugins native "Navigator_plugins_Getter";
 
-
-  /** @domName Navigator.product */
+  @DocsEditable
+  @DomName('Navigator.product')
   String get product native "Navigator_product_Getter";
 
-
-  /** @domName Navigator.productSub */
+  @DocsEditable
+  @DomName('Navigator.productSub')
   String get productSub native "Navigator_productSub_Getter";
 
-
-  /** @domName Navigator.userAgent */
+  @DocsEditable
+  @DomName('Navigator.userAgent')
   String get userAgent native "Navigator_userAgent_Getter";
 
-
-  /** @domName Navigator.vendor */
+  @DocsEditable
+  @DomName('Navigator.vendor')
   String get vendor native "Navigator_vendor_Getter";
 
-
-  /** @domName Navigator.vendorSub */
+  @DocsEditable
+  @DomName('Navigator.vendorSub')
   String get vendorSub native "Navigator_vendorSub_Getter";
 
-
-  /** @domName Navigator.webkitBattery */
+  @DocsEditable
+  @DomName('Navigator.webkitBattery')
   BatteryManager get webkitBattery native "Navigator_webkitBattery_Getter";
 
-
-  /** @domName Navigator.getStorageUpdates */
+  @DocsEditable
+  @DomName('Navigator.getStorageUpdates')
   void getStorageUpdates() native "Navigator_getStorageUpdates_Callback";
 
-
-  /** @domName Navigator.javaEnabled */
+  @DocsEditable
+  @DomName('Navigator.javaEnabled')
   bool javaEnabled() native "Navigator_javaEnabled_Callback";
 
-
-  /** @domName Navigator.webkitGetGamepads */
+  @DocsEditable
+  @DomName('Navigator.webkitGetGamepads')
   List<Gamepad> webkitGetGamepads() native "Navigator_webkitGetGamepads_Callback";
 
-
-  /** @domName Navigator.webkitGetUserMedia */
-  void webkitGetUserMedia(Map options, NavigatorUserMediaSuccessCallback successCallback, [NavigatorUserMediaErrorCallback errorCallback]) native "Navigator_webkitGetUserMedia_Callback";
+  @DocsEditable
+  @DomName('Navigator.webkitGetUserMedia')
+  void _getUserMedia(Map options, _NavigatorUserMediaSuccessCallback successCallback, [_NavigatorUserMediaErrorCallback errorCallback]) native "Navigator_webkitGetUserMedia_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17841,14 +17653,15 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName NavigatorUserMediaError
+@DocsEditable
+@DomName('NavigatorUserMediaError')
 class NavigatorUserMediaError extends NativeFieldWrapperClass1 {
   NavigatorUserMediaError.internal();
 
   static const int PERMISSION_DENIED = 1;
 
-
-  /** @domName NavigatorUserMediaError.code */
+  @DocsEditable
+  @DomName('NavigatorUserMediaError.code')
   int get code native "NavigatorUserMediaError_code_Getter";
 
 }
@@ -17859,7 +17672,7 @@
 // WARNING: Do not edit - generated code.
 
 
-typedef void NavigatorUserMediaErrorCallback(NavigatorUserMediaError error);
+typedef void _NavigatorUserMediaErrorCallback(NavigatorUserMediaError error);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -17867,7 +17680,7 @@
 // WARNING: Do not edit - generated code.
 
 
-typedef void NavigatorUserMediaSuccessCallback(LocalMediaStream stream);
+typedef void _NavigatorUserMediaSuccessCallback(LocalMediaStream stream);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -17902,11 +17715,11 @@
   }
 
   Node min([int compare(Node a, Node b)]) {
-    return Collections.min(this, compare);
+    return IterableMixinWorkaround.min(this, compare);
   }
 
   Node max([int compare(Node a, Node b)]) {
-    return Collections.max(this, compare);
+    return IterableMixinWorkaround.max(this, compare);
   }
 
   void add(Node value) {
@@ -17940,6 +17753,29 @@
     return result;
   }
 
+  void remove(Object object) {
+    if (object is! Node) return;
+    Node node = object;
+    if (!identical(this, node.parentNode)) return;
+    _this.$dom_removeChild(node);
+  }
+
+  void removeAll(Iterable elements) {
+    IterableMixinWorkaround.removeAll(this, elements);
+  }
+
+  void retainAll(Iterable elements) {
+    IterableMixinWorkaround.retainAll(this, elements);
+  }
+
+  void removeMatching(bool test(Node node)) {
+    IterableMixinWorkaround.removeMatching(this, test);
+  }
+
+  void retainMatching(bool test(Node node)) {
+    IterableMixinWorkaround.retainMatching(this, test);
+  }
+
   void clear() {
     _this.text = '';
   }
@@ -17952,28 +17788,30 @@
 
   // TODO(jacobr): We can implement these methods much more efficiently by
   // looking up the nodeList only once instead of once per iteration.
-  bool contains(Node element) => Collections.contains(this, element);
+  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Node element)) => Collections.forEach(this, f);
+  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
   dynamic reduce(dynamic initialValue,
       dynamic combine(dynamic previousValue, Node element)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
   String join([String separator]) {
-    return Collections.joinList(this, separator);
+    return IterableMixinWorkaround.joinList(this, separator);
   }
 
-  List mappedBy(f(Node element)) =>
-      new MappedList<Node, dynamic>(this, f);
+  List mappedBy(f(Node element)) {
+    return IterableMixinWorkaround.mappedByList(this, f);
+  }
 
-  Iterable<Node> where(bool f(Node element)) =>
-     new WhereIterable<Node>(this, f);
+  Iterable<Node> where(bool f(Node element)) {
+    return IterableMixinWorkaround.where(this, f);
+  }
 
-  bool every(bool f(Node element)) => Collections.every(this, f);
+  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Node element)) => Collections.any(this, f);
+  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);
 
   List<Node> toList() => new List<Node>.from(this);
   Set<Node> toSet() => new Set<Node>.from(this);
@@ -17983,31 +17821,31 @@
   // From List<Node>:
 
   List<Node> take(int n) {
-    return new ListView<Node>(this, 0, n);
+    return IterableMixinWorkaround.takeList(this, n);
   }
 
   Iterable<Node> takeWhile(bool test(Node value)) {
-    return new TakeWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
   List<Node> skip(int n) {
-    return new ListView<Node>(this, n, null);
+    return IterableMixinWorkaround.skipList(this, n);
   }
 
   Iterable<Node> skipWhile(bool test(Node value)) {
-    return new SkipWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Node firstMatching(bool test(Node value), {Node orElse()}) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Node lastMatching(bool test(Node value), {Node orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Node singleMatching(bool test(Node value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Node elementAt(int index) {
@@ -18056,7 +17894,8 @@
   Node operator[](int index) => _this.$dom_childNodes[index];
 }
 
-/// @domName Node
+@DocsEditable
+@DomName('Node')
 class Node extends EventTarget {
   List<Node> get nodes {
     return new _ChildNodeListLazy(this);
@@ -18074,8 +17913,8 @@
 
   /**
    * Removes this node from the DOM.
-   * @domName Node.removeChild
    */
+  @DomName('Node.removeChild')
   void remove() {
     // TODO(jacobr): should we throw an exception if parent is already null?
     // TODO(vsm): Use the native remove when available.
@@ -18087,8 +17926,8 @@
 
   /**
    * Replaces this node with another node.
-   * @domName Node.replaceChild
    */
+  @DomName('Node.replaceChild')
   Node replaceWith(Node otherNode) {
     try {
       final Node parent = this.parentNode;
@@ -18101,136 +17940,104 @@
 
   Node.internal() : super.internal();
 
-  static const int ATTRIBUTE_NODE = 2;
-
-  static const int CDATA_SECTION_NODE = 4;
-
-  static const int COMMENT_NODE = 8;
-
-  static const int DOCUMENT_FRAGMENT_NODE = 11;
-
-  static const int DOCUMENT_NODE = 9;
-
-  static const int DOCUMENT_POSITION_CONTAINED_BY = 0x10;
-
-  static const int DOCUMENT_POSITION_CONTAINS = 0x08;
-
-  static const int DOCUMENT_POSITION_DISCONNECTED = 0x01;
-
-  static const int DOCUMENT_POSITION_FOLLOWING = 0x04;
-
-  static const int DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
-
-  static const int DOCUMENT_POSITION_PRECEDING = 0x02;
-
-  static const int DOCUMENT_TYPE_NODE = 10;
-
-  static const int ELEMENT_NODE = 1;
-
-  static const int ENTITY_NODE = 6;
-
-  static const int ENTITY_REFERENCE_NODE = 5;
-
-  static const int NOTATION_NODE = 12;
-
-  static const int PROCESSING_INSTRUCTION_NODE = 7;
-
-  static const int TEXT_NODE = 3;
-
-
-  /** @domName Node.attributes */
+  @DocsEditable
+  @DomName('Node.attributes')
   NamedNodeMap get $dom_attributes native "Node_attributes_Getter";
 
-
-  /** @domName Node.childNodes */
+  @DocsEditable
+  @DomName('Node.childNodes')
   List<Node> get $dom_childNodes native "Node_childNodes_Getter";
 
-
-  /** @domName Node.firstChild */
+  @DocsEditable
+  @DomName('Node.firstChild')
   Node get $dom_firstChild native "Node_firstChild_Getter";
 
-
-  /** @domName Node.lastChild */
+  @DocsEditable
+  @DomName('Node.lastChild')
   Node get $dom_lastChild native "Node_lastChild_Getter";
 
-
-  /** @domName Node.localName */
+  @DocsEditable
+  @DomName('Node.localName')
   String get $dom_localName native "Node_localName_Getter";
 
-
-  /** @domName Node.namespaceURI */
+  @DocsEditable
+  @DomName('Node.namespaceURI')
   String get $dom_namespaceUri native "Node_namespaceURI_Getter";
 
-
-  /** @domName Node.nextSibling */
+  @DocsEditable
+  @DomName('Node.nextSibling')
   Node get nextNode native "Node_nextSibling_Getter";
 
-
-  /** @domName Node.nodeType */
+  @DocsEditable
+  @DomName('Node.nodeType')
   int get nodeType native "Node_nodeType_Getter";
 
+  @DocsEditable
+  @DomName('Node.nodeValue')
+  String get nodeValue native "Node_nodeValue_Getter";
 
-  /** @domName Node.ownerDocument */
+  @DocsEditable
+  @DomName('Node.ownerDocument')
   Document get document native "Node_ownerDocument_Getter";
 
-
-  /** @domName Node.parentElement */
+  @DocsEditable
+  @DomName('Node.parentElement')
   Element get parent native "Node_parentElement_Getter";
 
-
-  /** @domName Node.parentNode */
+  @DocsEditable
+  @DomName('Node.parentNode')
   Node get parentNode native "Node_parentNode_Getter";
 
-
-  /** @domName Node.previousSibling */
+  @DocsEditable
+  @DomName('Node.previousSibling')
   Node get previousNode native "Node_previousSibling_Getter";
 
-
-  /** @domName Node.textContent */
+  @DocsEditable
+  @DomName('Node.textContent')
   String get text native "Node_textContent_Getter";
 
-
-  /** @domName Node.textContent */
+  @DocsEditable
+  @DomName('Node.textContent')
   void set text(String value) native "Node_textContent_Setter";
 
-
-  /** @domName Node.addEventListener */
+  @DocsEditable
+  @DomName('Node.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Node_addEventListener_Callback";
 
-
-  /** @domName Node.appendChild */
+  @DocsEditable
+  @DomName('Node.appendChild')
   Node $dom_appendChild(Node newChild) native "Node_appendChild_Callback";
 
-
-  /** @domName Node.cloneNode */
+  @DocsEditable
+  @DomName('Node.cloneNode')
   Node clone(bool deep) native "Node_cloneNode_Callback";
 
-
-  /** @domName Node.contains */
+  @DocsEditable
+  @DomName('Node.contains')
   bool contains(Node other) native "Node_contains_Callback";
 
-
-  /** @domName Node.dispatchEvent */
+  @DocsEditable
+  @DomName('Node.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native "Node_dispatchEvent_Callback";
 
-
-  /** @domName Node.hasChildNodes */
+  @DocsEditable
+  @DomName('Node.hasChildNodes')
   bool hasChildNodes() native "Node_hasChildNodes_Callback";
 
-
-  /** @domName Node.insertBefore */
+  @DocsEditable
+  @DomName('Node.insertBefore')
   Node insertBefore(Node newChild, Node refChild) native "Node_insertBefore_Callback";
 
-
-  /** @domName Node.removeChild */
+  @DocsEditable
+  @DomName('Node.removeChild')
   Node $dom_removeChild(Node oldChild) native "Node_removeChild_Callback";
 
-
-  /** @domName Node.removeEventListener */
+  @DocsEditable
+  @DomName('Node.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Node_removeEventListener_Callback";
 
-
-  /** @domName Node.replaceChild */
+  @DocsEditable
+  @DomName('Node.replaceChild')
   Node $dom_replaceChild(Node newChild, Node oldChild) native "Node_replaceChild_Callback";
 
 }
@@ -18241,7 +18048,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName NodeFilter
+@DocsEditable
+@DomName('NodeFilter')
 class NodeFilter extends NativeFieldWrapperClass1 {
   NodeFilter.internal();
 
@@ -18277,8 +18085,8 @@
 
   static const int SHOW_TEXT = 0x00000004;
 
-
-  /** @domName NodeFilter.acceptNode */
+  @DocsEditable
+  @DomName('NodeFilter.acceptNode')
   int acceptNode(Node n) native "NodeFilter_acceptNode_Callback";
 
 }
@@ -18289,44 +18097,45 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName NodeIterator
+@DocsEditable
+@DomName('NodeIterator')
 class NodeIterator extends NativeFieldWrapperClass1 {
   NodeIterator.internal();
 
-
-  /** @domName NodeIterator.expandEntityReferences */
+  @DocsEditable
+  @DomName('NodeIterator.expandEntityReferences')
   bool get expandEntityReferences native "NodeIterator_expandEntityReferences_Getter";
 
-
-  /** @domName NodeIterator.filter */
+  @DocsEditable
+  @DomName('NodeIterator.filter')
   NodeFilter get filter native "NodeIterator_filter_Getter";
 
-
-  /** @domName NodeIterator.pointerBeforeReferenceNode */
+  @DocsEditable
+  @DomName('NodeIterator.pointerBeforeReferenceNode')
   bool get pointerBeforeReferenceNode native "NodeIterator_pointerBeforeReferenceNode_Getter";
 
-
-  /** @domName NodeIterator.referenceNode */
+  @DocsEditable
+  @DomName('NodeIterator.referenceNode')
   Node get referenceNode native "NodeIterator_referenceNode_Getter";
 
-
-  /** @domName NodeIterator.root */
+  @DocsEditable
+  @DomName('NodeIterator.root')
   Node get root native "NodeIterator_root_Getter";
 
-
-  /** @domName NodeIterator.whatToShow */
+  @DocsEditable
+  @DomName('NodeIterator.whatToShow')
   int get whatToShow native "NodeIterator_whatToShow_Getter";
 
-
-  /** @domName NodeIterator.detach */
+  @DocsEditable
+  @DomName('NodeIterator.detach')
   void detach() native "NodeIterator_detach_Callback";
 
-
-  /** @domName NodeIterator.nextNode */
+  @DocsEditable
+  @DomName('NodeIterator.nextNode')
   Node nextNode() native "NodeIterator_nextNode_Callback";
 
-
-  /** @domName NodeIterator.previousNode */
+  @DocsEditable
+  @DomName('NodeIterator.previousNode')
   Node previousNode() native "NodeIterator_previousNode_Callback";
 
 }
@@ -18337,12 +18146,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName NodeList
+@DocsEditable
+@DomName('NodeList')
 class NodeList extends NativeFieldWrapperClass1 implements List<Node> {
   NodeList.internal();
 
-
-  /** @domName NodeList.length */
+  @DocsEditable
+  @DomName('NodeList.length')
   int get length native "NodeList_length_Getter";
 
   Node operator[](int index) native "NodeList_item_Callback";
@@ -18363,50 +18173,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Node element) => Collections.contains(this, element);
+  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Node element)) => Collections.forEach(this, f);
+  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Node element)) => new MappedList<Node, dynamic>(this, f);
+  List mappedBy(f(Node element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Node> where(bool f(Node element)) => new WhereIterable<Node>(this, f);
+  Iterable<Node> where(bool f(Node element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Node element)) => Collections.every(this, f);
+  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Node element)) => Collections.any(this, f);
+  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);
 
   List<Node> toList() => new List<Node>.from(this);
   Set<Node> toSet() => new Set<Node>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Node> take(int n) => new ListView<Node>(this, 0, n);
+  List<Node> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Node> takeWhile(bool test(Node value)) {
-    return new TakeWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Node> skip(int n) => new ListView<Node>(this, n, null);
+  List<Node> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Node> skipWhile(bool test(Node value)) {
-    return new SkipWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Node firstMatching(bool test(Node value), { Node orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Node lastMatching(bool test(Node value), {Node orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Node singleMatching(bool test(Node value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Node elementAt(int index) {
@@ -18464,16 +18274,36 @@
     throw new StateError("More than one element");
   }
 
-  Node min([int compare(Node a, Node b)]) => Collections.min(this, compare);
+  Node min([int compare(Node a, Node b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Node max([int compare(Node a, Node b)]) => Collections.max(this, compare);
+  Node max([int compare(Node a, Node b)]) => IterableMixinWorkaround.max(this, compare);
 
   Node removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Node removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Node element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Node element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
@@ -18493,8 +18323,8 @@
 
   // -- end List<Node> mixins.
 
-
-  /** @domName NodeList.item */
+  @DocsEditable
+  @DomName('NodeList.item')
   Node _item(int index) native "NodeList_item_Callback";
 
 }
@@ -18505,16 +18335,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Notation
+@DocsEditable
+@DomName('Notation')
 class Notation extends Node {
   Notation.internal() : super.internal();
 
-
-  /** @domName Notation.publicId */
+  @DocsEditable
+  @DomName('Notation.publicId')
   String get publicId native "Notation_publicId_Getter";
 
-
-  /** @domName Notation.systemId */
+  @DocsEditable
+  @DomName('Notation.systemId')
   String get systemId native "Notation_systemId_Getter";
 
 }
@@ -18525,7 +18356,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Notification
+@DocsEditable
+@DomName('Notification')
 class Notification extends EventTarget {
   Notification.internal() : super.internal();
 
@@ -18539,7 +18371,7 @@
 
   static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');
 
-  ///@docsEditable true
+  @DocsEditable
   factory Notification(String title, [Map options]) {
     if (!?options) {
       return Notification._create(title);
@@ -18548,64 +18380,65 @@
   }
   static Notification _create(String title, [Map options]) native "Notification_constructor_Callback";
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   NotificationEvents get on =>
     new NotificationEvents(this);
 
-
-  /** @domName Notification.dir */
+  @DocsEditable
+  @DomName('Notification.dir')
   String get dir native "Notification_dir_Getter";
 
-
-  /** @domName Notification.dir */
+  @DocsEditable
+  @DomName('Notification.dir')
   void set dir(String value) native "Notification_dir_Setter";
 
-
-  /** @domName Notification.permission */
+  @DocsEditable
+  @DomName('Notification.permission')
   String get permission native "Notification_permission_Getter";
 
-
-  /** @domName Notification.replaceId */
+  @DocsEditable
+  @DomName('Notification.replaceId')
   String get replaceId native "Notification_replaceId_Getter";
 
-
-  /** @domName Notification.replaceId */
+  @DocsEditable
+  @DomName('Notification.replaceId')
   void set replaceId(String value) native "Notification_replaceId_Setter";
 
-
-  /** @domName Notification.tag */
+  @DocsEditable
+  @DomName('Notification.tag')
   String get tag native "Notification_tag_Getter";
 
-
-  /** @domName Notification.tag */
+  @DocsEditable
+  @DomName('Notification.tag')
   void set tag(String value) native "Notification_tag_Setter";
 
-
-  /** @domName Notification.addEventListener */
+  @DocsEditable
+  @DomName('Notification.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_addEventListener_Callback";
 
-
-  /** @domName Notification.cancel */
+  @DocsEditable
+  @DomName('Notification.cancel')
   void cancel() native "Notification_cancel_Callback";
 
-
-  /** @domName Notification.close */
+  @DocsEditable
+  @DomName('Notification.close')
   void close() native "Notification_close_Callback";
 
-
-  /** @domName Notification.dispatchEvent */
+  @DocsEditable
+  @DomName('Notification.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "Notification_dispatchEvent_Callback";
 
-
-  /** @domName Notification.removeEventListener */
+  @DocsEditable
+  @DomName('Notification.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_removeEventListener_Callback";
 
-
-  /** @domName Notification.requestPermission */
+  @DocsEditable
+  @DomName('Notification.requestPermission')
   static void requestPermission(NotificationPermissionCallback callback) native "Notification_requestPermission_Callback";
 
-
-  /** @domName Notification.show */
+  @DocsEditable
+  @DomName('Notification.show')
   void show() native "Notification_show_Callback";
 
   Stream<Event> get onClick => clickEvent.forTarget(this);
@@ -18620,24 +18453,24 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class NotificationEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   NotificationEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get click => this['click'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get close => this['close'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get display => this['display'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get show => this['show'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18647,24 +18480,31 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName NotificationCenter
+@DocsEditable
+@DomName('NotificationCenter')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.SAFARI)
+@Experimental()
 class NotificationCenter extends NativeFieldWrapperClass1 {
   NotificationCenter.internal();
 
+  /// Checks if this type is supported on the current platform.
+  static bool get supported => true;
 
-  /** @domName NotificationCenter.checkPermission */
+  @DocsEditable
+  @DomName('NotificationCenter.checkPermission')
   int checkPermission() native "NotificationCenter_checkPermission_Callback";
 
-
-  /** @domName NotificationCenter.createHTMLNotification */
+  @DocsEditable
+  @DomName('NotificationCenter.createHTMLNotification')
   Notification createHtmlNotification(String url) native "NotificationCenter_createHTMLNotification_Callback";
 
-
-  /** @domName NotificationCenter.createNotification */
+  @DocsEditable
+  @DomName('NotificationCenter.createNotification')
   Notification createNotification(String iconUrl, String title, String body) native "NotificationCenter_createNotification_Callback";
 
-
-  /** @domName NotificationCenter.requestPermission */
+  @DocsEditable
+  @DomName('NotificationCenter.requestPermission')
   void requestPermission(VoidCallback callback) native "NotificationCenter_requestPermission_Callback";
 
 }
@@ -18683,35 +18523,36 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLOListElement
+@DocsEditable
+@DomName('HTMLOListElement')
 class OListElement extends _Element_Merged {
   OListElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory OListElement() => document.$dom_createElement("ol");
 
-
-  /** @domName HTMLOListElement.reversed */
+  @DocsEditable
+  @DomName('HTMLOListElement.reversed')
   bool get reversed native "HTMLOListElement_reversed_Getter";
 
-
-  /** @domName HTMLOListElement.reversed */
+  @DocsEditable
+  @DomName('HTMLOListElement.reversed')
   void set reversed(bool value) native "HTMLOListElement_reversed_Setter";
 
-
-  /** @domName HTMLOListElement.start */
+  @DocsEditable
+  @DomName('HTMLOListElement.start')
   int get start native "HTMLOListElement_start_Getter";
 
-
-  /** @domName HTMLOListElement.start */
+  @DocsEditable
+  @DomName('HTMLOListElement.start')
   void set start(int value) native "HTMLOListElement_start_Setter";
 
-
-  /** @domName HTMLOListElement.type */
+  @DocsEditable
+  @DomName('HTMLOListElement.type')
   String get type native "HTMLOListElement_type_Getter";
 
-
-  /** @domName HTMLOListElement.type */
+  @DocsEditable
+  @DomName('HTMLOListElement.type')
   void set type(String value) native "HTMLOListElement_type_Setter";
 
 }
@@ -18722,97 +18563,98 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLObjectElement
+@DocsEditable
+@DomName('HTMLObjectElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 class ObjectElement extends _Element_Merged {
   ObjectElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory ObjectElement() => document.$dom_createElement("object");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-
-  /** @domName HTMLObjectElement.code */
+  @DocsEditable
+  @DomName('HTMLObjectElement.code')
   String get code native "HTMLObjectElement_code_Getter";
 
-
-  /** @domName HTMLObjectElement.code */
+  @DocsEditable
+  @DomName('HTMLObjectElement.code')
   void set code(String value) native "HTMLObjectElement_code_Setter";
 
-
-  /** @domName HTMLObjectElement.data */
+  @DocsEditable
+  @DomName('HTMLObjectElement.data')
   String get data native "HTMLObjectElement_data_Getter";
 
-
-  /** @domName HTMLObjectElement.data */
+  @DocsEditable
+  @DomName('HTMLObjectElement.data')
   void set data(String value) native "HTMLObjectElement_data_Setter";
 
-
-  /** @domName HTMLObjectElement.form */
+  @DocsEditable
+  @DomName('HTMLObjectElement.form')
   FormElement get form native "HTMLObjectElement_form_Getter";
 
-
-  /** @domName HTMLObjectElement.height */
+  @DocsEditable
+  @DomName('HTMLObjectElement.height')
   String get height native "HTMLObjectElement_height_Getter";
 
-
-  /** @domName HTMLObjectElement.height */
+  @DocsEditable
+  @DomName('HTMLObjectElement.height')
   void set height(String value) native "HTMLObjectElement_height_Setter";
 
-
-  /** @domName HTMLObjectElement.name */
+  @DocsEditable
+  @DomName('HTMLObjectElement.name')
   String get name native "HTMLObjectElement_name_Getter";
 
-
-  /** @domName HTMLObjectElement.name */
+  @DocsEditable
+  @DomName('HTMLObjectElement.name')
   void set name(String value) native "HTMLObjectElement_name_Setter";
 
-
-  /** @domName HTMLObjectElement.type */
+  @DocsEditable
+  @DomName('HTMLObjectElement.type')
   String get type native "HTMLObjectElement_type_Getter";
 
-
-  /** @domName HTMLObjectElement.type */
+  @DocsEditable
+  @DomName('HTMLObjectElement.type')
   void set type(String value) native "HTMLObjectElement_type_Setter";
 
-
-  /** @domName HTMLObjectElement.useMap */
+  @DocsEditable
+  @DomName('HTMLObjectElement.useMap')
   String get useMap native "HTMLObjectElement_useMap_Getter";
 
-
-  /** @domName HTMLObjectElement.useMap */
+  @DocsEditable
+  @DomName('HTMLObjectElement.useMap')
   void set useMap(String value) native "HTMLObjectElement_useMap_Setter";
 
-
-  /** @domName HTMLObjectElement.validationMessage */
+  @DocsEditable
+  @DomName('HTMLObjectElement.validationMessage')
   String get validationMessage native "HTMLObjectElement_validationMessage_Getter";
 
-
-  /** @domName HTMLObjectElement.validity */
+  @DocsEditable
+  @DomName('HTMLObjectElement.validity')
   ValidityState get validity native "HTMLObjectElement_validity_Getter";
 
-
-  /** @domName HTMLObjectElement.width */
+  @DocsEditable
+  @DomName('HTMLObjectElement.width')
   String get width native "HTMLObjectElement_width_Getter";
 
-
-  /** @domName HTMLObjectElement.width */
+  @DocsEditable
+  @DomName('HTMLObjectElement.width')
   void set width(String value) native "HTMLObjectElement_width_Setter";
 
-
-  /** @domName HTMLObjectElement.willValidate */
+  @DocsEditable
+  @DomName('HTMLObjectElement.willValidate')
   bool get willValidate native "HTMLObjectElement_willValidate_Getter";
 
-
-  /** @domName HTMLObjectElement.checkValidity */
+  @DocsEditable
+  @DomName('HTMLObjectElement.checkValidity')
   bool checkValidity() native "HTMLObjectElement_checkValidity_Callback";
 
-
-  /** @domName HTMLObjectElement.setCustomValidity */
+  @DocsEditable
+  @DomName('HTMLObjectElement.setCustomValidity')
   void setCustomValidity(String error) native "HTMLObjectElement_setCustomValidity_Callback";
 
 }
@@ -18823,7 +18665,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName OESElementIndexUint
+@DocsEditable
+@DomName('OESElementIndexUint')
 class OesElementIndexUint extends NativeFieldWrapperClass1 {
   OesElementIndexUint.internal();
 
@@ -18835,7 +18678,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName OESStandardDerivatives
+@DocsEditable
+@DomName('OESStandardDerivatives')
 class OesStandardDerivatives extends NativeFieldWrapperClass1 {
   OesStandardDerivatives.internal();
 
@@ -18849,7 +18693,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName OESTextureFloat
+@DocsEditable
+@DomName('OESTextureFloat')
 class OesTextureFloat extends NativeFieldWrapperClass1 {
   OesTextureFloat.internal();
 
@@ -18861,26 +18706,27 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName OESVertexArrayObject
+@DocsEditable
+@DomName('OESVertexArrayObject')
 class OesVertexArrayObject extends NativeFieldWrapperClass1 {
   OesVertexArrayObject.internal();
 
   static const int VERTEX_ARRAY_BINDING_OES = 0x85B5;
 
-
-  /** @domName OESVertexArrayObject.bindVertexArrayOES */
+  @DocsEditable
+  @DomName('OESVertexArrayObject.bindVertexArrayOES')
   void bindVertexArray(WebGLVertexArrayObject arrayObject) native "OESVertexArrayObject_bindVertexArrayOES_Callback";
 
-
-  /** @domName OESVertexArrayObject.createVertexArrayOES */
+  @DocsEditable
+  @DomName('OESVertexArrayObject.createVertexArrayOES')
   WebGLVertexArrayObject createVertexArray() native "OESVertexArrayObject_createVertexArrayOES_Callback";
 
-
-  /** @domName OESVertexArrayObject.deleteVertexArrayOES */
+  @DocsEditable
+  @DomName('OESVertexArrayObject.deleteVertexArrayOES')
   void deleteVertexArray(WebGLVertexArrayObject arrayObject) native "OESVertexArrayObject_deleteVertexArrayOES_Callback";
 
-
-  /** @domName OESVertexArrayObject.isVertexArrayOES */
+  @DocsEditable
+  @DomName('OESVertexArrayObject.isVertexArrayOES')
   bool isVertexArray(WebGLVertexArrayObject arrayObject) native "OESVertexArrayObject_isVertexArrayOES_Callback";
 
 }
@@ -18891,27 +18737,28 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLOptGroupElement
+@DocsEditable
+@DomName('HTMLOptGroupElement')
 class OptGroupElement extends _Element_Merged {
   OptGroupElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory OptGroupElement() => document.$dom_createElement("optgroup");
 
-
-  /** @domName HTMLOptGroupElement.disabled */
+  @DocsEditable
+  @DomName('HTMLOptGroupElement.disabled')
   bool get disabled native "HTMLOptGroupElement_disabled_Getter";
 
-
-  /** @domName HTMLOptGroupElement.disabled */
+  @DocsEditable
+  @DomName('HTMLOptGroupElement.disabled')
   void set disabled(bool value) native "HTMLOptGroupElement_disabled_Setter";
 
-
-  /** @domName HTMLOptGroupElement.label */
+  @DocsEditable
+  @DomName('HTMLOptGroupElement.label')
   String get label native "HTMLOptGroupElement_label_Getter";
 
-
-  /** @domName HTMLOptGroupElement.label */
+  @DocsEditable
+  @DomName('HTMLOptGroupElement.label')
   void set label(String value) native "HTMLOptGroupElement_label_Setter";
 
 }
@@ -18922,11 +18769,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLOptionElement
+@DocsEditable
+@DomName('HTMLOptionElement')
 class OptionElement extends _Element_Merged {
   OptionElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory OptionElement([String data, String value, bool defaultSelected, bool selected]) {
     if (!?data) {
       return OptionElement._create();
@@ -18944,52 +18792,52 @@
   }
   static OptionElement _create([String data, String value, bool defaultSelected, bool selected]) native "HTMLOptionElement_constructor_Callback";
 
-
-  /** @domName HTMLOptionElement.defaultSelected */
+  @DocsEditable
+  @DomName('HTMLOptionElement.defaultSelected')
   bool get defaultSelected native "HTMLOptionElement_defaultSelected_Getter";
 
-
-  /** @domName HTMLOptionElement.defaultSelected */
+  @DocsEditable
+  @DomName('HTMLOptionElement.defaultSelected')
   void set defaultSelected(bool value) native "HTMLOptionElement_defaultSelected_Setter";
 
-
-  /** @domName HTMLOptionElement.disabled */
+  @DocsEditable
+  @DomName('HTMLOptionElement.disabled')
   bool get disabled native "HTMLOptionElement_disabled_Getter";
 
-
-  /** @domName HTMLOptionElement.disabled */
+  @DocsEditable
+  @DomName('HTMLOptionElement.disabled')
   void set disabled(bool value) native "HTMLOptionElement_disabled_Setter";
 
-
-  /** @domName HTMLOptionElement.form */
+  @DocsEditable
+  @DomName('HTMLOptionElement.form')
   FormElement get form native "HTMLOptionElement_form_Getter";
 
-
-  /** @domName HTMLOptionElement.index */
+  @DocsEditable
+  @DomName('HTMLOptionElement.index')
   int get index native "HTMLOptionElement_index_Getter";
 
-
-  /** @domName HTMLOptionElement.label */
+  @DocsEditable
+  @DomName('HTMLOptionElement.label')
   String get label native "HTMLOptionElement_label_Getter";
 
-
-  /** @domName HTMLOptionElement.label */
+  @DocsEditable
+  @DomName('HTMLOptionElement.label')
   void set label(String value) native "HTMLOptionElement_label_Setter";
 
-
-  /** @domName HTMLOptionElement.selected */
+  @DocsEditable
+  @DomName('HTMLOptionElement.selected')
   bool get selected native "HTMLOptionElement_selected_Getter";
 
-
-  /** @domName HTMLOptionElement.selected */
+  @DocsEditable
+  @DomName('HTMLOptionElement.selected')
   void set selected(bool value) native "HTMLOptionElement_selected_Setter";
 
-
-  /** @domName HTMLOptionElement.value */
+  @DocsEditable
+  @DomName('HTMLOptionElement.value')
   String get value native "HTMLOptionElement_value_Getter";
 
-
-  /** @domName HTMLOptionElement.value */
+  @DocsEditable
+  @DomName('HTMLOptionElement.value')
   void set value(String value) native "HTMLOptionElement_value_Setter";
 
 }
@@ -19000,81 +18848,82 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLOutputElement
+@DocsEditable
+@DomName('HTMLOutputElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 class OutputElement extends _Element_Merged {
   OutputElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory OutputElement() => document.$dom_createElement("output");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-
-  /** @domName HTMLOutputElement.defaultValue */
+  @DocsEditable
+  @DomName('HTMLOutputElement.defaultValue')
   String get defaultValue native "HTMLOutputElement_defaultValue_Getter";
 
-
-  /** @domName HTMLOutputElement.defaultValue */
+  @DocsEditable
+  @DomName('HTMLOutputElement.defaultValue')
   void set defaultValue(String value) native "HTMLOutputElement_defaultValue_Setter";
 
-
-  /** @domName HTMLOutputElement.form */
+  @DocsEditable
+  @DomName('HTMLOutputElement.form')
   FormElement get form native "HTMLOutputElement_form_Getter";
 
-
-  /** @domName HTMLOutputElement.htmlFor */
+  @DocsEditable
+  @DomName('HTMLOutputElement.htmlFor')
   DomSettableTokenList get htmlFor native "HTMLOutputElement_htmlFor_Getter";
 
-
-  /** @domName HTMLOutputElement.htmlFor */
+  @DocsEditable
+  @DomName('HTMLOutputElement.htmlFor')
   void set htmlFor(DomSettableTokenList value) native "HTMLOutputElement_htmlFor_Setter";
 
-
-  /** @domName HTMLOutputElement.labels */
+  @DocsEditable
+  @DomName('HTMLOutputElement.labels')
   List<Node> get labels native "HTMLOutputElement_labels_Getter";
 
-
-  /** @domName HTMLOutputElement.name */
+  @DocsEditable
+  @DomName('HTMLOutputElement.name')
   String get name native "HTMLOutputElement_name_Getter";
 
-
-  /** @domName HTMLOutputElement.name */
+  @DocsEditable
+  @DomName('HTMLOutputElement.name')
   void set name(String value) native "HTMLOutputElement_name_Setter";
 
-
-  /** @domName HTMLOutputElement.type */
+  @DocsEditable
+  @DomName('HTMLOutputElement.type')
   String get type native "HTMLOutputElement_type_Getter";
 
-
-  /** @domName HTMLOutputElement.validationMessage */
+  @DocsEditable
+  @DomName('HTMLOutputElement.validationMessage')
   String get validationMessage native "HTMLOutputElement_validationMessage_Getter";
 
-
-  /** @domName HTMLOutputElement.validity */
+  @DocsEditable
+  @DomName('HTMLOutputElement.validity')
   ValidityState get validity native "HTMLOutputElement_validity_Getter";
 
-
-  /** @domName HTMLOutputElement.value */
+  @DocsEditable
+  @DomName('HTMLOutputElement.value')
   String get value native "HTMLOutputElement_value_Getter";
 
-
-  /** @domName HTMLOutputElement.value */
+  @DocsEditable
+  @DomName('HTMLOutputElement.value')
   void set value(String value) native "HTMLOutputElement_value_Setter";
 
-
-  /** @domName HTMLOutputElement.willValidate */
+  @DocsEditable
+  @DomName('HTMLOutputElement.willValidate')
   bool get willValidate native "HTMLOutputElement_willValidate_Getter";
 
-
-  /** @domName HTMLOutputElement.checkValidity */
+  @DocsEditable
+  @DomName('HTMLOutputElement.checkValidity')
   bool checkValidity() native "HTMLOutputElement_checkValidity_Callback";
 
-
-  /** @domName HTMLOutputElement.setCustomValidity */
+  @DocsEditable
+  @DomName('HTMLOutputElement.setCustomValidity')
   void setCustomValidity(String error) native "HTMLOutputElement_setCustomValidity_Callback";
 
 }
@@ -19085,7 +18934,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName OverflowEvent
+@DocsEditable
+@DomName('OverflowEvent')
 class OverflowEvent extends Event {
   OverflowEvent.internal() : super.internal();
 
@@ -19095,16 +18945,16 @@
 
   static const int VERTICAL = 1;
 
-
-  /** @domName OverflowEvent.horizontalOverflow */
+  @DocsEditable
+  @DomName('OverflowEvent.horizontalOverflow')
   bool get horizontalOverflow native "OverflowEvent_horizontalOverflow_Getter";
 
-
-  /** @domName OverflowEvent.orient */
+  @DocsEditable
+  @DomName('OverflowEvent.orient')
   int get orient native "OverflowEvent_orient_Getter";
 
-
-  /** @domName OverflowEvent.verticalOverflow */
+  @DocsEditable
+  @DomName('OverflowEvent.verticalOverflow')
   bool get verticalOverflow native "OverflowEvent_verticalOverflow_Getter";
 
 }
@@ -19115,24 +18965,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName PagePopupController
+@DocsEditable
+@DomName('PagePopupController')
 class PagePopupController extends NativeFieldWrapperClass1 {
   PagePopupController.internal();
 
-
-  /** @domName PagePopupController.formatMonth */
+  @DocsEditable
+  @DomName('PagePopupController.formatMonth')
   String formatMonth(int year, int zeroBaseMonth) native "PagePopupController_formatMonth_Callback";
 
-
-  /** @domName PagePopupController.histogramEnumeration */
+  @DocsEditable
+  @DomName('PagePopupController.histogramEnumeration')
   void histogramEnumeration(String name, int sample, int boundaryValue) native "PagePopupController_histogramEnumeration_Callback";
 
-
-  /** @domName PagePopupController.localizeNumberString */
+  @DocsEditable
+  @DomName('PagePopupController.localizeNumberString')
   String localizeNumberString(String numberString) native "PagePopupController_localizeNumberString_Callback";
 
-
-  /** @domName PagePopupController.setValueAndClosePopup */
+  @DocsEditable
+  @DomName('PagePopupController.setValueAndClosePopup')
   void setValueAndClosePopup(int numberValue, String stringValue) native "PagePopupController_setValueAndClosePopup_Callback";
 
 }
@@ -19143,12 +18994,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName PageTransitionEvent
+@DocsEditable
+@DomName('PageTransitionEvent')
 class PageTransitionEvent extends Event {
   PageTransitionEvent.internal() : super.internal();
 
-
-  /** @domName PageTransitionEvent.persisted */
+  @DocsEditable
+  @DomName('PageTransitionEvent.persisted')
   bool get persisted native "PageTransitionEvent_persisted_Getter";
 
 }
@@ -19159,11 +19011,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLParagraphElement
+@DocsEditable
+@DomName('HTMLParagraphElement')
 class ParagraphElement extends _Element_Merged {
   ParagraphElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory ParagraphElement() => document.$dom_createElement("p");
 
 }
@@ -19174,27 +19027,28 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLParamElement
+@DocsEditable
+@DomName('HTMLParamElement')
 class ParamElement extends _Element_Merged {
   ParamElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory ParamElement() => document.$dom_createElement("param");
 
-
-  /** @domName HTMLParamElement.name */
+  @DocsEditable
+  @DomName('HTMLParamElement.name')
   String get name native "HTMLParamElement_name_Getter";
 
-
-  /** @domName HTMLParamElement.name */
+  @DocsEditable
+  @DomName('HTMLParamElement.name')
   void set name(String value) native "HTMLParamElement_name_Setter";
 
-
-  /** @domName HTMLParamElement.value */
+  @DocsEditable
+  @DomName('HTMLParamElement.value')
   String get value native "HTMLParamElement_value_Getter";
 
-
-  /** @domName HTMLParamElement.value */
+  @DocsEditable
+  @DomName('HTMLParamElement.value')
   void set value(String value) native "HTMLParamElement_value_Setter";
 
 }
@@ -19205,7 +19059,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Performance
+@DocsEditable
+@DomName('Performance')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE)
@@ -19215,20 +19070,20 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-
-  /** @domName Performance.memory */
+  @DocsEditable
+  @DomName('Performance.memory')
   MemoryInfo get memory native "Performance_memory_Getter";
 
-
-  /** @domName Performance.navigation */
+  @DocsEditable
+  @DomName('Performance.navigation')
   PerformanceNavigation get navigation native "Performance_navigation_Getter";
 
-
-  /** @domName Performance.timing */
+  @DocsEditable
+  @DomName('Performance.timing')
   PerformanceTiming get timing native "Performance_timing_Getter";
 
-
-  /** @domName Performance.now */
+  @DocsEditable
+  @DomName('Performance.now')
   num now() native "Performance_now_Callback";
 
 }
@@ -19239,7 +19094,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName PerformanceNavigation
+@DocsEditable
+@DomName('PerformanceNavigation')
 class PerformanceNavigation extends NativeFieldWrapperClass1 {
   PerformanceNavigation.internal();
 
@@ -19251,12 +19107,12 @@
 
   static const int TYPE_RESERVED = 255;
 
-
-  /** @domName PerformanceNavigation.redirectCount */
+  @DocsEditable
+  @DomName('PerformanceNavigation.redirectCount')
   int get redirectCount native "PerformanceNavigation_redirectCount_Getter";
 
-
-  /** @domName PerformanceNavigation.type */
+  @DocsEditable
+  @DomName('PerformanceNavigation.type')
   int get type native "PerformanceNavigation_type_Getter";
 
 }
@@ -19267,92 +19123,93 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName PerformanceTiming
+@DocsEditable
+@DomName('PerformanceTiming')
 class PerformanceTiming extends NativeFieldWrapperClass1 {
   PerformanceTiming.internal();
 
-
-  /** @domName PerformanceTiming.connectEnd */
+  @DocsEditable
+  @DomName('PerformanceTiming.connectEnd')
   int get connectEnd native "PerformanceTiming_connectEnd_Getter";
 
-
-  /** @domName PerformanceTiming.connectStart */
+  @DocsEditable
+  @DomName('PerformanceTiming.connectStart')
   int get connectStart native "PerformanceTiming_connectStart_Getter";
 
-
-  /** @domName PerformanceTiming.domComplete */
+  @DocsEditable
+  @DomName('PerformanceTiming.domComplete')
   int get domComplete native "PerformanceTiming_domComplete_Getter";
 
-
-  /** @domName PerformanceTiming.domContentLoadedEventEnd */
+  @DocsEditable
+  @DomName('PerformanceTiming.domContentLoadedEventEnd')
   int get domContentLoadedEventEnd native "PerformanceTiming_domContentLoadedEventEnd_Getter";
 
-
-  /** @domName PerformanceTiming.domContentLoadedEventStart */
+  @DocsEditable
+  @DomName('PerformanceTiming.domContentLoadedEventStart')
   int get domContentLoadedEventStart native "PerformanceTiming_domContentLoadedEventStart_Getter";
 
-
-  /** @domName PerformanceTiming.domInteractive */
+  @DocsEditable
+  @DomName('PerformanceTiming.domInteractive')
   int get domInteractive native "PerformanceTiming_domInteractive_Getter";
 
-
-  /** @domName PerformanceTiming.domLoading */
+  @DocsEditable
+  @DomName('PerformanceTiming.domLoading')
   int get domLoading native "PerformanceTiming_domLoading_Getter";
 
-
-  /** @domName PerformanceTiming.domainLookupEnd */
+  @DocsEditable
+  @DomName('PerformanceTiming.domainLookupEnd')
   int get domainLookupEnd native "PerformanceTiming_domainLookupEnd_Getter";
 
-
-  /** @domName PerformanceTiming.domainLookupStart */
+  @DocsEditable
+  @DomName('PerformanceTiming.domainLookupStart')
   int get domainLookupStart native "PerformanceTiming_domainLookupStart_Getter";
 
-
-  /** @domName PerformanceTiming.fetchStart */
+  @DocsEditable
+  @DomName('PerformanceTiming.fetchStart')
   int get fetchStart native "PerformanceTiming_fetchStart_Getter";
 
-
-  /** @domName PerformanceTiming.loadEventEnd */
+  @DocsEditable
+  @DomName('PerformanceTiming.loadEventEnd')
   int get loadEventEnd native "PerformanceTiming_loadEventEnd_Getter";
 
-
-  /** @domName PerformanceTiming.loadEventStart */
+  @DocsEditable
+  @DomName('PerformanceTiming.loadEventStart')
   int get loadEventStart native "PerformanceTiming_loadEventStart_Getter";
 
-
-  /** @domName PerformanceTiming.navigationStart */
+  @DocsEditable
+  @DomName('PerformanceTiming.navigationStart')
   int get navigationStart native "PerformanceTiming_navigationStart_Getter";
 
-
-  /** @domName PerformanceTiming.redirectEnd */
+  @DocsEditable
+  @DomName('PerformanceTiming.redirectEnd')
   int get redirectEnd native "PerformanceTiming_redirectEnd_Getter";
 
-
-  /** @domName PerformanceTiming.redirectStart */
+  @DocsEditable
+  @DomName('PerformanceTiming.redirectStart')
   int get redirectStart native "PerformanceTiming_redirectStart_Getter";
 
-
-  /** @domName PerformanceTiming.requestStart */
+  @DocsEditable
+  @DomName('PerformanceTiming.requestStart')
   int get requestStart native "PerformanceTiming_requestStart_Getter";
 
-
-  /** @domName PerformanceTiming.responseEnd */
+  @DocsEditable
+  @DomName('PerformanceTiming.responseEnd')
   int get responseEnd native "PerformanceTiming_responseEnd_Getter";
 
-
-  /** @domName PerformanceTiming.responseStart */
+  @DocsEditable
+  @DomName('PerformanceTiming.responseStart')
   int get responseStart native "PerformanceTiming_responseStart_Getter";
 
-
-  /** @domName PerformanceTiming.secureConnectionStart */
+  @DocsEditable
+  @DomName('PerformanceTiming.secureConnectionStart')
   int get secureConnectionStart native "PerformanceTiming_secureConnectionStart_Getter";
 
-
-  /** @domName PerformanceTiming.unloadEventEnd */
+  @DocsEditable
+  @DomName('PerformanceTiming.unloadEventEnd')
   int get unloadEventEnd native "PerformanceTiming_unloadEventEnd_Getter";
 
-
-  /** @domName PerformanceTiming.unloadEventStart */
+  @DocsEditable
+  @DomName('PerformanceTiming.unloadEventStart')
   int get unloadEventStart native "PerformanceTiming_unloadEventStart_Getter";
 
 }
@@ -19363,28 +19220,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebKitPoint
+@DocsEditable
+@DomName('WebKitPoint')
 class Point extends NativeFieldWrapperClass1 {
   Point.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory Point(num x, num y) => Point._create(x, y);
   static Point _create(num x, num y) native "WebKitPoint_constructor_Callback";
 
-
-  /** @domName WebKitPoint.x */
+  @DocsEditable
+  @DomName('WebKitPoint.x')
   num get x native "WebKitPoint_x_Getter";
 
-
-  /** @domName WebKitPoint.x */
+  @DocsEditable
+  @DomName('WebKitPoint.x')
   void set x(num value) native "WebKitPoint_x_Setter";
 
-
-  /** @domName WebKitPoint.y */
+  @DocsEditable
+  @DomName('WebKitPoint.y')
   num get y native "WebKitPoint_y_Getter";
 
-
-  /** @domName WebKitPoint.y */
+  @DocsEditable
+  @DomName('WebKitPoint.y')
   void set y(num value) native "WebKitPoint_y_Setter";
 
 }
@@ -19395,12 +19253,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName PopStateEvent
+@DocsEditable
+@DomName('PopStateEvent')
 class PopStateEvent extends Event {
   PopStateEvent.internal() : super.internal();
 
-
-  /** @domName PopStateEvent.state */
+  @DocsEditable
+  @DomName('PopStateEvent.state')
   Object get state native "PopStateEvent_state_Getter";
 
 }
@@ -19419,7 +19278,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName PositionError
+@DocsEditable
+@DomName('PositionError')
 class PositionError extends NativeFieldWrapperClass1 {
   PositionError.internal();
 
@@ -19429,12 +19289,12 @@
 
   static const int TIMEOUT = 3;
 
-
-  /** @domName PositionError.code */
+  @DocsEditable
+  @DomName('PositionError.code')
   int get code native "PositionError_code_Getter";
 
-
-  /** @domName PositionError.message */
+  @DocsEditable
+  @DomName('PositionError.message')
   String get message native "PositionError_message_Getter";
 
 }
@@ -19453,19 +19313,20 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLPreElement
+@DocsEditable
+@DomName('HTMLPreElement')
 class PreElement extends _Element_Merged {
   PreElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory PreElement() => document.$dom_createElement("pre");
 
-
-  /** @domName HTMLPreElement.wrap */
+  @DocsEditable
+  @DomName('HTMLPreElement.wrap')
   bool get wrap native "HTMLPreElement_wrap_Getter";
 
-
-  /** @domName HTMLPreElement.wrap */
+  @DocsEditable
+  @DomName('HTMLPreElement.wrap')
   void set wrap(bool value) native "HTMLPreElement_wrap_Setter";
 
 }
@@ -19476,24 +19337,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ProcessingInstruction
+@DocsEditable
+@DomName('ProcessingInstruction')
 class ProcessingInstruction extends Node {
   ProcessingInstruction.internal() : super.internal();
 
-
-  /** @domName ProcessingInstruction.data */
+  @DocsEditable
+  @DomName('ProcessingInstruction.data')
   String get data native "ProcessingInstruction_data_Getter";
 
-
-  /** @domName ProcessingInstruction.data */
+  @DocsEditable
+  @DomName('ProcessingInstruction.data')
   void set data(String value) native "ProcessingInstruction_data_Setter";
 
-
-  /** @domName ProcessingInstruction.sheet */
+  @DocsEditable
+  @DomName('ProcessingInstruction.sheet')
   StyleSheet get sheet native "ProcessingInstruction_sheet_Getter";
 
-
-  /** @domName ProcessingInstruction.target */
+  @DocsEditable
+  @DomName('ProcessingInstruction.target')
   String get target native "ProcessingInstruction_target_Getter";
 
 }
@@ -19504,7 +19366,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLProgressElement
+@DocsEditable
+@DomName('HTMLProgressElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -19512,34 +19375,34 @@
 class ProgressElement extends _Element_Merged {
   ProgressElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory ProgressElement() => document.$dom_createElement("progress");
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-
-  /** @domName HTMLProgressElement.labels */
+  @DocsEditable
+  @DomName('HTMLProgressElement.labels')
   List<Node> get labels native "HTMLProgressElement_labels_Getter";
 
-
-  /** @domName HTMLProgressElement.max */
+  @DocsEditable
+  @DomName('HTMLProgressElement.max')
   num get max native "HTMLProgressElement_max_Getter";
 
-
-  /** @domName HTMLProgressElement.max */
+  @DocsEditable
+  @DomName('HTMLProgressElement.max')
   void set max(num value) native "HTMLProgressElement_max_Setter";
 
-
-  /** @domName HTMLProgressElement.position */
+  @DocsEditable
+  @DomName('HTMLProgressElement.position')
   num get position native "HTMLProgressElement_position_Getter";
 
-
-  /** @domName HTMLProgressElement.value */
+  @DocsEditable
+  @DomName('HTMLProgressElement.value')
   num get value native "HTMLProgressElement_value_Getter";
 
-
-  /** @domName HTMLProgressElement.value */
+  @DocsEditable
+  @DomName('HTMLProgressElement.value')
   void set value(num value) native "HTMLProgressElement_value_Setter";
 
 }
@@ -19550,20 +19413,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ProgressEvent
+@DocsEditable
+@DomName('ProgressEvent')
 class ProgressEvent extends Event {
   ProgressEvent.internal() : super.internal();
 
-
-  /** @domName ProgressEvent.lengthComputable */
+  @DocsEditable
+  @DomName('ProgressEvent.lengthComputable')
   bool get lengthComputable native "ProgressEvent_lengthComputable_Getter";
 
-
-  /** @domName ProgressEvent.loaded */
+  @DocsEditable
+  @DomName('ProgressEvent.loaded')
   int get loaded native "ProgressEvent_loaded_Getter";
 
-
-  /** @domName ProgressEvent.total */
+  @DocsEditable
+  @DomName('ProgressEvent.total')
   int get total native "ProgressEvent_total_Getter";
 
 }
@@ -19574,16 +19438,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLQuoteElement
+@DocsEditable
+@DomName('HTMLQuoteElement')
 class QuoteElement extends _Element_Merged {
   QuoteElement.internal() : super.internal();
 
-
-  /** @domName HTMLQuoteElement.cite */
+  @DocsEditable
+  @DomName('HTMLQuoteElement.cite')
   String get cite native "HTMLQuoteElement_cite_Getter";
 
-
-  /** @domName HTMLQuoteElement.cite */
+  @DocsEditable
+  @DomName('HTMLQuoteElement.cite')
   void set cite(String value) native "HTMLQuoteElement_cite_Setter";
 
 }
@@ -19618,16 +19483,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName RadioNodeList
+@DocsEditable
+@DomName('RadioNodeList')
 class RadioNodeList extends NodeList {
   RadioNodeList.internal() : super.internal();
 
-
-  /** @domName RadioNodeList.value */
+  @DocsEditable
+  @DomName('RadioNodeList.value')
   String get value native "RadioNodeList_value_Getter";
 
-
-  /** @domName RadioNodeList.value */
+  @DocsEditable
+  @DomName('RadioNodeList.value')
   void set value(String value) native "RadioNodeList_value_Setter";
 
 }
@@ -19638,7 +19504,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Range
+@DocsEditable
+@DomName('Range')
 class Range extends NativeFieldWrapperClass1 {
   factory Range() => document.$dom_createRange();
 
@@ -19660,128 +19527,128 @@
 
   static const int START_TO_START = 0;
 
-
-  /** @domName Range.collapsed */
+  @DocsEditable
+  @DomName('Range.collapsed')
   bool get collapsed native "Range_collapsed_Getter";
 
-
-  /** @domName Range.commonAncestorContainer */
+  @DocsEditable
+  @DomName('Range.commonAncestorContainer')
   Node get commonAncestorContainer native "Range_commonAncestorContainer_Getter";
 
-
-  /** @domName Range.endContainer */
+  @DocsEditable
+  @DomName('Range.endContainer')
   Node get endContainer native "Range_endContainer_Getter";
 
-
-  /** @domName Range.endOffset */
+  @DocsEditable
+  @DomName('Range.endOffset')
   int get endOffset native "Range_endOffset_Getter";
 
-
-  /** @domName Range.startContainer */
+  @DocsEditable
+  @DomName('Range.startContainer')
   Node get startContainer native "Range_startContainer_Getter";
 
-
-  /** @domName Range.startOffset */
+  @DocsEditable
+  @DomName('Range.startOffset')
   int get startOffset native "Range_startOffset_Getter";
 
-
-  /** @domName Range.cloneContents */
+  @DocsEditable
+  @DomName('Range.cloneContents')
   DocumentFragment cloneContents() native "Range_cloneContents_Callback";
 
-
-  /** @domName Range.cloneRange */
+  @DocsEditable
+  @DomName('Range.cloneRange')
   Range cloneRange() native "Range_cloneRange_Callback";
 
-
-  /** @domName Range.collapse */
+  @DocsEditable
+  @DomName('Range.collapse')
   void collapse(bool toStart) native "Range_collapse_Callback";
 
-
-  /** @domName Range.compareNode */
+  @DocsEditable
+  @DomName('Range.compareNode')
   int compareNode(Node refNode) native "Range_compareNode_Callback";
 
-
-  /** @domName Range.comparePoint */
+  @DocsEditable
+  @DomName('Range.comparePoint')
   int comparePoint(Node refNode, int offset) native "Range_comparePoint_Callback";
 
-
-  /** @domName Range.createContextualFragment */
+  @DocsEditable
+  @DomName('Range.createContextualFragment')
   DocumentFragment createContextualFragment(String html) native "Range_createContextualFragment_Callback";
 
-
-  /** @domName Range.deleteContents */
+  @DocsEditable
+  @DomName('Range.deleteContents')
   void deleteContents() native "Range_deleteContents_Callback";
 
-
-  /** @domName Range.detach */
+  @DocsEditable
+  @DomName('Range.detach')
   void detach() native "Range_detach_Callback";
 
-
-  /** @domName Range.expand */
+  @DocsEditable
+  @DomName('Range.expand')
   void expand(String unit) native "Range_expand_Callback";
 
-
-  /** @domName Range.extractContents */
+  @DocsEditable
+  @DomName('Range.extractContents')
   DocumentFragment extractContents() native "Range_extractContents_Callback";
 
-
-  /** @domName Range.getBoundingClientRect */
+  @DocsEditable
+  @DomName('Range.getBoundingClientRect')
   ClientRect getBoundingClientRect() native "Range_getBoundingClientRect_Callback";
 
-
-  /** @domName Range.getClientRects */
+  @DocsEditable
+  @DomName('Range.getClientRects')
   List<ClientRect> getClientRects() native "Range_getClientRects_Callback";
 
-
-  /** @domName Range.insertNode */
+  @DocsEditable
+  @DomName('Range.insertNode')
   void insertNode(Node newNode) native "Range_insertNode_Callback";
 
-
-  /** @domName Range.intersectsNode */
+  @DocsEditable
+  @DomName('Range.intersectsNode')
   bool intersectsNode(Node refNode) native "Range_intersectsNode_Callback";
 
-
-  /** @domName Range.isPointInRange */
+  @DocsEditable
+  @DomName('Range.isPointInRange')
   bool isPointInRange(Node refNode, int offset) native "Range_isPointInRange_Callback";
 
-
-  /** @domName Range.selectNode */
+  @DocsEditable
+  @DomName('Range.selectNode')
   void selectNode(Node refNode) native "Range_selectNode_Callback";
 
-
-  /** @domName Range.selectNodeContents */
+  @DocsEditable
+  @DomName('Range.selectNodeContents')
   void selectNodeContents(Node refNode) native "Range_selectNodeContents_Callback";
 
-
-  /** @domName Range.setEnd */
+  @DocsEditable
+  @DomName('Range.setEnd')
   void setEnd(Node refNode, int offset) native "Range_setEnd_Callback";
 
-
-  /** @domName Range.setEndAfter */
+  @DocsEditable
+  @DomName('Range.setEndAfter')
   void setEndAfter(Node refNode) native "Range_setEndAfter_Callback";
 
-
-  /** @domName Range.setEndBefore */
+  @DocsEditable
+  @DomName('Range.setEndBefore')
   void setEndBefore(Node refNode) native "Range_setEndBefore_Callback";
 
-
-  /** @domName Range.setStart */
+  @DocsEditable
+  @DomName('Range.setStart')
   void setStart(Node refNode, int offset) native "Range_setStart_Callback";
 
-
-  /** @domName Range.setStartAfter */
+  @DocsEditable
+  @DomName('Range.setStartAfter')
   void setStartAfter(Node refNode) native "Range_setStartAfter_Callback";
 
-
-  /** @domName Range.setStartBefore */
+  @DocsEditable
+  @DomName('Range.setStartBefore')
   void setStartBefore(Node refNode) native "Range_setStartBefore_Callback";
 
-
-  /** @domName Range.surroundContents */
+  @DocsEditable
+  @DomName('Range.surroundContents')
   void surroundContents(Node newParent) native "Range_surroundContents_Callback";
 
-
-  /** @domName Range.toString */
+  @DocsEditable
+  @DomName('Range.toString')
   String toString() native "Range_toString_Callback";
 
 }
@@ -19792,7 +19659,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName RangeException
+@DocsEditable
+@DomName('RangeException')
 class RangeException extends NativeFieldWrapperClass1 {
   RangeException.internal();
 
@@ -19800,20 +19668,20 @@
 
   static const int INVALID_NODE_TYPE_ERR = 2;
 
-
-  /** @domName RangeException.code */
+  @DocsEditable
+  @DomName('RangeException.code')
   int get code native "RangeException_code_Getter";
 
-
-  /** @domName RangeException.message */
+  @DocsEditable
+  @DomName('RangeException.message')
   String get message native "RangeException_message_Getter";
 
-
-  /** @domName RangeException.name */
+  @DocsEditable
+  @DomName('RangeException.name')
   String get name native "RangeException_name_Getter";
 
-
-  /** @domName RangeException.toString */
+  @DocsEditable
+  @DomName('RangeException.toString')
   String toString() native "RangeException_toString_Callback";
 
 }
@@ -19824,24 +19692,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Rect
+@DocsEditable
+@DomName('Rect')
 class Rect extends NativeFieldWrapperClass1 {
   Rect.internal();
 
-
-  /** @domName Rect.bottom */
+  @DocsEditable
+  @DomName('Rect.bottom')
   CssPrimitiveValue get bottom native "Rect_bottom_Getter";
 
-
-  /** @domName Rect.left */
+  @DocsEditable
+  @DomName('Rect.left')
   CssPrimitiveValue get left native "Rect_left_Getter";
 
-
-  /** @domName Rect.right */
+  @DocsEditable
+  @DomName('Rect.right')
   CssPrimitiveValue get right native "Rect_right_Getter";
 
-
-  /** @domName Rect.top */
+  @DocsEditable
+  @DomName('Rect.top')
   CssPrimitiveValue get top native "Rect_top_Getter";
 
 }
@@ -19860,20 +19729,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName RGBColor
+@DocsEditable
+@DomName('RGBColor')
 class RgbColor extends NativeFieldWrapperClass1 {
   RgbColor.internal();
 
-
-  /** @domName RGBColor.blue */
+  @DocsEditable
+  @DomName('RGBColor.blue')
   CssPrimitiveValue get blue native "RGBColor_blue_Getter";
 
-
-  /** @domName RGBColor.green */
+  @DocsEditable
+  @DomName('RGBColor.green')
   CssPrimitiveValue get green native "RGBColor_green_Getter";
 
-
-  /** @domName RGBColor.red */
+  @DocsEditable
+  @DomName('RGBColor.red')
   CssPrimitiveValue get red native "RGBColor_red_Getter";
 
 }
@@ -19884,7 +19754,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName RTCDataChannel
+@DocsEditable
+@DomName('RTCDataChannel')
 class RtcDataChannel extends EventTarget {
   RtcDataChannel.internal() : super.internal();
 
@@ -19896,48 +19767,49 @@
 
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   RtcDataChannelEvents get on =>
     new RtcDataChannelEvents(this);
 
-
-  /** @domName RTCDataChannel.binaryType */
+  @DocsEditable
+  @DomName('RTCDataChannel.binaryType')
   String get binaryType native "RTCDataChannel_binaryType_Getter";
 
-
-  /** @domName RTCDataChannel.binaryType */
+  @DocsEditable
+  @DomName('RTCDataChannel.binaryType')
   void set binaryType(String value) native "RTCDataChannel_binaryType_Setter";
 
-
-  /** @domName RTCDataChannel.bufferedAmount */
+  @DocsEditable
+  @DomName('RTCDataChannel.bufferedAmount')
   int get bufferedAmount native "RTCDataChannel_bufferedAmount_Getter";
 
-
-  /** @domName RTCDataChannel.label */
+  @DocsEditable
+  @DomName('RTCDataChannel.label')
   String get label native "RTCDataChannel_label_Getter";
 
-
-  /** @domName RTCDataChannel.readyState */
+  @DocsEditable
+  @DomName('RTCDataChannel.readyState')
   String get readyState native "RTCDataChannel_readyState_Getter";
 
-
-  /** @domName RTCDataChannel.reliable */
+  @DocsEditable
+  @DomName('RTCDataChannel.reliable')
   bool get reliable native "RTCDataChannel_reliable_Getter";
 
-
-  /** @domName RTCDataChannel.addEventListener */
+  @DocsEditable
+  @DomName('RTCDataChannel.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_addEventListener_Callback";
 
-
-  /** @domName RTCDataChannel.close */
+  @DocsEditable
+  @DomName('RTCDataChannel.close')
   void close() native "RTCDataChannel_close_Callback";
 
-
-  /** @domName RTCDataChannel.dispatchEvent */
+  @DocsEditable
+  @DomName('RTCDataChannel.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native "RTCDataChannel_dispatchEvent_Callback";
 
-
-  /** @domName RTCDataChannel.removeEventListener */
+  @DocsEditable
+  @DomName('RTCDataChannel.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_removeEventListener_Callback";
 
   void send(data) {
@@ -19960,20 +19832,20 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName RTCDataChannel.send_1 */
+  @DocsEditable
+  @DomName('RTCDataChannel.send_1')
   void _send_1(data) native "RTCDataChannel_send_1_Callback";
 
-
-  /** @domName RTCDataChannel.send_2 */
+  @DocsEditable
+  @DomName('RTCDataChannel.send_2')
   void _send_2(data) native "RTCDataChannel_send_2_Callback";
 
-
-  /** @domName RTCDataChannel.send_3 */
+  @DocsEditable
+  @DomName('RTCDataChannel.send_3')
   void _send_3(data) native "RTCDataChannel_send_3_Callback";
 
-
-  /** @domName RTCDataChannel.send_4 */
+  @DocsEditable
+  @DomName('RTCDataChannel.send_4')
   void _send_4(data) native "RTCDataChannel_send_4_Callback";
 
   Stream<Event> get onClose => closeEvent.forTarget(this);
@@ -19986,21 +19858,21 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class RtcDataChannelEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   RtcDataChannelEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get close => this['close'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get message => this['message'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get open => this['open'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20010,12 +19882,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName RTCDataChannelEvent
+@DocsEditable
+@DomName('RTCDataChannelEvent')
 class RtcDataChannelEvent extends Event {
   RtcDataChannelEvent.internal() : super.internal();
 
-
-  /** @domName RTCDataChannelEvent.channel */
+  @DocsEditable
+  @DomName('RTCDataChannelEvent.channel')
   RtcDataChannel get channel native "RTCDataChannelEvent_channel_Getter";
 
 }
@@ -20026,24 +19899,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName RTCIceCandidate
+@DocsEditable
+@DomName('RTCIceCandidate')
 class RtcIceCandidate extends NativeFieldWrapperClass1 {
   RtcIceCandidate.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory RtcIceCandidate(Map dictionary) => RtcIceCandidate._create(dictionary);
   static RtcIceCandidate _create(Map dictionary) native "RTCIceCandidate_constructor_Callback";
 
-
-  /** @domName RTCIceCandidate.candidate */
+  @DocsEditable
+  @DomName('RTCIceCandidate.candidate')
   String get candidate native "RTCIceCandidate_candidate_Getter";
 
-
-  /** @domName RTCIceCandidate.sdpMLineIndex */
+  @DocsEditable
+  @DomName('RTCIceCandidate.sdpMLineIndex')
   int get sdpMLineIndex native "RTCIceCandidate_sdpMLineIndex_Getter";
 
-
-  /** @domName RTCIceCandidate.sdpMid */
+  @DocsEditable
+  @DomName('RTCIceCandidate.sdpMid')
   String get sdpMid native "RTCIceCandidate_sdpMid_Getter";
 
 }
@@ -20054,12 +19928,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName RTCIceCandidateEvent
+@DocsEditable
+@DomName('RTCIceCandidateEvent')
 class RtcIceCandidateEvent extends Event {
   RtcIceCandidateEvent.internal() : super.internal();
 
-
-  /** @domName RTCIceCandidateEvent.candidate */
+  @DocsEditable
+  @DomName('RTCIceCandidateEvent.candidate')
   RtcIceCandidate get candidate native "RTCIceCandidateEvent_candidate_Getter";
 
 }
@@ -20070,7 +19945,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName RTCPeerConnection
+@DocsEditable
+@DomName('RTCPeerConnection')
 class RtcPeerConnection extends EventTarget {
   RtcPeerConnection.internal() : super.internal();
 
@@ -20090,7 +19966,7 @@
 
   static const EventStreamProvider<Event> stateChangeEvent = const EventStreamProvider<Event>('statechange');
 
-  ///@docsEditable true
+  @DocsEditable
   factory RtcPeerConnection(Map rtcIceServers, [Map mediaConstraints]) {
     if (!?mediaConstraints) {
       return RtcPeerConnection._create(rtcIceServers);
@@ -20099,92 +19975,93 @@
   }
   static RtcPeerConnection _create(Map rtcIceServers, [Map mediaConstraints]) native "RTCPeerConnection_constructor_Callback";
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   RtcPeerConnectionEvents get on =>
     new RtcPeerConnectionEvents(this);
 
-
-  /** @domName RTCPeerConnection.iceGatheringState */
+  @DocsEditable
+  @DomName('RTCPeerConnection.iceGatheringState')
   String get iceGatheringState native "RTCPeerConnection_iceGatheringState_Getter";
 
-
-  /** @domName RTCPeerConnection.iceState */
+  @DocsEditable
+  @DomName('RTCPeerConnection.iceState')
   String get iceState native "RTCPeerConnection_iceState_Getter";
 
-
-  /** @domName RTCPeerConnection.localDescription */
+  @DocsEditable
+  @DomName('RTCPeerConnection.localDescription')
   RtcSessionDescription get localDescription native "RTCPeerConnection_localDescription_Getter";
 
-
-  /** @domName RTCPeerConnection.localStreams */
+  @DocsEditable
+  @DomName('RTCPeerConnection.localStreams')
   List<MediaStream> get localStreams native "RTCPeerConnection_localStreams_Getter";
 
-
-  /** @domName RTCPeerConnection.readyState */
+  @DocsEditable
+  @DomName('RTCPeerConnection.readyState')
   String get readyState native "RTCPeerConnection_readyState_Getter";
 
-
-  /** @domName RTCPeerConnection.remoteDescription */
+  @DocsEditable
+  @DomName('RTCPeerConnection.remoteDescription')
   RtcSessionDescription get remoteDescription native "RTCPeerConnection_remoteDescription_Getter";
 
-
-  /** @domName RTCPeerConnection.remoteStreams */
+  @DocsEditable
+  @DomName('RTCPeerConnection.remoteStreams')
   List<MediaStream> get remoteStreams native "RTCPeerConnection_remoteStreams_Getter";
 
-
-  /** @domName RTCPeerConnection.addEventListener */
+  @DocsEditable
+  @DomName('RTCPeerConnection.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_addEventListener_Callback";
 
-
-  /** @domName RTCPeerConnection.addIceCandidate */
+  @DocsEditable
+  @DomName('RTCPeerConnection.addIceCandidate')
   void addIceCandidate(RtcIceCandidate candidate) native "RTCPeerConnection_addIceCandidate_Callback";
 
-
-  /** @domName RTCPeerConnection.addStream */
+  @DocsEditable
+  @DomName('RTCPeerConnection.addStream')
   void addStream(MediaStream stream, [Map mediaConstraints]) native "RTCPeerConnection_addStream_Callback";
 
-
-  /** @domName RTCPeerConnection.close */
+  @DocsEditable
+  @DomName('RTCPeerConnection.close')
   void close() native "RTCPeerConnection_close_Callback";
 
-
-  /** @domName RTCPeerConnection.createAnswer */
+  @DocsEditable
+  @DomName('RTCPeerConnection.createAnswer')
   void createAnswer(RtcSessionDescriptionCallback successCallback, [RtcErrorCallback failureCallback, Map mediaConstraints]) native "RTCPeerConnection_createAnswer_Callback";
 
-
-  /** @domName RTCPeerConnection.createDataChannel */
+  @DocsEditable
+  @DomName('RTCPeerConnection.createDataChannel')
   RtcDataChannel createDataChannel(String label, [Map options]) native "RTCPeerConnection_createDataChannel_Callback";
 
-
-  /** @domName RTCPeerConnection.createOffer */
+  @DocsEditable
+  @DomName('RTCPeerConnection.createOffer')
   void createOffer(RtcSessionDescriptionCallback successCallback, [RtcErrorCallback failureCallback, Map mediaConstraints]) native "RTCPeerConnection_createOffer_Callback";
 
-
-  /** @domName RTCPeerConnection.dispatchEvent */
+  @DocsEditable
+  @DomName('RTCPeerConnection.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native "RTCPeerConnection_dispatchEvent_Callback";
 
-
-  /** @domName RTCPeerConnection.getStats */
+  @DocsEditable
+  @DomName('RTCPeerConnection.getStats')
   void getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) native "RTCPeerConnection_getStats_Callback";
 
-
-  /** @domName RTCPeerConnection.removeEventListener */
+  @DocsEditable
+  @DomName('RTCPeerConnection.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_removeEventListener_Callback";
 
-
-  /** @domName RTCPeerConnection.removeStream */
+  @DocsEditable
+  @DomName('RTCPeerConnection.removeStream')
   void removeStream(MediaStream stream) native "RTCPeerConnection_removeStream_Callback";
 
-
-  /** @domName RTCPeerConnection.setLocalDescription */
+  @DocsEditable
+  @DomName('RTCPeerConnection.setLocalDescription')
   void setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, RtcErrorCallback failureCallback]) native "RTCPeerConnection_setLocalDescription_Callback";
 
-
-  /** @domName RTCPeerConnection.setRemoteDescription */
+  @DocsEditable
+  @DomName('RTCPeerConnection.setRemoteDescription')
   void setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, RtcErrorCallback failureCallback]) native "RTCPeerConnection_setRemoteDescription_Callback";
 
-
-  /** @domName RTCPeerConnection.updateIce */
+  @DocsEditable
+  @DomName('RTCPeerConnection.updateIce')
   void updateIce([Map configuration, Map mediaConstraints]) native "RTCPeerConnection_updateIce_Callback";
 
   Stream<MediaStreamEvent> get onAddStream => addStreamEvent.forTarget(this);
@@ -20205,30 +20082,30 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class RtcPeerConnectionEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   RtcPeerConnectionEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get addStream => this['addstream'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get iceCandidate => this['icecandidate'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get iceChange => this['icechange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get negotiationNeeded => this['negotiationneeded'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get open => this['open'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get removeStream => this['removestream'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get stateChange => this['statechange'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20238,28 +20115,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName RTCSessionDescription
+@DocsEditable
+@DomName('RTCSessionDescription')
 class RtcSessionDescription extends NativeFieldWrapperClass1 {
   RtcSessionDescription.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory RtcSessionDescription(Map dictionary) => RtcSessionDescription._create(dictionary);
   static RtcSessionDescription _create(Map dictionary) native "RTCSessionDescription_constructor_Callback";
 
-
-  /** @domName RTCSessionDescription.sdp */
+  @DocsEditable
+  @DomName('RTCSessionDescription.sdp')
   String get sdp native "RTCSessionDescription_sdp_Getter";
 
-
-  /** @domName RTCSessionDescription.sdp */
+  @DocsEditable
+  @DomName('RTCSessionDescription.sdp')
   void set sdp(String value) native "RTCSessionDescription_sdp_Setter";
 
-
-  /** @domName RTCSessionDescription.type */
+  @DocsEditable
+  @DomName('RTCSessionDescription.type')
   String get type native "RTCSessionDescription_type_Getter";
 
-
-  /** @domName RTCSessionDescription.type */
+  @DocsEditable
+  @DomName('RTCSessionDescription.type')
   void set type(String value) native "RTCSessionDescription_type_Setter";
 
 }
@@ -20270,20 +20148,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName RTCStatsElement
+@DocsEditable
+@DomName('RTCStatsElement')
 class RtcStatsElement extends NativeFieldWrapperClass1 {
   RtcStatsElement.internal();
 
-
-  /** @domName RTCStatsElement.timestamp */
+  @DocsEditable
+  @DomName('RTCStatsElement.timestamp')
   Date get timestamp native "RTCStatsElement_timestamp_Getter";
 
-
-  /** @domName RTCStatsElement.names */
+  @DocsEditable
+  @DomName('RTCStatsElement.names')
   List<String> names() native "RTCStatsElement_names_Callback";
 
-
-  /** @domName RTCStatsElement.stat */
+  @DocsEditable
+  @DomName('RTCStatsElement.stat')
   String stat(String name) native "RTCStatsElement_stat_Callback";
 
 }
@@ -20294,16 +20173,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName RTCStatsReport
+@DocsEditable
+@DomName('RTCStatsReport')
 class RtcStatsReport extends NativeFieldWrapperClass1 {
   RtcStatsReport.internal();
 
-
-  /** @domName RTCStatsReport.local */
+  @DocsEditable
+  @DomName('RTCStatsReport.local')
   RtcStatsElement get local native "RTCStatsReport_local_Getter";
 
-
-  /** @domName RTCStatsReport.remote */
+  @DocsEditable
+  @DomName('RTCStatsReport.remote')
   RtcStatsElement get remote native "RTCStatsReport_remote_Getter";
 
 }
@@ -20314,12 +20194,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName RTCStatsResponse
+@DocsEditable
+@DomName('RTCStatsResponse')
 class RtcStatsResponse extends NativeFieldWrapperClass1 {
   RtcStatsResponse.internal();
 
-
-  /** @domName RTCStatsResponse.result */
+  @DocsEditable
+  @DomName('RTCStatsResponse.result')
   List<RtcStatsReport> result() native "RTCStatsResponse_result_Callback";
 
 }
@@ -20370,40 +20251,41 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Screen
+@DocsEditable
+@DomName('Screen')
 class Screen extends NativeFieldWrapperClass1 {
   Screen.internal();
 
-
-  /** @domName Screen.availHeight */
+  @DocsEditable
+  @DomName('Screen.availHeight')
   int get availHeight native "Screen_availHeight_Getter";
 
-
-  /** @domName Screen.availLeft */
+  @DocsEditable
+  @DomName('Screen.availLeft')
   int get availLeft native "Screen_availLeft_Getter";
 
-
-  /** @domName Screen.availTop */
+  @DocsEditable
+  @DomName('Screen.availTop')
   int get availTop native "Screen_availTop_Getter";
 
-
-  /** @domName Screen.availWidth */
+  @DocsEditable
+  @DomName('Screen.availWidth')
   int get availWidth native "Screen_availWidth_Getter";
 
-
-  /** @domName Screen.colorDepth */
+  @DocsEditable
+  @DomName('Screen.colorDepth')
   int get colorDepth native "Screen_colorDepth_Getter";
 
-
-  /** @domName Screen.height */
+  @DocsEditable
+  @DomName('Screen.height')
   int get height native "Screen_height_Getter";
 
-
-  /** @domName Screen.pixelDepth */
+  @DocsEditable
+  @DomName('Screen.pixelDepth')
   int get pixelDepth native "Screen_pixelDepth_Getter";
 
-
-  /** @domName Screen.width */
+  @DocsEditable
+  @DomName('Screen.width')
   int get width native "Screen_width_Getter";
 
 }
@@ -20414,75 +20296,76 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLScriptElement
+@DocsEditable
+@DomName('HTMLScriptElement')
 class ScriptElement extends _Element_Merged {
   ScriptElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory ScriptElement() => document.$dom_createElement("script");
 
-
-  /** @domName HTMLScriptElement.async */
+  @DocsEditable
+  @DomName('HTMLScriptElement.async')
   bool get async native "HTMLScriptElement_async_Getter";
 
-
-  /** @domName HTMLScriptElement.async */
+  @DocsEditable
+  @DomName('HTMLScriptElement.async')
   void set async(bool value) native "HTMLScriptElement_async_Setter";
 
-
-  /** @domName HTMLScriptElement.charset */
+  @DocsEditable
+  @DomName('HTMLScriptElement.charset')
   String get charset native "HTMLScriptElement_charset_Getter";
 
-
-  /** @domName HTMLScriptElement.charset */
+  @DocsEditable
+  @DomName('HTMLScriptElement.charset')
   void set charset(String value) native "HTMLScriptElement_charset_Setter";
 
-
-  /** @domName HTMLScriptElement.crossOrigin */
+  @DocsEditable
+  @DomName('HTMLScriptElement.crossOrigin')
   String get crossOrigin native "HTMLScriptElement_crossOrigin_Getter";
 
-
-  /** @domName HTMLScriptElement.crossOrigin */
+  @DocsEditable
+  @DomName('HTMLScriptElement.crossOrigin')
   void set crossOrigin(String value) native "HTMLScriptElement_crossOrigin_Setter";
 
-
-  /** @domName HTMLScriptElement.defer */
+  @DocsEditable
+  @DomName('HTMLScriptElement.defer')
   bool get defer native "HTMLScriptElement_defer_Getter";
 
-
-  /** @domName HTMLScriptElement.defer */
+  @DocsEditable
+  @DomName('HTMLScriptElement.defer')
   void set defer(bool value) native "HTMLScriptElement_defer_Setter";
 
-
-  /** @domName HTMLScriptElement.event */
+  @DocsEditable
+  @DomName('HTMLScriptElement.event')
   String get event native "HTMLScriptElement_event_Getter";
 
-
-  /** @domName HTMLScriptElement.event */
+  @DocsEditable
+  @DomName('HTMLScriptElement.event')
   void set event(String value) native "HTMLScriptElement_event_Setter";
 
-
-  /** @domName HTMLScriptElement.htmlFor */
+  @DocsEditable
+  @DomName('HTMLScriptElement.htmlFor')
   String get htmlFor native "HTMLScriptElement_htmlFor_Getter";
 
-
-  /** @domName HTMLScriptElement.htmlFor */
+  @DocsEditable
+  @DomName('HTMLScriptElement.htmlFor')
   void set htmlFor(String value) native "HTMLScriptElement_htmlFor_Setter";
 
-
-  /** @domName HTMLScriptElement.src */
+  @DocsEditable
+  @DomName('HTMLScriptElement.src')
   String get src native "HTMLScriptElement_src_Getter";
 
-
-  /** @domName HTMLScriptElement.src */
+  @DocsEditable
+  @DomName('HTMLScriptElement.src')
   void set src(String value) native "HTMLScriptElement_src_Setter";
 
-
-  /** @domName HTMLScriptElement.type */
+  @DocsEditable
+  @DomName('HTMLScriptElement.type')
   String get type native "HTMLScriptElement_type_Getter";
 
-
-  /** @domName HTMLScriptElement.type */
+  @DocsEditable
+  @DomName('HTMLScriptElement.type')
   void set type(String value) native "HTMLScriptElement_type_Setter";
 
 }
@@ -20493,20 +20376,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ScriptProfile
+@DocsEditable
+@DomName('ScriptProfile')
 class ScriptProfile extends NativeFieldWrapperClass1 {
   ScriptProfile.internal();
 
-
-  /** @domName ScriptProfile.head */
+  @DocsEditable
+  @DomName('ScriptProfile.head')
   ScriptProfileNode get head native "ScriptProfile_head_Getter";
 
+  @DocsEditable
+  @DomName('ScriptProfile.idleTime')
+  num get idleTime native "ScriptProfile_idleTime_Getter";
 
-  /** @domName ScriptProfile.title */
+  @DocsEditable
+  @DomName('ScriptProfile.title')
   String get title native "ScriptProfile_title_Getter";
 
-
-  /** @domName ScriptProfile.uid */
+  @DocsEditable
+  @DomName('ScriptProfile.uid')
   int get uid native "ScriptProfile_uid_Getter";
 
 }
@@ -20517,44 +20405,45 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ScriptProfileNode
+@DocsEditable
+@DomName('ScriptProfileNode')
 class ScriptProfileNode extends NativeFieldWrapperClass1 {
   ScriptProfileNode.internal();
 
-
-  /** @domName ScriptProfileNode.callUID */
+  @DocsEditable
+  @DomName('ScriptProfileNode.callUID')
   int get callUid native "ScriptProfileNode_callUID_Getter";
 
-
-  /** @domName ScriptProfileNode.functionName */
+  @DocsEditable
+  @DomName('ScriptProfileNode.functionName')
   String get functionName native "ScriptProfileNode_functionName_Getter";
 
-
-  /** @domName ScriptProfileNode.lineNumber */
+  @DocsEditable
+  @DomName('ScriptProfileNode.lineNumber')
   int get lineNumber native "ScriptProfileNode_lineNumber_Getter";
 
-
-  /** @domName ScriptProfileNode.numberOfCalls */
+  @DocsEditable
+  @DomName('ScriptProfileNode.numberOfCalls')
   int get numberOfCalls native "ScriptProfileNode_numberOfCalls_Getter";
 
-
-  /** @domName ScriptProfileNode.selfTime */
+  @DocsEditable
+  @DomName('ScriptProfileNode.selfTime')
   num get selfTime native "ScriptProfileNode_selfTime_Getter";
 
-
-  /** @domName ScriptProfileNode.totalTime */
+  @DocsEditable
+  @DomName('ScriptProfileNode.totalTime')
   num get totalTime native "ScriptProfileNode_totalTime_Getter";
 
-
-  /** @domName ScriptProfileNode.url */
+  @DocsEditable
+  @DomName('ScriptProfileNode.url')
   String get url native "ScriptProfileNode_url_Getter";
 
-
-  /** @domName ScriptProfileNode.visible */
+  @DocsEditable
+  @DomName('ScriptProfileNode.visible')
   bool get visible native "ScriptProfileNode_visible_Getter";
 
-
-  /** @domName ScriptProfileNode.children */
+  @DocsEditable
+  @DomName('ScriptProfileNode.children')
   List<ScriptProfileNode> children() native "ScriptProfileNode_children_Callback";
 
 }
@@ -20563,123 +20452,124 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLSelectElement
+@DocsEditable
+@DomName('HTMLSelectElement')
 class SelectElement extends _Element_Merged {
   SelectElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory SelectElement() => document.$dom_createElement("select");
 
-
-  /** @domName HTMLSelectElement.autofocus */
+  @DocsEditable
+  @DomName('HTMLSelectElement.autofocus')
   bool get autofocus native "HTMLSelectElement_autofocus_Getter";
 
-
-  /** @domName HTMLSelectElement.autofocus */
+  @DocsEditable
+  @DomName('HTMLSelectElement.autofocus')
   void set autofocus(bool value) native "HTMLSelectElement_autofocus_Setter";
 
-
-  /** @domName HTMLSelectElement.disabled */
+  @DocsEditable
+  @DomName('HTMLSelectElement.disabled')
   bool get disabled native "HTMLSelectElement_disabled_Getter";
 
-
-  /** @domName HTMLSelectElement.disabled */
+  @DocsEditable
+  @DomName('HTMLSelectElement.disabled')
   void set disabled(bool value) native "HTMLSelectElement_disabled_Setter";
 
-
-  /** @domName HTMLSelectElement.form */
+  @DocsEditable
+  @DomName('HTMLSelectElement.form')
   FormElement get form native "HTMLSelectElement_form_Getter";
 
-
-  /** @domName HTMLSelectElement.labels */
+  @DocsEditable
+  @DomName('HTMLSelectElement.labels')
   List<Node> get labels native "HTMLSelectElement_labels_Getter";
 
-
-  /** @domName HTMLSelectElement.length */
+  @DocsEditable
+  @DomName('HTMLSelectElement.length')
   int get length native "HTMLSelectElement_length_Getter";
 
-
-  /** @domName HTMLSelectElement.length */
+  @DocsEditable
+  @DomName('HTMLSelectElement.length')
   void set length(int value) native "HTMLSelectElement_length_Setter";
 
-
-  /** @domName HTMLSelectElement.multiple */
+  @DocsEditable
+  @DomName('HTMLSelectElement.multiple')
   bool get multiple native "HTMLSelectElement_multiple_Getter";
 
-
-  /** @domName HTMLSelectElement.multiple */
+  @DocsEditable
+  @DomName('HTMLSelectElement.multiple')
   void set multiple(bool value) native "HTMLSelectElement_multiple_Setter";
 
-
-  /** @domName HTMLSelectElement.name */
+  @DocsEditable
+  @DomName('HTMLSelectElement.name')
   String get name native "HTMLSelectElement_name_Getter";
 
-
-  /** @domName HTMLSelectElement.name */
+  @DocsEditable
+  @DomName('HTMLSelectElement.name')
   void set name(String value) native "HTMLSelectElement_name_Setter";
 
-
-  /** @domName HTMLSelectElement.required */
+  @DocsEditable
+  @DomName('HTMLSelectElement.required')
   bool get required native "HTMLSelectElement_required_Getter";
 
-
-  /** @domName HTMLSelectElement.required */
+  @DocsEditable
+  @DomName('HTMLSelectElement.required')
   void set required(bool value) native "HTMLSelectElement_required_Setter";
 
-
-  /** @domName HTMLSelectElement.selectedIndex */
+  @DocsEditable
+  @DomName('HTMLSelectElement.selectedIndex')
   int get selectedIndex native "HTMLSelectElement_selectedIndex_Getter";
 
-
-  /** @domName HTMLSelectElement.selectedIndex */
+  @DocsEditable
+  @DomName('HTMLSelectElement.selectedIndex')
   void set selectedIndex(int value) native "HTMLSelectElement_selectedIndex_Setter";
 
-
-  /** @domName HTMLSelectElement.size */
+  @DocsEditable
+  @DomName('HTMLSelectElement.size')
   int get size native "HTMLSelectElement_size_Getter";
 
-
-  /** @domName HTMLSelectElement.size */
+  @DocsEditable
+  @DomName('HTMLSelectElement.size')
   void set size(int value) native "HTMLSelectElement_size_Setter";
 
-
-  /** @domName HTMLSelectElement.type */
+  @DocsEditable
+  @DomName('HTMLSelectElement.type')
   String get type native "HTMLSelectElement_type_Getter";
 
-
-  /** @domName HTMLSelectElement.validationMessage */
+  @DocsEditable
+  @DomName('HTMLSelectElement.validationMessage')
   String get validationMessage native "HTMLSelectElement_validationMessage_Getter";
 
-
-  /** @domName HTMLSelectElement.validity */
+  @DocsEditable
+  @DomName('HTMLSelectElement.validity')
   ValidityState get validity native "HTMLSelectElement_validity_Getter";
 
-
-  /** @domName HTMLSelectElement.value */
+  @DocsEditable
+  @DomName('HTMLSelectElement.value')
   String get value native "HTMLSelectElement_value_Getter";
 
-
-  /** @domName HTMLSelectElement.value */
+  @DocsEditable
+  @DomName('HTMLSelectElement.value')
   void set value(String value) native "HTMLSelectElement_value_Setter";
 
-
-  /** @domName HTMLSelectElement.willValidate */
+  @DocsEditable
+  @DomName('HTMLSelectElement.willValidate')
   bool get willValidate native "HTMLSelectElement_willValidate_Getter";
 
-
-  /** @domName HTMLSelectElement.checkValidity */
+  @DocsEditable
+  @DomName('HTMLSelectElement.checkValidity')
   bool checkValidity() native "HTMLSelectElement_checkValidity_Callback";
 
-
-  /** @domName HTMLSelectElement.item */
+  @DocsEditable
+  @DomName('HTMLSelectElement.item')
   Node item(int index) native "HTMLSelectElement_item_Callback";
 
-
-  /** @domName HTMLSelectElement.namedItem */
+  @DocsEditable
+  @DomName('HTMLSelectElement.namedItem')
   Node namedItem(String name) native "HTMLSelectElement_namedItem_Callback";
 
-
-  /** @domName HTMLSelectElement.setCustomValidity */
+  @DocsEditable
+  @DomName('HTMLSelectElement.setCustomValidity')
   void setCustomValidity(String error) native "HTMLSelectElement_setCustomValidity_Callback";
 
 
@@ -20707,7 +20597,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLShadowElement
+@DocsEditable
+@DomName('HTMLShadowElement')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental()
 class ShadowElement extends _Element_Merged {
@@ -20716,16 +20607,16 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-
-  /** @domName HTMLShadowElement.olderShadowRoot */
+  @DocsEditable
+  @DomName('HTMLShadowElement.olderShadowRoot')
   ShadowRoot get olderShadowRoot native "HTMLShadowElement_olderShadowRoot_Getter";
 
-
-  /** @domName HTMLShadowElement.resetStyleInheritance */
+  @DocsEditable
+  @DomName('HTMLShadowElement.resetStyleInheritance')
   bool get resetStyleInheritance native "HTMLShadowElement_resetStyleInheritance_Getter";
 
-
-  /** @domName HTMLShadowElement.resetStyleInheritance */
+  @DocsEditable
+  @DomName('HTMLShadowElement.resetStyleInheritance')
   void set resetStyleInheritance(bool value) native "HTMLShadowElement_resetStyleInheritance_Setter";
 
 }
@@ -20736,58 +20627,63 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ShadowRoot
+@DocsEditable
+@DomName('ShadowRoot')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental()
 class ShadowRoot extends DocumentFragment {
   ShadowRoot.internal() : super.internal();
 
-
-  /** @domName ShadowRoot.activeElement */
+  @DocsEditable
+  @DomName('ShadowRoot.activeElement')
   Element get activeElement native "ShadowRoot_activeElement_Getter";
 
-
-  /** @domName ShadowRoot.applyAuthorStyles */
+  @DocsEditable
+  @DomName('ShadowRoot.applyAuthorStyles')
   bool get applyAuthorStyles native "ShadowRoot_applyAuthorStyles_Getter";
 
-
-  /** @domName ShadowRoot.applyAuthorStyles */
+  @DocsEditable
+  @DomName('ShadowRoot.applyAuthorStyles')
   void set applyAuthorStyles(bool value) native "ShadowRoot_applyAuthorStyles_Setter";
 
-
-  /** @domName ShadowRoot.innerHTML */
+  @DocsEditable
+  @DomName('ShadowRoot.innerHTML')
   String get innerHtml native "ShadowRoot_innerHTML_Getter";
 
-
-  /** @domName ShadowRoot.innerHTML */
+  @DocsEditable
+  @DomName('ShadowRoot.innerHTML')
   void set innerHtml(String value) native "ShadowRoot_innerHTML_Setter";
 
-
-  /** @domName ShadowRoot.resetStyleInheritance */
+  @DocsEditable
+  @DomName('ShadowRoot.resetStyleInheritance')
   bool get resetStyleInheritance native "ShadowRoot_resetStyleInheritance_Getter";
 
-
-  /** @domName ShadowRoot.resetStyleInheritance */
+  @DocsEditable
+  @DomName('ShadowRoot.resetStyleInheritance')
   void set resetStyleInheritance(bool value) native "ShadowRoot_resetStyleInheritance_Setter";
 
-
-  /** @domName ShadowRoot.cloneNode */
+  @DocsEditable
+  @DomName('ShadowRoot.cloneNode')
   Node clone(bool deep) native "ShadowRoot_cloneNode_Callback";
 
+  @DocsEditable
+  @DomName('ShadowRoot.elementFromPoint')
+  Element elementFromPoint(int x, int y) native "ShadowRoot_elementFromPoint_Callback";
 
-  /** @domName ShadowRoot.getElementById */
+  @DocsEditable
+  @DomName('ShadowRoot.getElementById')
   Element $dom_getElementById(String elementId) native "ShadowRoot_getElementById_Callback";
 
-
-  /** @domName ShadowRoot.getElementsByClassName */
+  @DocsEditable
+  @DomName('ShadowRoot.getElementsByClassName')
   List<Node> $dom_getElementsByClassName(String className) native "ShadowRoot_getElementsByClassName_Callback";
 
-
-  /** @domName ShadowRoot.getElementsByTagName */
+  @DocsEditable
+  @DomName('ShadowRoot.getElementsByTagName')
   List<Node> $dom_getElementsByTagName(String tagName) native "ShadowRoot_getElementsByTagName_Callback";
 
-
-  /** @domName ShadowRoot.getSelection */
+  @DocsEditable
+  @DomName('ShadowRoot.getSelection')
   DomSelection getSelection() native "ShadowRoot_getSelection_Callback";
 
   static bool get supported => _Utils.shadowRootSupported(window.document);
@@ -20799,11 +20695,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SharedWorker
+@DocsEditable
+@DomName('SharedWorker')
 class SharedWorker extends AbstractWorker {
   SharedWorker.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory SharedWorker(String scriptURL, [String name]) {
     if (!?name) {
       return SharedWorker._create(scriptURL);
@@ -20812,8 +20709,8 @@
   }
   static SharedWorker _create(String scriptURL, [String name]) native "SharedWorker_constructor_Callback";
 
-
-  /** @domName SharedWorker.port */
+  @DocsEditable
+  @DomName('SharedWorker.port')
   MessagePort get port native "SharedWorker_port_Getter";
 
 }
@@ -20824,30 +20721,32 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SharedWorkerContext
+@DocsEditable
+@DomName('SharedWorkerContext')
 class SharedWorkerContext extends WorkerContext {
   SharedWorkerContext.internal() : super.internal();
 
   static const EventStreamProvider<Event> connectEvent = const EventStreamProvider<Event>('connect');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   SharedWorkerContextEvents get on =>
     new SharedWorkerContextEvents(this);
 
-
-  /** @domName SharedWorkerContext.name */
+  @DocsEditable
+  @DomName('SharedWorkerContext.name')
   String get name native "SharedWorkerContext_name_Getter";
 
   Stream<Event> get onConnect => connectEvent.forTarget(this);
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class SharedWorkerContextEvents extends WorkerContextEvents {
-  /// @docsEditable true
+  @DocsEditable
   SharedWorkerContextEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get connect => this['connect'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20857,28 +20756,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SourceBuffer
+@DocsEditable
+@DomName('SourceBuffer')
 class SourceBuffer extends NativeFieldWrapperClass1 {
   SourceBuffer.internal();
 
-
-  /** @domName SourceBuffer.buffered */
+  @DocsEditable
+  @DomName('SourceBuffer.buffered')
   TimeRanges get buffered native "SourceBuffer_buffered_Getter";
 
-
-  /** @domName SourceBuffer.timestampOffset */
+  @DocsEditable
+  @DomName('SourceBuffer.timestampOffset')
   num get timestampOffset native "SourceBuffer_timestampOffset_Getter";
 
-
-  /** @domName SourceBuffer.timestampOffset */
+  @DocsEditable
+  @DomName('SourceBuffer.timestampOffset')
   void set timestampOffset(num value) native "SourceBuffer_timestampOffset_Setter";
 
-
-  /** @domName SourceBuffer.abort */
+  @DocsEditable
+  @DomName('SourceBuffer.abort')
   void abort() native "SourceBuffer_abort_Callback";
 
-
-  /** @domName SourceBuffer.append */
+  @DocsEditable
+  @DomName('SourceBuffer.append')
   void append(Uint8Array data) native "SourceBuffer_append_Callback";
 
 }
@@ -20889,12 +20789,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SourceBufferList
+@DocsEditable
+@DomName('SourceBufferList')
 class SourceBufferList extends EventTarget implements List<SourceBuffer> {
   SourceBufferList.internal() : super.internal();
 
-
-  /** @domName SourceBufferList.length */
+  @DocsEditable
+  @DomName('SourceBufferList.length')
   int get length native "SourceBufferList_length_Getter";
 
   SourceBuffer operator[](int index) native "SourceBufferList_item_Callback";
@@ -20915,50 +20816,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SourceBuffer)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(SourceBuffer element) => Collections.contains(this, element);
+  bool contains(SourceBuffer element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(SourceBuffer element)) => Collections.forEach(this, f);
+  void forEach(void f(SourceBuffer element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(SourceBuffer element)) => new MappedList<SourceBuffer, dynamic>(this, f);
+  List mappedBy(f(SourceBuffer element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<SourceBuffer> where(bool f(SourceBuffer element)) => new WhereIterable<SourceBuffer>(this, f);
+  Iterable<SourceBuffer> where(bool f(SourceBuffer element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(SourceBuffer element)) => Collections.every(this, f);
+  bool every(bool f(SourceBuffer element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(SourceBuffer element)) => Collections.any(this, f);
+  bool any(bool f(SourceBuffer element)) => IterableMixinWorkaround.any(this, f);
 
   List<SourceBuffer> toList() => new List<SourceBuffer>.from(this);
   Set<SourceBuffer> toSet() => new Set<SourceBuffer>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<SourceBuffer> take(int n) => new ListView<SourceBuffer>(this, 0, n);
+  List<SourceBuffer> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<SourceBuffer> takeWhile(bool test(SourceBuffer value)) {
-    return new TakeWhileIterable<SourceBuffer>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<SourceBuffer> skip(int n) => new ListView<SourceBuffer>(this, n, null);
+  List<SourceBuffer> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<SourceBuffer> skipWhile(bool test(SourceBuffer value)) {
-    return new SkipWhileIterable<SourceBuffer>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   SourceBuffer firstMatching(bool test(SourceBuffer value), { SourceBuffer orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   SourceBuffer lastMatching(bool test(SourceBuffer value), {SourceBuffer orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   SourceBuffer singleMatching(bool test(SourceBuffer value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   SourceBuffer elementAt(int index) {
@@ -21016,16 +20917,36 @@
     throw new StateError("More than one element");
   }
 
-  SourceBuffer min([int compare(SourceBuffer a, SourceBuffer b)]) => Collections.min(this, compare);
+  SourceBuffer min([int compare(SourceBuffer a, SourceBuffer b)]) => IterableMixinWorkaround.min(this, compare);
 
-  SourceBuffer max([int compare(SourceBuffer a, SourceBuffer b)]) => Collections.max(this, compare);
+  SourceBuffer max([int compare(SourceBuffer a, SourceBuffer b)]) => IterableMixinWorkaround.max(this, compare);
 
   SourceBuffer removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   SourceBuffer removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(SourceBuffer element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(SourceBuffer element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<SourceBuffer> from, [int startFrom]) {
@@ -21045,20 +20966,20 @@
 
   // -- end List<SourceBuffer> mixins.
 
-
-  /** @domName SourceBufferList.addEventListener */
+  @DocsEditable
+  @DomName('SourceBufferList.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBufferList_addEventListener_Callback";
 
-
-  /** @domName SourceBufferList.dispatchEvent */
+  @DocsEditable
+  @DomName('SourceBufferList.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native "SourceBufferList_dispatchEvent_Callback";
 
-
-  /** @domName SourceBufferList.item */
+  @DocsEditable
+  @DomName('SourceBufferList.item')
   SourceBuffer item(int index) native "SourceBufferList_item_Callback";
 
-
-  /** @domName SourceBufferList.removeEventListener */
+  @DocsEditable
+  @DomName('SourceBufferList.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBufferList_removeEventListener_Callback";
 
 }
@@ -21069,35 +20990,36 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLSourceElement
+@DocsEditable
+@DomName('HTMLSourceElement')
 class SourceElement extends _Element_Merged {
   SourceElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory SourceElement() => document.$dom_createElement("source");
 
-
-  /** @domName HTMLSourceElement.media */
+  @DocsEditable
+  @DomName('HTMLSourceElement.media')
   String get media native "HTMLSourceElement_media_Getter";
 
-
-  /** @domName HTMLSourceElement.media */
+  @DocsEditable
+  @DomName('HTMLSourceElement.media')
   void set media(String value) native "HTMLSourceElement_media_Setter";
 
-
-  /** @domName HTMLSourceElement.src */
+  @DocsEditable
+  @DomName('HTMLSourceElement.src')
   String get src native "HTMLSourceElement_src_Getter";
 
-
-  /** @domName HTMLSourceElement.src */
+  @DocsEditable
+  @DomName('HTMLSourceElement.src')
   void set src(String value) native "HTMLSourceElement_src_Setter";
 
-
-  /** @domName HTMLSourceElement.type */
+  @DocsEditable
+  @DomName('HTMLSourceElement.type')
   String get type native "HTMLSourceElement_type_Getter";
 
-
-  /** @domName HTMLSourceElement.type */
+  @DocsEditable
+  @DomName('HTMLSourceElement.type')
   void set type(String value) native "HTMLSourceElement_type_Setter";
 
 }
@@ -21108,11 +21030,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLSpanElement
+@DocsEditable
+@DomName('HTMLSpanElement')
 class SpanElement extends _Element_Merged {
   SpanElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory SpanElement() => document.$dom_createElement("span");
 
 }
@@ -21123,28 +21046,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SpeechGrammar
+@DocsEditable
+@DomName('SpeechGrammar')
 class SpeechGrammar extends NativeFieldWrapperClass1 {
   SpeechGrammar.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory SpeechGrammar() => SpeechGrammar._create();
   static SpeechGrammar _create() native "SpeechGrammar_constructor_Callback";
 
-
-  /** @domName SpeechGrammar.src */
+  @DocsEditable
+  @DomName('SpeechGrammar.src')
   String get src native "SpeechGrammar_src_Getter";
 
-
-  /** @domName SpeechGrammar.src */
+  @DocsEditable
+  @DomName('SpeechGrammar.src')
   void set src(String value) native "SpeechGrammar_src_Setter";
 
-
-  /** @domName SpeechGrammar.weight */
+  @DocsEditable
+  @DomName('SpeechGrammar.weight')
   num get weight native "SpeechGrammar_weight_Getter";
 
-
-  /** @domName SpeechGrammar.weight */
+  @DocsEditable
+  @DomName('SpeechGrammar.weight')
   void set weight(num value) native "SpeechGrammar_weight_Setter";
 
 }
@@ -21155,16 +21079,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SpeechGrammarList
+@DocsEditable
+@DomName('SpeechGrammarList')
 class SpeechGrammarList extends NativeFieldWrapperClass1 implements List<SpeechGrammar> {
   SpeechGrammarList.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory SpeechGrammarList() => SpeechGrammarList._create();
   static SpeechGrammarList _create() native "SpeechGrammarList_constructor_Callback";
 
-
-  /** @domName SpeechGrammarList.length */
+  @DocsEditable
+  @DomName('SpeechGrammarList.length')
   int get length native "SpeechGrammarList_length_Getter";
 
   SpeechGrammar operator[](int index) native "SpeechGrammarList_item_Callback";
@@ -21185,50 +21110,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechGrammar)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(SpeechGrammar element) => Collections.contains(this, element);
+  bool contains(SpeechGrammar element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(SpeechGrammar element)) => Collections.forEach(this, f);
+  void forEach(void f(SpeechGrammar element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(SpeechGrammar element)) => new MappedList<SpeechGrammar, dynamic>(this, f);
+  List mappedBy(f(SpeechGrammar element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<SpeechGrammar> where(bool f(SpeechGrammar element)) => new WhereIterable<SpeechGrammar>(this, f);
+  Iterable<SpeechGrammar> where(bool f(SpeechGrammar element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(SpeechGrammar element)) => Collections.every(this, f);
+  bool every(bool f(SpeechGrammar element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(SpeechGrammar element)) => Collections.any(this, f);
+  bool any(bool f(SpeechGrammar element)) => IterableMixinWorkaround.any(this, f);
 
   List<SpeechGrammar> toList() => new List<SpeechGrammar>.from(this);
   Set<SpeechGrammar> toSet() => new Set<SpeechGrammar>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<SpeechGrammar> take(int n) => new ListView<SpeechGrammar>(this, 0, n);
+  List<SpeechGrammar> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<SpeechGrammar> takeWhile(bool test(SpeechGrammar value)) {
-    return new TakeWhileIterable<SpeechGrammar>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<SpeechGrammar> skip(int n) => new ListView<SpeechGrammar>(this, n, null);
+  List<SpeechGrammar> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<SpeechGrammar> skipWhile(bool test(SpeechGrammar value)) {
-    return new SkipWhileIterable<SpeechGrammar>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   SpeechGrammar firstMatching(bool test(SpeechGrammar value), { SpeechGrammar orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   SpeechGrammar lastMatching(bool test(SpeechGrammar value), {SpeechGrammar orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   SpeechGrammar singleMatching(bool test(SpeechGrammar value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   SpeechGrammar elementAt(int index) {
@@ -21286,16 +21211,36 @@
     throw new StateError("More than one element");
   }
 
-  SpeechGrammar min([int compare(SpeechGrammar a, SpeechGrammar b)]) => Collections.min(this, compare);
+  SpeechGrammar min([int compare(SpeechGrammar a, SpeechGrammar b)]) => IterableMixinWorkaround.min(this, compare);
 
-  SpeechGrammar max([int compare(SpeechGrammar a, SpeechGrammar b)]) => Collections.max(this, compare);
+  SpeechGrammar max([int compare(SpeechGrammar a, SpeechGrammar b)]) => IterableMixinWorkaround.max(this, compare);
 
   SpeechGrammar removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   SpeechGrammar removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(SpeechGrammar element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(SpeechGrammar element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<SpeechGrammar> from, [int startFrom]) {
@@ -21315,7 +21260,7 @@
 
   // -- end List<SpeechGrammar> mixins.
 
-  void addFromString(/*DOMString*/ string, [/*float*/ weight]) {
+  void addFromString(String string, [num weight]) {
     if (?weight) {
       _addFromString_1(string, weight);
       return;
@@ -21323,15 +21268,15 @@
     _addFromString_2(string);
   }
 
-
-  /** @domName SpeechGrammarList.addFromString_1 */
+  @DocsEditable
+  @DomName('SpeechGrammarList.addFromString_1')
   void _addFromString_1(string, weight) native "SpeechGrammarList_addFromString_1_Callback";
 
-
-  /** @domName SpeechGrammarList.addFromString_2 */
+  @DocsEditable
+  @DomName('SpeechGrammarList.addFromString_2')
   void _addFromString_2(string) native "SpeechGrammarList_addFromString_2_Callback";
 
-  void addFromUri(/*DOMString*/ src, [/*float*/ weight]) {
+  void addFromUri(String src, [num weight]) {
     if (?weight) {
       _addFromUri_1(src, weight);
       return;
@@ -21339,16 +21284,16 @@
     _addFromUri_2(src);
   }
 
-
-  /** @domName SpeechGrammarList.addFromUri_1 */
+  @DocsEditable
+  @DomName('SpeechGrammarList.addFromUri_1')
   void _addFromUri_1(src, weight) native "SpeechGrammarList_addFromUri_1_Callback";
 
-
-  /** @domName SpeechGrammarList.addFromUri_2 */
+  @DocsEditable
+  @DomName('SpeechGrammarList.addFromUri_2')
   void _addFromUri_2(src) native "SpeechGrammarList_addFromUri_2_Callback";
 
-
-  /** @domName SpeechGrammarList.item */
+  @DocsEditable
+  @DomName('SpeechGrammarList.item')
   SpeechGrammar item(int index) native "SpeechGrammarList_item_Callback";
 
 }
@@ -21359,12 +21304,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SpeechInputEvent
+@DocsEditable
+@DomName('SpeechInputEvent')
 class SpeechInputEvent extends Event {
   SpeechInputEvent.internal() : super.internal();
 
-
-  /** @domName SpeechInputEvent.results */
+  @DocsEditable
+  @DomName('SpeechInputEvent.results')
   List<SpeechInputResult> get results native "SpeechInputEvent_results_Getter";
 
 }
@@ -21375,16 +21321,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SpeechInputResult
+@DocsEditable
+@DomName('SpeechInputResult')
 class SpeechInputResult extends NativeFieldWrapperClass1 {
   SpeechInputResult.internal();
 
-
-  /** @domName SpeechInputResult.confidence */
+  @DocsEditable
+  @DomName('SpeechInputResult.confidence')
   num get confidence native "SpeechInputResult_confidence_Getter";
 
-
-  /** @domName SpeechInputResult.utterance */
+  @DocsEditable
+  @DomName('SpeechInputResult.utterance')
   String get utterance native "SpeechInputResult_utterance_Getter";
 
 }
@@ -21395,7 +21342,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SpeechRecognition
+@DocsEditable
+@DomName('SpeechRecognition')
 class SpeechRecognition extends EventTarget {
   SpeechRecognition.internal() : super.internal();
 
@@ -21421,76 +21369,77 @@
 
   static const EventStreamProvider<Event> startEvent = const EventStreamProvider<Event>('start');
 
-  ///@docsEditable true
+  @DocsEditable
   factory SpeechRecognition() => SpeechRecognition._create();
   static SpeechRecognition _create() native "SpeechRecognition_constructor_Callback";
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   SpeechRecognitionEvents get on =>
     new SpeechRecognitionEvents(this);
 
-
-  /** @domName SpeechRecognition.continuous */
+  @DocsEditable
+  @DomName('SpeechRecognition.continuous')
   bool get continuous native "SpeechRecognition_continuous_Getter";
 
-
-  /** @domName SpeechRecognition.continuous */
+  @DocsEditable
+  @DomName('SpeechRecognition.continuous')
   void set continuous(bool value) native "SpeechRecognition_continuous_Setter";
 
-
-  /** @domName SpeechRecognition.grammars */
+  @DocsEditable
+  @DomName('SpeechRecognition.grammars')
   SpeechGrammarList get grammars native "SpeechRecognition_grammars_Getter";
 
-
-  /** @domName SpeechRecognition.grammars */
+  @DocsEditable
+  @DomName('SpeechRecognition.grammars')
   void set grammars(SpeechGrammarList value) native "SpeechRecognition_grammars_Setter";
 
-
-  /** @domName SpeechRecognition.interimResults */
+  @DocsEditable
+  @DomName('SpeechRecognition.interimResults')
   bool get interimResults native "SpeechRecognition_interimResults_Getter";
 
-
-  /** @domName SpeechRecognition.interimResults */
+  @DocsEditable
+  @DomName('SpeechRecognition.interimResults')
   void set interimResults(bool value) native "SpeechRecognition_interimResults_Setter";
 
-
-  /** @domName SpeechRecognition.lang */
+  @DocsEditable
+  @DomName('SpeechRecognition.lang')
   String get lang native "SpeechRecognition_lang_Getter";
 
-
-  /** @domName SpeechRecognition.lang */
+  @DocsEditable
+  @DomName('SpeechRecognition.lang')
   void set lang(String value) native "SpeechRecognition_lang_Setter";
 
-
-  /** @domName SpeechRecognition.maxAlternatives */
+  @DocsEditable
+  @DomName('SpeechRecognition.maxAlternatives')
   int get maxAlternatives native "SpeechRecognition_maxAlternatives_Getter";
 
-
-  /** @domName SpeechRecognition.maxAlternatives */
+  @DocsEditable
+  @DomName('SpeechRecognition.maxAlternatives')
   void set maxAlternatives(int value) native "SpeechRecognition_maxAlternatives_Setter";
 
-
-  /** @domName SpeechRecognition.abort */
+  @DocsEditable
+  @DomName('SpeechRecognition.abort')
   void abort() native "SpeechRecognition_abort_Callback";
 
-
-  /** @domName SpeechRecognition.addEventListener */
+  @DocsEditable
+  @DomName('SpeechRecognition.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_addEventListener_Callback";
 
-
-  /** @domName SpeechRecognition.dispatchEvent */
+  @DocsEditable
+  @DomName('SpeechRecognition.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "SpeechRecognition_dispatchEvent_Callback";
 
-
-  /** @domName SpeechRecognition.removeEventListener */
+  @DocsEditable
+  @DomName('SpeechRecognition.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_removeEventListener_Callback";
 
-
-  /** @domName SpeechRecognition.start */
+  @DocsEditable
+  @DomName('SpeechRecognition.start')
   void start() native "SpeechRecognition_start_Callback";
 
-
-  /** @domName SpeechRecognition.stop */
+  @DocsEditable
+  @DomName('SpeechRecognition.stop')
   void stop() native "SpeechRecognition_stop_Callback";
 
   Stream<Event> get onAudioEnd => audioEndEvent.forTarget(this);
@@ -21517,42 +21466,42 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class SpeechRecognitionEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   SpeechRecognitionEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get audioEnd => this['audioend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get audioStart => this['audiostart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get end => this['end'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get noMatch => this['nomatch'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get result => this['result'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get soundEnd => this['soundend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get soundStart => this['soundstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get speechEnd => this['speechend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get speechStart => this['speechstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get start => this['start'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21562,16 +21511,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SpeechRecognitionAlternative
+@DocsEditable
+@DomName('SpeechRecognitionAlternative')
 class SpeechRecognitionAlternative extends NativeFieldWrapperClass1 {
   SpeechRecognitionAlternative.internal();
 
-
-  /** @domName SpeechRecognitionAlternative.confidence */
+  @DocsEditable
+  @DomName('SpeechRecognitionAlternative.confidence')
   num get confidence native "SpeechRecognitionAlternative_confidence_Getter";
 
-
-  /** @domName SpeechRecognitionAlternative.transcript */
+  @DocsEditable
+  @DomName('SpeechRecognitionAlternative.transcript')
   String get transcript native "SpeechRecognitionAlternative_transcript_Getter";
 
 }
@@ -21582,16 +21532,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SpeechRecognitionError
+@DocsEditable
+@DomName('SpeechRecognitionError')
 class SpeechRecognitionError extends Event {
   SpeechRecognitionError.internal() : super.internal();
 
-
-  /** @domName SpeechRecognitionError.error */
+  @DocsEditable
+  @DomName('SpeechRecognitionError.error')
   String get error native "SpeechRecognitionError_error_Getter";
 
-
-  /** @domName SpeechRecognitionError.message */
+  @DocsEditable
+  @DomName('SpeechRecognitionError.message')
   String get message native "SpeechRecognitionError_message_Getter";
 
 }
@@ -21602,24 +21553,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SpeechRecognitionEvent
+@DocsEditable
+@DomName('SpeechRecognitionEvent')
 class SpeechRecognitionEvent extends Event {
   SpeechRecognitionEvent.internal() : super.internal();
 
-
-  /** @domName SpeechRecognitionEvent.result */
+  @DocsEditable
+  @DomName('SpeechRecognitionEvent.result')
   SpeechRecognitionResult get result native "SpeechRecognitionEvent_result_Getter";
 
-
-  /** @domName SpeechRecognitionEvent.resultHistory */
+  @DocsEditable
+  @DomName('SpeechRecognitionEvent.resultHistory')
   List<SpeechRecognitionResult> get resultHistory native "SpeechRecognitionEvent_resultHistory_Getter";
 
-
-  /** @domName SpeechRecognitionEvent.resultIndex */
+  @DocsEditable
+  @DomName('SpeechRecognitionEvent.resultIndex')
   int get resultIndex native "SpeechRecognitionEvent_resultIndex_Getter";
 
-
-  /** @domName SpeechRecognitionEvent.results */
+  @DocsEditable
+  @DomName('SpeechRecognitionEvent.results')
   List<SpeechRecognitionResult> get results native "SpeechRecognitionEvent_results_Getter";
 
 }
@@ -21630,20 +21582,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SpeechRecognitionResult
+@DocsEditable
+@DomName('SpeechRecognitionResult')
 class SpeechRecognitionResult extends NativeFieldWrapperClass1 {
   SpeechRecognitionResult.internal();
 
-
-  /** @domName SpeechRecognitionResult.isFinal */
+  @DocsEditable
+  @DomName('SpeechRecognitionResult.isFinal')
   bool get isFinal native "SpeechRecognitionResult_isFinal_Getter";
 
-
-  /** @domName SpeechRecognitionResult.length */
+  @DocsEditable
+  @DomName('SpeechRecognitionResult.length')
   int get length native "SpeechRecognitionResult_length_Getter";
 
-
-  /** @domName SpeechRecognitionResult.item */
+  @DocsEditable
+  @DomName('SpeechRecognitionResult.item')
   SpeechRecognitionAlternative item(int index) native "SpeechRecognitionResult_item_Callback";
 
 }
@@ -21654,7 +21607,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SQLError
+@DocsEditable
+@DomName('SQLError')
 class SqlError extends NativeFieldWrapperClass1 {
   SqlError.internal();
 
@@ -21674,12 +21628,12 @@
 
   static const int VERSION_ERR = 2;
 
-
-  /** @domName SQLError.code */
+  @DocsEditable
+  @DomName('SQLError.code')
   int get code native "SQLError_code_Getter";
 
-
-  /** @domName SQLError.message */
+  @DocsEditable
+  @DomName('SQLError.message')
   String get message native "SQLError_message_Getter";
 
 }
@@ -21690,7 +21644,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SQLException
+@DocsEditable
+@DomName('SQLException')
 class SqlException extends NativeFieldWrapperClass1 {
   SqlException.internal();
 
@@ -21710,12 +21665,12 @@
 
   static const int VERSION_ERR = 2;
 
-
-  /** @domName SQLException.code */
+  @DocsEditable
+  @DomName('SQLException.code')
   int get code native "SQLException_code_Getter";
 
-
-  /** @domName SQLException.message */
+  @DocsEditable
+  @DomName('SQLException.message')
   String get message native "SQLException_message_Getter";
 
 }
@@ -21726,20 +21681,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SQLResultSet
+@DocsEditable
+@DomName('SQLResultSet')
 class SqlResultSet extends NativeFieldWrapperClass1 {
   SqlResultSet.internal();
 
-
-  /** @domName SQLResultSet.insertId */
+  @DocsEditable
+  @DomName('SQLResultSet.insertId')
   int get insertId native "SQLResultSet_insertId_Getter";
 
-
-  /** @domName SQLResultSet.rows */
+  @DocsEditable
+  @DomName('SQLResultSet.rows')
   SqlResultSetRowList get rows native "SQLResultSet_rows_Getter";
 
-
-  /** @domName SQLResultSet.rowsAffected */
+  @DocsEditable
+  @DomName('SQLResultSet.rowsAffected')
   int get rowsAffected native "SQLResultSet_rowsAffected_Getter";
 
 }
@@ -21750,12 +21706,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SQLResultSetRowList
+@DocsEditable
+@DomName('SQLResultSetRowList')
 class SqlResultSetRowList extends NativeFieldWrapperClass1 implements List<Map> {
   SqlResultSetRowList.internal();
 
-
-  /** @domName SQLResultSetRowList.length */
+  @DocsEditable
+  @DomName('SQLResultSetRowList.length')
   int get length native "SQLResultSetRowList_length_Getter";
 
   Map operator[](int index) native "SQLResultSetRowList_item_Callback";
@@ -21776,50 +21733,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Map)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Map element) => Collections.contains(this, element);
+  bool contains(Map element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Map element)) => Collections.forEach(this, f);
+  void forEach(void f(Map element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Map element)) => new MappedList<Map, dynamic>(this, f);
+  List mappedBy(f(Map element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Map> where(bool f(Map element)) => new WhereIterable<Map>(this, f);
+  Iterable<Map> where(bool f(Map element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Map element)) => Collections.every(this, f);
+  bool every(bool f(Map element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Map element)) => Collections.any(this, f);
+  bool any(bool f(Map element)) => IterableMixinWorkaround.any(this, f);
 
   List<Map> toList() => new List<Map>.from(this);
   Set<Map> toSet() => new Set<Map>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Map> take(int n) => new ListView<Map>(this, 0, n);
+  List<Map> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Map> takeWhile(bool test(Map value)) {
-    return new TakeWhileIterable<Map>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Map> skip(int n) => new ListView<Map>(this, n, null);
+  List<Map> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Map> skipWhile(bool test(Map value)) {
-    return new SkipWhileIterable<Map>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Map firstMatching(bool test(Map value), { Map orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Map lastMatching(bool test(Map value), {Map orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Map singleMatching(bool test(Map value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Map elementAt(int index) {
@@ -21877,16 +21834,36 @@
     throw new StateError("More than one element");
   }
 
-  Map min([int compare(Map a, Map b)]) => Collections.min(this, compare);
+  Map min([int compare(Map a, Map b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Map max([int compare(Map a, Map b)]) => Collections.max(this, compare);
+  Map max([int compare(Map a, Map b)]) => IterableMixinWorkaround.max(this, compare);
 
   Map removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Map removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Map element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Map element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Map> from, [int startFrom]) {
@@ -21906,8 +21883,8 @@
 
   // -- end List<Map> mixins.
 
-
-  /** @domName SQLResultSetRowList.item */
+  @DocsEditable
+  @DomName('SQLResultSetRowList.item')
   Map item(int index) native "SQLResultSetRowList_item_Callback";
 
 }
@@ -21918,12 +21895,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SQLTransaction
+@DocsEditable
+@DomName('SQLTransaction')
 class SqlTransaction extends NativeFieldWrapperClass1 {
   SqlTransaction.internal();
 
-
-  /** @domName SQLTransaction.executeSql */
+  @DocsEditable
+  @DomName('SQLTransaction.executeSql')
   void executeSql(String sqlStatement, List arguments, [SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) native "SQLTransaction_executeSql_Callback";
 
 }
@@ -21934,12 +21912,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SQLTransactionSync
+@DocsEditable
+@DomName('SQLTransactionSync')
 class SqlTransactionSync extends NativeFieldWrapperClass1 {
   SqlTransactionSync.internal();
 
-
-  /** @domName SQLTransactionSync.executeSql */
+  @DocsEditable
+  @DomName('SQLTransactionSync.executeSql')
   SqlResultSet executeSql(String sqlStatement, List arguments) native "SQLTransactionSync_executeSql_Callback";
 
 }
@@ -21948,7 +21927,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Storage
+@DocsEditable
+@DomName('Storage')
 class Storage extends NativeFieldWrapperClass1 implements Map<String, String>  {
 
   // TODO(nweiz): update this when maps support lazy iteration
@@ -21999,28 +21979,28 @@
   bool get isEmpty => $dom_key(0) == null;
   Storage.internal();
 
-
-  /** @domName Storage.length */
+  @DocsEditable
+  @DomName('Storage.length')
   int get $dom_length native "Storage_length_Getter";
 
-
-  /** @domName Storage.clear */
+  @DocsEditable
+  @DomName('Storage.clear')
   void $dom_clear() native "Storage_clear_Callback";
 
-
-  /** @domName Storage.getItem */
+  @DocsEditable
+  @DomName('Storage.getItem')
   String $dom_getItem(String key) native "Storage_getItem_Callback";
 
-
-  /** @domName Storage.key */
+  @DocsEditable
+  @DomName('Storage.key')
   String $dom_key(int index) native "Storage_key_Callback";
 
-
-  /** @domName Storage.removeItem */
+  @DocsEditable
+  @DomName('Storage.removeItem')
   void $dom_removeItem(String key) native "Storage_removeItem_Callback";
 
-
-  /** @domName Storage.setItem */
+  @DocsEditable
+  @DomName('Storage.setItem')
   void $dom_setItem(String key, String data) native "Storage_setItem_Callback";
 
 }
@@ -22031,32 +22011,33 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName StorageEvent
+@DocsEditable
+@DomName('StorageEvent')
 class StorageEvent extends Event {
   StorageEvent.internal() : super.internal();
 
-
-  /** @domName StorageEvent.key */
+  @DocsEditable
+  @DomName('StorageEvent.key')
   String get key native "StorageEvent_key_Getter";
 
-
-  /** @domName StorageEvent.newValue */
+  @DocsEditable
+  @DomName('StorageEvent.newValue')
   String get newValue native "StorageEvent_newValue_Getter";
 
-
-  /** @domName StorageEvent.oldValue */
+  @DocsEditable
+  @DomName('StorageEvent.oldValue')
   String get oldValue native "StorageEvent_oldValue_Getter";
 
-
-  /** @domName StorageEvent.storageArea */
+  @DocsEditable
+  @DomName('StorageEvent.storageArea')
   Storage get storageArea native "StorageEvent_storageArea_Getter";
 
-
-  /** @domName StorageEvent.url */
+  @DocsEditable
+  @DomName('StorageEvent.url')
   String get url native "StorageEvent_url_Getter";
 
-
-  /** @domName StorageEvent.initStorageEvent */
+  @DocsEditable
+  @DomName('StorageEvent.initStorageEvent')
   void initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) native "StorageEvent_initStorageEvent_Callback";
 
 }
@@ -22067,7 +22048,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName StorageInfo
+@DocsEditable
+@DomName('StorageInfo')
 class StorageInfo extends NativeFieldWrapperClass1 {
   StorageInfo.internal();
 
@@ -22075,12 +22057,12 @@
 
   static const int TEMPORARY = 0;
 
-
-  /** @domName StorageInfo.queryUsageAndQuota */
+  @DocsEditable
+  @DomName('StorageInfo.queryUsageAndQuota')
   void queryUsageAndQuota(int storageType, [StorageInfoUsageCallback usageCallback, StorageInfoErrorCallback errorCallback]) native "StorageInfo_queryUsageAndQuota_Callback";
 
-
-  /** @domName StorageInfo.requestQuota */
+  @DocsEditable
+  @DomName('StorageInfo.requestQuota')
   void requestQuota(int storageType, int newQuotaInBytes, [StorageInfoQuotaCallback quotaCallback, StorageInfoErrorCallback errorCallback]) native "StorageInfo_requestQuota_Callback";
 
 }
@@ -22123,47 +22105,48 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLStyleElement
+@DocsEditable
+@DomName('HTMLStyleElement')
 class StyleElement extends _Element_Merged {
   StyleElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory StyleElement() => document.$dom_createElement("style");
 
-
-  /** @domName HTMLStyleElement.disabled */
+  @DocsEditable
+  @DomName('HTMLStyleElement.disabled')
   bool get disabled native "HTMLStyleElement_disabled_Getter";
 
-
-  /** @domName HTMLStyleElement.disabled */
+  @DocsEditable
+  @DomName('HTMLStyleElement.disabled')
   void set disabled(bool value) native "HTMLStyleElement_disabled_Setter";
 
-
-  /** @domName HTMLStyleElement.media */
+  @DocsEditable
+  @DomName('HTMLStyleElement.media')
   String get media native "HTMLStyleElement_media_Getter";
 
-
-  /** @domName HTMLStyleElement.media */
+  @DocsEditable
+  @DomName('HTMLStyleElement.media')
   void set media(String value) native "HTMLStyleElement_media_Setter";
 
-
-  /** @domName HTMLStyleElement.scoped */
+  @DocsEditable
+  @DomName('HTMLStyleElement.scoped')
   bool get scoped native "HTMLStyleElement_scoped_Getter";
 
-
-  /** @domName HTMLStyleElement.scoped */
+  @DocsEditable
+  @DomName('HTMLStyleElement.scoped')
   void set scoped(bool value) native "HTMLStyleElement_scoped_Setter";
 
-
-  /** @domName HTMLStyleElement.sheet */
+  @DocsEditable
+  @DomName('HTMLStyleElement.sheet')
   StyleSheet get sheet native "HTMLStyleElement_sheet_Getter";
 
-
-  /** @domName HTMLStyleElement.type */
+  @DocsEditable
+  @DomName('HTMLStyleElement.type')
   String get type native "HTMLStyleElement_type_Getter";
 
-
-  /** @domName HTMLStyleElement.type */
+  @DocsEditable
+  @DomName('HTMLStyleElement.type')
   void set type(String value) native "HTMLStyleElement_type_Setter";
 
 }
@@ -22174,16 +22157,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName StyleMedia
+@DocsEditable
+@DomName('StyleMedia')
 class StyleMedia extends NativeFieldWrapperClass1 {
   StyleMedia.internal();
 
-
-  /** @domName StyleMedia.type */
+  @DocsEditable
+  @DomName('StyleMedia.type')
   String get type native "StyleMedia_type_Getter";
 
-
-  /** @domName StyleMedia.matchMedium */
+  @DocsEditable
+  @DomName('StyleMedia.matchMedium')
   bool matchMedium(String mediaquery) native "StyleMedia_matchMedium_Callback";
 
 }
@@ -22194,40 +22178,41 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName StyleSheet
+@DocsEditable
+@DomName('StyleSheet')
 class StyleSheet extends NativeFieldWrapperClass1 {
   StyleSheet.internal();
 
-
-  /** @domName StyleSheet.disabled */
+  @DocsEditable
+  @DomName('StyleSheet.disabled')
   bool get disabled native "StyleSheet_disabled_Getter";
 
-
-  /** @domName StyleSheet.disabled */
+  @DocsEditable
+  @DomName('StyleSheet.disabled')
   void set disabled(bool value) native "StyleSheet_disabled_Setter";
 
-
-  /** @domName StyleSheet.href */
+  @DocsEditable
+  @DomName('StyleSheet.href')
   String get href native "StyleSheet_href_Getter";
 
-
-  /** @domName StyleSheet.media */
+  @DocsEditable
+  @DomName('StyleSheet.media')
   MediaList get media native "StyleSheet_media_Getter";
 
-
-  /** @domName StyleSheet.ownerNode */
+  @DocsEditable
+  @DomName('StyleSheet.ownerNode')
   Node get ownerNode native "StyleSheet_ownerNode_Getter";
 
-
-  /** @domName StyleSheet.parentStyleSheet */
+  @DocsEditable
+  @DomName('StyleSheet.parentStyleSheet')
   StyleSheet get parentStyleSheet native "StyleSheet_parentStyleSheet_Getter";
 
-
-  /** @domName StyleSheet.title */
+  @DocsEditable
+  @DomName('StyleSheet.title')
   String get title native "StyleSheet_title_Getter";
 
-
-  /** @domName StyleSheet.type */
+  @DocsEditable
+  @DomName('StyleSheet.type')
   String get type native "StyleSheet_type_Getter";
 
 }
@@ -22238,11 +22223,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLTableCaptionElement
+@DocsEditable
+@DomName('HTMLTableCaptionElement')
 class TableCaptionElement extends _Element_Merged {
   TableCaptionElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory TableCaptionElement() => document.$dom_createElement("caption");
 
 }
@@ -22253,39 +22239,40 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLTableCellElement
+@DocsEditable
+@DomName('HTMLTableCellElement')
 class TableCellElement extends _Element_Merged {
   TableCellElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory TableCellElement() => document.$dom_createElement("td");
 
-
-  /** @domName HTMLTableCellElement.cellIndex */
+  @DocsEditable
+  @DomName('HTMLTableCellElement.cellIndex')
   int get cellIndex native "HTMLTableCellElement_cellIndex_Getter";
 
-
-  /** @domName HTMLTableCellElement.colSpan */
+  @DocsEditable
+  @DomName('HTMLTableCellElement.colSpan')
   int get colSpan native "HTMLTableCellElement_colSpan_Getter";
 
-
-  /** @domName HTMLTableCellElement.colSpan */
+  @DocsEditable
+  @DomName('HTMLTableCellElement.colSpan')
   void set colSpan(int value) native "HTMLTableCellElement_colSpan_Setter";
 
-
-  /** @domName HTMLTableCellElement.headers */
+  @DocsEditable
+  @DomName('HTMLTableCellElement.headers')
   String get headers native "HTMLTableCellElement_headers_Getter";
 
-
-  /** @domName HTMLTableCellElement.headers */
+  @DocsEditable
+  @DomName('HTMLTableCellElement.headers')
   void set headers(String value) native "HTMLTableCellElement_headers_Setter";
 
-
-  /** @domName HTMLTableCellElement.rowSpan */
+  @DocsEditable
+  @DomName('HTMLTableCellElement.rowSpan')
   int get rowSpan native "HTMLTableCellElement_rowSpan_Getter";
 
-
-  /** @domName HTMLTableCellElement.rowSpan */
+  @DocsEditable
+  @DomName('HTMLTableCellElement.rowSpan')
   void set rowSpan(int value) native "HTMLTableCellElement_rowSpan_Setter";
 
 }
@@ -22296,19 +22283,20 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLTableColElement
+@DocsEditable
+@DomName('HTMLTableColElement')
 class TableColElement extends _Element_Merged {
   TableColElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory TableColElement() => document.$dom_createElement("col");
 
-
-  /** @domName HTMLTableColElement.span */
+  @DocsEditable
+  @DomName('HTMLTableColElement.span')
   int get span native "HTMLTableColElement_span_Getter";
 
-
-  /** @domName HTMLTableColElement.span */
+  @DocsEditable
+  @DomName('HTMLTableColElement.span')
   void set span(int value) native "HTMLTableColElement_span_Setter";
 
 }
@@ -22319,87 +22307,88 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLTableElement
+@DocsEditable
+@DomName('HTMLTableElement')
 class TableElement extends _Element_Merged {
   TableElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory TableElement() => document.$dom_createElement("table");
 
-
-  /** @domName HTMLTableElement.border */
+  @DocsEditable
+  @DomName('HTMLTableElement.border')
   String get border native "HTMLTableElement_border_Getter";
 
-
-  /** @domName HTMLTableElement.border */
+  @DocsEditable
+  @DomName('HTMLTableElement.border')
   void set border(String value) native "HTMLTableElement_border_Setter";
 
-
-  /** @domName HTMLTableElement.caption */
+  @DocsEditable
+  @DomName('HTMLTableElement.caption')
   TableCaptionElement get caption native "HTMLTableElement_caption_Getter";
 
-
-  /** @domName HTMLTableElement.caption */
+  @DocsEditable
+  @DomName('HTMLTableElement.caption')
   void set caption(TableCaptionElement value) native "HTMLTableElement_caption_Setter";
 
-
-  /** @domName HTMLTableElement.rows */
+  @DocsEditable
+  @DomName('HTMLTableElement.rows')
   HtmlCollection get rows native "HTMLTableElement_rows_Getter";
 
-
-  /** @domName HTMLTableElement.tBodies */
+  @DocsEditable
+  @DomName('HTMLTableElement.tBodies')
   HtmlCollection get tBodies native "HTMLTableElement_tBodies_Getter";
 
-
-  /** @domName HTMLTableElement.tFoot */
+  @DocsEditable
+  @DomName('HTMLTableElement.tFoot')
   TableSectionElement get tFoot native "HTMLTableElement_tFoot_Getter";
 
-
-  /** @domName HTMLTableElement.tFoot */
+  @DocsEditable
+  @DomName('HTMLTableElement.tFoot')
   void set tFoot(TableSectionElement value) native "HTMLTableElement_tFoot_Setter";
 
-
-  /** @domName HTMLTableElement.tHead */
+  @DocsEditable
+  @DomName('HTMLTableElement.tHead')
   TableSectionElement get tHead native "HTMLTableElement_tHead_Getter";
 
-
-  /** @domName HTMLTableElement.tHead */
+  @DocsEditable
+  @DomName('HTMLTableElement.tHead')
   void set tHead(TableSectionElement value) native "HTMLTableElement_tHead_Setter";
 
-
-  /** @domName HTMLTableElement.createCaption */
+  @DocsEditable
+  @DomName('HTMLTableElement.createCaption')
   Element createCaption() native "HTMLTableElement_createCaption_Callback";
 
-
-  /** @domName HTMLTableElement.createTBody */
+  @DocsEditable
+  @DomName('HTMLTableElement.createTBody')
   Element createTBody() native "HTMLTableElement_createTBody_Callback";
 
-
-  /** @domName HTMLTableElement.createTFoot */
+  @DocsEditable
+  @DomName('HTMLTableElement.createTFoot')
   Element createTFoot() native "HTMLTableElement_createTFoot_Callback";
 
-
-  /** @domName HTMLTableElement.createTHead */
+  @DocsEditable
+  @DomName('HTMLTableElement.createTHead')
   Element createTHead() native "HTMLTableElement_createTHead_Callback";
 
-
-  /** @domName HTMLTableElement.deleteCaption */
+  @DocsEditable
+  @DomName('HTMLTableElement.deleteCaption')
   void deleteCaption() native "HTMLTableElement_deleteCaption_Callback";
 
-
-  /** @domName HTMLTableElement.deleteRow */
+  @DocsEditable
+  @DomName('HTMLTableElement.deleteRow')
   void deleteRow(int index) native "HTMLTableElement_deleteRow_Callback";
 
-
-  /** @domName HTMLTableElement.deleteTFoot */
+  @DocsEditable
+  @DomName('HTMLTableElement.deleteTFoot')
   void deleteTFoot() native "HTMLTableElement_deleteTFoot_Callback";
 
-
-  /** @domName HTMLTableElement.deleteTHead */
+  @DocsEditable
+  @DomName('HTMLTableElement.deleteTHead')
   void deleteTHead() native "HTMLTableElement_deleteTHead_Callback";
 
-
-  /** @domName HTMLTableElement.insertRow */
+  @DocsEditable
+  @DomName('HTMLTableElement.insertRow')
   Element insertRow(int index) native "HTMLTableElement_insertRow_Callback";
 
 }
@@ -22410,31 +22399,32 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLTableRowElement
+@DocsEditable
+@DomName('HTMLTableRowElement')
 class TableRowElement extends _Element_Merged {
   TableRowElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory TableRowElement() => document.$dom_createElement("tr");
 
-
-  /** @domName HTMLTableRowElement.cells */
+  @DocsEditable
+  @DomName('HTMLTableRowElement.cells')
   HtmlCollection get cells native "HTMLTableRowElement_cells_Getter";
 
-
-  /** @domName HTMLTableRowElement.rowIndex */
+  @DocsEditable
+  @DomName('HTMLTableRowElement.rowIndex')
   int get rowIndex native "HTMLTableRowElement_rowIndex_Getter";
 
-
-  /** @domName HTMLTableRowElement.sectionRowIndex */
+  @DocsEditable
+  @DomName('HTMLTableRowElement.sectionRowIndex')
   int get sectionRowIndex native "HTMLTableRowElement_sectionRowIndex_Getter";
 
-
-  /** @domName HTMLTableRowElement.deleteCell */
+  @DocsEditable
+  @DomName('HTMLTableRowElement.deleteCell')
   void deleteCell(int index) native "HTMLTableRowElement_deleteCell_Callback";
 
-
-  /** @domName HTMLTableRowElement.insertCell */
+  @DocsEditable
+  @DomName('HTMLTableRowElement.insertCell')
   Element insertCell(int index) native "HTMLTableRowElement_insertCell_Callback";
 
 }
@@ -22445,28 +22435,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLTableSectionElement
+@DocsEditable
+@DomName('HTMLTableSectionElement')
 class TableSectionElement extends _Element_Merged {
   TableSectionElement.internal() : super.internal();
 
-
-  /** @domName HTMLTableSectionElement.chOff */
-  String get chOff native "HTMLTableSectionElement_chOff_Getter";
-
-
-  /** @domName HTMLTableSectionElement.chOff */
-  void set chOff(String value) native "HTMLTableSectionElement_chOff_Setter";
-
-
-  /** @domName HTMLTableSectionElement.rows */
+  @DocsEditable
+  @DomName('HTMLTableSectionElement.rows')
   HtmlCollection get rows native "HTMLTableSectionElement_rows_Getter";
 
-
-  /** @domName HTMLTableSectionElement.deleteRow */
+  @DocsEditable
+  @DomName('HTMLTableSectionElement.deleteRow')
   void deleteRow(int index) native "HTMLTableSectionElement_deleteRow_Callback";
 
-
-  /** @domName HTMLTableSectionElement.insertRow */
+  @DocsEditable
+  @DomName('HTMLTableSectionElement.insertRow')
   Element insertRow(int index) native "HTMLTableSectionElement_insertRow_Callback";
 
 }
@@ -22477,21 +22460,22 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Text
+@DocsEditable
+@DomName('Text')
 class Text extends CharacterData {
   factory Text(String data) => _TextFactoryProvider.createText(data);
   Text.internal() : super.internal();
 
-
-  /** @domName Text.wholeText */
+  @DocsEditable
+  @DomName('Text.wholeText')
   String get wholeText native "Text_wholeText_Getter";
 
-
-  /** @domName Text.replaceWholeText */
+  @DocsEditable
+  @DomName('Text.replaceWholeText')
   Text replaceWholeText(String content) native "Text_replaceWholeText_Callback";
 
-
-  /** @domName Text.splitText */
+  @DocsEditable
+  @DomName('Text.splitText')
   Text splitText(int offset) native "Text_splitText_Callback";
 
 }
@@ -22502,182 +22486,183 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLTextAreaElement
+@DocsEditable
+@DomName('HTMLTextAreaElement')
 class TextAreaElement extends _Element_Merged {
   TextAreaElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory TextAreaElement() => document.$dom_createElement("textarea");
 
-
-  /** @domName HTMLTextAreaElement.autofocus */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.autofocus')
   bool get autofocus native "HTMLTextAreaElement_autofocus_Getter";
 
-
-  /** @domName HTMLTextAreaElement.autofocus */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.autofocus')
   void set autofocus(bool value) native "HTMLTextAreaElement_autofocus_Setter";
 
-
-  /** @domName HTMLTextAreaElement.cols */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.cols')
   int get cols native "HTMLTextAreaElement_cols_Getter";
 
-
-  /** @domName HTMLTextAreaElement.cols */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.cols')
   void set cols(int value) native "HTMLTextAreaElement_cols_Setter";
 
-
-  /** @domName HTMLTextAreaElement.defaultValue */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.defaultValue')
   String get defaultValue native "HTMLTextAreaElement_defaultValue_Getter";
 
-
-  /** @domName HTMLTextAreaElement.defaultValue */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.defaultValue')
   void set defaultValue(String value) native "HTMLTextAreaElement_defaultValue_Setter";
 
-
-  /** @domName HTMLTextAreaElement.dirName */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.dirName')
   String get dirName native "HTMLTextAreaElement_dirName_Getter";
 
-
-  /** @domName HTMLTextAreaElement.dirName */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.dirName')
   void set dirName(String value) native "HTMLTextAreaElement_dirName_Setter";
 
-
-  /** @domName HTMLTextAreaElement.disabled */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.disabled')
   bool get disabled native "HTMLTextAreaElement_disabled_Getter";
 
-
-  /** @domName HTMLTextAreaElement.disabled */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.disabled')
   void set disabled(bool value) native "HTMLTextAreaElement_disabled_Setter";
 
-
-  /** @domName HTMLTextAreaElement.form */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.form')
   FormElement get form native "HTMLTextAreaElement_form_Getter";
 
-
-  /** @domName HTMLTextAreaElement.labels */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.labels')
   List<Node> get labels native "HTMLTextAreaElement_labels_Getter";
 
-
-  /** @domName HTMLTextAreaElement.maxLength */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.maxLength')
   int get maxLength native "HTMLTextAreaElement_maxLength_Getter";
 
-
-  /** @domName HTMLTextAreaElement.maxLength */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.maxLength')
   void set maxLength(int value) native "HTMLTextAreaElement_maxLength_Setter";
 
-
-  /** @domName HTMLTextAreaElement.name */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.name')
   String get name native "HTMLTextAreaElement_name_Getter";
 
-
-  /** @domName HTMLTextAreaElement.name */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.name')
   void set name(String value) native "HTMLTextAreaElement_name_Setter";
 
-
-  /** @domName HTMLTextAreaElement.placeholder */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.placeholder')
   String get placeholder native "HTMLTextAreaElement_placeholder_Getter";
 
-
-  /** @domName HTMLTextAreaElement.placeholder */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.placeholder')
   void set placeholder(String value) native "HTMLTextAreaElement_placeholder_Setter";
 
-
-  /** @domName HTMLTextAreaElement.readOnly */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.readOnly')
   bool get readOnly native "HTMLTextAreaElement_readOnly_Getter";
 
-
-  /** @domName HTMLTextAreaElement.readOnly */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.readOnly')
   void set readOnly(bool value) native "HTMLTextAreaElement_readOnly_Setter";
 
-
-  /** @domName HTMLTextAreaElement.required */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.required')
   bool get required native "HTMLTextAreaElement_required_Getter";
 
-
-  /** @domName HTMLTextAreaElement.required */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.required')
   void set required(bool value) native "HTMLTextAreaElement_required_Setter";
 
-
-  /** @domName HTMLTextAreaElement.rows */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.rows')
   int get rows native "HTMLTextAreaElement_rows_Getter";
 
-
-  /** @domName HTMLTextAreaElement.rows */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.rows')
   void set rows(int value) native "HTMLTextAreaElement_rows_Setter";
 
-
-  /** @domName HTMLTextAreaElement.selectionDirection */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.selectionDirection')
   String get selectionDirection native "HTMLTextAreaElement_selectionDirection_Getter";
 
-
-  /** @domName HTMLTextAreaElement.selectionDirection */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.selectionDirection')
   void set selectionDirection(String value) native "HTMLTextAreaElement_selectionDirection_Setter";
 
-
-  /** @domName HTMLTextAreaElement.selectionEnd */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.selectionEnd')
   int get selectionEnd native "HTMLTextAreaElement_selectionEnd_Getter";
 
-
-  /** @domName HTMLTextAreaElement.selectionEnd */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.selectionEnd')
   void set selectionEnd(int value) native "HTMLTextAreaElement_selectionEnd_Setter";
 
-
-  /** @domName HTMLTextAreaElement.selectionStart */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.selectionStart')
   int get selectionStart native "HTMLTextAreaElement_selectionStart_Getter";
 
-
-  /** @domName HTMLTextAreaElement.selectionStart */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.selectionStart')
   void set selectionStart(int value) native "HTMLTextAreaElement_selectionStart_Setter";
 
-
-  /** @domName HTMLTextAreaElement.textLength */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.textLength')
   int get textLength native "HTMLTextAreaElement_textLength_Getter";
 
-
-  /** @domName HTMLTextAreaElement.type */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.type')
   String get type native "HTMLTextAreaElement_type_Getter";
 
-
-  /** @domName HTMLTextAreaElement.validationMessage */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.validationMessage')
   String get validationMessage native "HTMLTextAreaElement_validationMessage_Getter";
 
-
-  /** @domName HTMLTextAreaElement.validity */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.validity')
   ValidityState get validity native "HTMLTextAreaElement_validity_Getter";
 
-
-  /** @domName HTMLTextAreaElement.value */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.value')
   String get value native "HTMLTextAreaElement_value_Getter";
 
-
-  /** @domName HTMLTextAreaElement.value */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.value')
   void set value(String value) native "HTMLTextAreaElement_value_Setter";
 
-
-  /** @domName HTMLTextAreaElement.willValidate */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.willValidate')
   bool get willValidate native "HTMLTextAreaElement_willValidate_Getter";
 
-
-  /** @domName HTMLTextAreaElement.wrap */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.wrap')
   String get wrap native "HTMLTextAreaElement_wrap_Getter";
 
-
-  /** @domName HTMLTextAreaElement.wrap */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.wrap')
   void set wrap(String value) native "HTMLTextAreaElement_wrap_Setter";
 
-
-  /** @domName HTMLTextAreaElement.checkValidity */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.checkValidity')
   bool checkValidity() native "HTMLTextAreaElement_checkValidity_Callback";
 
-
-  /** @domName HTMLTextAreaElement.select */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.select')
   void select() native "HTMLTextAreaElement_select_Callback";
 
-
-  /** @domName HTMLTextAreaElement.setCustomValidity */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.setCustomValidity')
   void setCustomValidity(String error) native "HTMLTextAreaElement_setCustomValidity_Callback";
 
-  void setRangeText(/*DOMString*/ replacement, [/*unsigned long*/ start, /*unsigned long*/ end, /*DOMString*/ selectionMode]) {
+  void setRangeText(String replacement, [int start, int end, String selectionMode]) {
     if ((replacement is String || replacement == null) && !?start && !?end && !?selectionMode) {
       _setRangeText_1(replacement);
       return;
@@ -22689,15 +22674,15 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName HTMLTextAreaElement.setRangeText_1 */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.setRangeText_1')
   void _setRangeText_1(replacement) native "HTMLTextAreaElement_setRangeText_1_Callback";
 
-
-  /** @domName HTMLTextAreaElement.setRangeText_2 */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.setRangeText_2')
   void _setRangeText_2(replacement, start, end, selectionMode) native "HTMLTextAreaElement_setRangeText_2_Callback";
 
-  void setSelectionRange(/*long*/ start, /*long*/ end, [/*DOMString*/ direction]) {
+  void setSelectionRange(int start, int end, [String direction]) {
     if (?direction) {
       _setSelectionRange_1(start, end, direction);
       return;
@@ -22705,12 +22690,12 @@
     _setSelectionRange_2(start, end);
   }
 
-
-  /** @domName HTMLTextAreaElement.setSelectionRange_1 */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.setSelectionRange_1')
   void _setSelectionRange_1(start, end, direction) native "HTMLTextAreaElement_setSelectionRange_1_Callback";
 
-
-  /** @domName HTMLTextAreaElement.setSelectionRange_2 */
+  @DocsEditable
+  @DomName('HTMLTextAreaElement.setSelectionRange_2')
   void _setSelectionRange_2(start, end) native "HTMLTextAreaElement_setSelectionRange_2_Callback";
 
 }
@@ -22721,16 +22706,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName TextEvent
+@DocsEditable
+@DomName('TextEvent')
 class TextEvent extends UIEvent {
   TextEvent.internal() : super.internal();
 
-
-  /** @domName TextEvent.data */
+  @DocsEditable
+  @DomName('TextEvent.data')
   String get data native "TextEvent_data_Getter";
 
-
-  /** @domName TextEvent.initTextEvent */
+  @DocsEditable
+  @DomName('TextEvent.initTextEvent')
   void initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) native "TextEvent_initTextEvent_Callback";
 
 }
@@ -22741,12 +22727,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName TextMetrics
+@DocsEditable
+@DomName('TextMetrics')
 class TextMetrics extends NativeFieldWrapperClass1 {
   TextMetrics.internal();
 
-
-  /** @domName TextMetrics.width */
+  @DocsEditable
+  @DomName('TextMetrics.width')
   num get width native "TextMetrics_width_Getter";
 
 }
@@ -22757,74 +22744,76 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName TextTrack
+@DocsEditable
+@DomName('TextTrack')
 class TextTrack extends EventTarget {
   TextTrack.internal() : super.internal();
 
   static const EventStreamProvider<Event> cueChangeEvent = const EventStreamProvider<Event>('cuechange');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   TextTrackEvents get on =>
     new TextTrackEvents(this);
 
-
-  /** @domName TextTrack.activeCues */
+  @DocsEditable
+  @DomName('TextTrack.activeCues')
   TextTrackCueList get activeCues native "TextTrack_activeCues_Getter";
 
-
-  /** @domName TextTrack.cues */
+  @DocsEditable
+  @DomName('TextTrack.cues')
   TextTrackCueList get cues native "TextTrack_cues_Getter";
 
-
-  /** @domName TextTrack.kind */
+  @DocsEditable
+  @DomName('TextTrack.kind')
   String get kind native "TextTrack_kind_Getter";
 
-
-  /** @domName TextTrack.label */
+  @DocsEditable
+  @DomName('TextTrack.label')
   String get label native "TextTrack_label_Getter";
 
-
-  /** @domName TextTrack.language */
+  @DocsEditable
+  @DomName('TextTrack.language')
   String get language native "TextTrack_language_Getter";
 
-
-  /** @domName TextTrack.mode */
+  @DocsEditable
+  @DomName('TextTrack.mode')
   String get mode native "TextTrack_mode_Getter";
 
-
-  /** @domName TextTrack.mode */
+  @DocsEditable
+  @DomName('TextTrack.mode')
   void set mode(String value) native "TextTrack_mode_Setter";
 
-
-  /** @domName TextTrack.addCue */
+  @DocsEditable
+  @DomName('TextTrack.addCue')
   void addCue(TextTrackCue cue) native "TextTrack_addCue_Callback";
 
-
-  /** @domName TextTrack.addEventListener */
+  @DocsEditable
+  @DomName('TextTrack.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_addEventListener_Callback";
 
-
-  /** @domName TextTrack.dispatchEvent */
+  @DocsEditable
+  @DomName('TextTrack.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "TextTrack_dispatchEvent_Callback";
 
-
-  /** @domName TextTrack.removeCue */
+  @DocsEditable
+  @DomName('TextTrack.removeCue')
   void removeCue(TextTrackCue cue) native "TextTrack_removeCue_Callback";
 
-
-  /** @domName TextTrack.removeEventListener */
+  @DocsEditable
+  @DomName('TextTrack.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_removeEventListener_Callback";
 
   Stream<Event> get onCueChange => cueChangeEvent.forTarget(this);
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class TextTrackEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   TextTrackEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get cueChange => this['cuechange'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22834,7 +22823,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName TextTrackCue
+@DocsEditable
+@DomName('TextTrackCue')
 class TextTrackCue extends EventTarget {
   TextTrackCue.internal() : super.internal();
 
@@ -22842,120 +22832,121 @@
 
   static const EventStreamProvider<Event> exitEvent = const EventStreamProvider<Event>('exit');
 
-  ///@docsEditable true
+  @DocsEditable
   factory TextTrackCue(num startTime, num endTime, String text) => TextTrackCue._create(startTime, endTime, text);
   static TextTrackCue _create(num startTime, num endTime, String text) native "TextTrackCue_constructor_Callback";
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   TextTrackCueEvents get on =>
     new TextTrackCueEvents(this);
 
-
-  /** @domName TextTrackCue.align */
+  @DocsEditable
+  @DomName('TextTrackCue.align')
   String get align native "TextTrackCue_align_Getter";
 
-
-  /** @domName TextTrackCue.align */
+  @DocsEditable
+  @DomName('TextTrackCue.align')
   void set align(String value) native "TextTrackCue_align_Setter";
 
-
-  /** @domName TextTrackCue.endTime */
+  @DocsEditable
+  @DomName('TextTrackCue.endTime')
   num get endTime native "TextTrackCue_endTime_Getter";
 
-
-  /** @domName TextTrackCue.endTime */
+  @DocsEditable
+  @DomName('TextTrackCue.endTime')
   void set endTime(num value) native "TextTrackCue_endTime_Setter";
 
-
-  /** @domName TextTrackCue.id */
+  @DocsEditable
+  @DomName('TextTrackCue.id')
   String get id native "TextTrackCue_id_Getter";
 
-
-  /** @domName TextTrackCue.id */
+  @DocsEditable
+  @DomName('TextTrackCue.id')
   void set id(String value) native "TextTrackCue_id_Setter";
 
-
-  /** @domName TextTrackCue.line */
+  @DocsEditable
+  @DomName('TextTrackCue.line')
   int get line native "TextTrackCue_line_Getter";
 
-
-  /** @domName TextTrackCue.line */
+  @DocsEditable
+  @DomName('TextTrackCue.line')
   void set line(int value) native "TextTrackCue_line_Setter";
 
-
-  /** @domName TextTrackCue.pauseOnExit */
+  @DocsEditable
+  @DomName('TextTrackCue.pauseOnExit')
   bool get pauseOnExit native "TextTrackCue_pauseOnExit_Getter";
 
-
-  /** @domName TextTrackCue.pauseOnExit */
+  @DocsEditable
+  @DomName('TextTrackCue.pauseOnExit')
   void set pauseOnExit(bool value) native "TextTrackCue_pauseOnExit_Setter";
 
-
-  /** @domName TextTrackCue.position */
+  @DocsEditable
+  @DomName('TextTrackCue.position')
   int get position native "TextTrackCue_position_Getter";
 
-
-  /** @domName TextTrackCue.position */
+  @DocsEditable
+  @DomName('TextTrackCue.position')
   void set position(int value) native "TextTrackCue_position_Setter";
 
-
-  /** @domName TextTrackCue.size */
+  @DocsEditable
+  @DomName('TextTrackCue.size')
   int get size native "TextTrackCue_size_Getter";
 
-
-  /** @domName TextTrackCue.size */
+  @DocsEditable
+  @DomName('TextTrackCue.size')
   void set size(int value) native "TextTrackCue_size_Setter";
 
-
-  /** @domName TextTrackCue.snapToLines */
+  @DocsEditable
+  @DomName('TextTrackCue.snapToLines')
   bool get snapToLines native "TextTrackCue_snapToLines_Getter";
 
-
-  /** @domName TextTrackCue.snapToLines */
+  @DocsEditable
+  @DomName('TextTrackCue.snapToLines')
   void set snapToLines(bool value) native "TextTrackCue_snapToLines_Setter";
 
-
-  /** @domName TextTrackCue.startTime */
+  @DocsEditable
+  @DomName('TextTrackCue.startTime')
   num get startTime native "TextTrackCue_startTime_Getter";
 
-
-  /** @domName TextTrackCue.startTime */
+  @DocsEditable
+  @DomName('TextTrackCue.startTime')
   void set startTime(num value) native "TextTrackCue_startTime_Setter";
 
-
-  /** @domName TextTrackCue.text */
+  @DocsEditable
+  @DomName('TextTrackCue.text')
   String get text native "TextTrackCue_text_Getter";
 
-
-  /** @domName TextTrackCue.text */
+  @DocsEditable
+  @DomName('TextTrackCue.text')
   void set text(String value) native "TextTrackCue_text_Setter";
 
-
-  /** @domName TextTrackCue.track */
+  @DocsEditable
+  @DomName('TextTrackCue.track')
   TextTrack get track native "TextTrackCue_track_Getter";
 
-
-  /** @domName TextTrackCue.vertical */
+  @DocsEditable
+  @DomName('TextTrackCue.vertical')
   String get vertical native "TextTrackCue_vertical_Getter";
 
-
-  /** @domName TextTrackCue.vertical */
+  @DocsEditable
+  @DomName('TextTrackCue.vertical')
   void set vertical(String value) native "TextTrackCue_vertical_Setter";
 
-
-  /** @domName TextTrackCue.addEventListener */
+  @DocsEditable
+  @DomName('TextTrackCue.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackCue_addEventListener_Callback";
 
-
-  /** @domName TextTrackCue.dispatchEvent */
+  @DocsEditable
+  @DomName('TextTrackCue.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "TextTrackCue_dispatchEvent_Callback";
 
-
-  /** @domName TextTrackCue.getCueAsHTML */
+  @DocsEditable
+  @DomName('TextTrackCue.getCueAsHTML')
   DocumentFragment getCueAsHtml() native "TextTrackCue_getCueAsHTML_Callback";
 
-
-  /** @domName TextTrackCue.removeEventListener */
+  @DocsEditable
+  @DomName('TextTrackCue.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackCue_removeEventListener_Callback";
 
   Stream<Event> get onEnter => enterEvent.forTarget(this);
@@ -22964,15 +22955,15 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class TextTrackCueEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   TextTrackCueEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get enter => this['enter'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get exit => this['exit'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22982,12 +22973,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName TextTrackCueList
+@DocsEditable
+@DomName('TextTrackCueList')
 class TextTrackCueList extends NativeFieldWrapperClass1 implements List<TextTrackCue> {
   TextTrackCueList.internal();
 
-
-  /** @domName TextTrackCueList.length */
+  @DocsEditable
+  @DomName('TextTrackCueList.length')
   int get length native "TextTrackCueList_length_Getter";
 
   TextTrackCue operator[](int index) native "TextTrackCueList_item_Callback";
@@ -23008,50 +23000,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, TextTrackCue)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(TextTrackCue element) => Collections.contains(this, element);
+  bool contains(TextTrackCue element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(TextTrackCue element)) => Collections.forEach(this, f);
+  void forEach(void f(TextTrackCue element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(TextTrackCue element)) => new MappedList<TextTrackCue, dynamic>(this, f);
+  List mappedBy(f(TextTrackCue element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<TextTrackCue> where(bool f(TextTrackCue element)) => new WhereIterable<TextTrackCue>(this, f);
+  Iterable<TextTrackCue> where(bool f(TextTrackCue element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(TextTrackCue element)) => Collections.every(this, f);
+  bool every(bool f(TextTrackCue element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(TextTrackCue element)) => Collections.any(this, f);
+  bool any(bool f(TextTrackCue element)) => IterableMixinWorkaround.any(this, f);
 
   List<TextTrackCue> toList() => new List<TextTrackCue>.from(this);
   Set<TextTrackCue> toSet() => new Set<TextTrackCue>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<TextTrackCue> take(int n) => new ListView<TextTrackCue>(this, 0, n);
+  List<TextTrackCue> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<TextTrackCue> takeWhile(bool test(TextTrackCue value)) {
-    return new TakeWhileIterable<TextTrackCue>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<TextTrackCue> skip(int n) => new ListView<TextTrackCue>(this, n, null);
+  List<TextTrackCue> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<TextTrackCue> skipWhile(bool test(TextTrackCue value)) {
-    return new SkipWhileIterable<TextTrackCue>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   TextTrackCue firstMatching(bool test(TextTrackCue value), { TextTrackCue orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   TextTrackCue lastMatching(bool test(TextTrackCue value), {TextTrackCue orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   TextTrackCue singleMatching(bool test(TextTrackCue value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   TextTrackCue elementAt(int index) {
@@ -23109,16 +23101,36 @@
     throw new StateError("More than one element");
   }
 
-  TextTrackCue min([int compare(TextTrackCue a, TextTrackCue b)]) => Collections.min(this, compare);
+  TextTrackCue min([int compare(TextTrackCue a, TextTrackCue b)]) => IterableMixinWorkaround.min(this, compare);
 
-  TextTrackCue max([int compare(TextTrackCue a, TextTrackCue b)]) => Collections.max(this, compare);
+  TextTrackCue max([int compare(TextTrackCue a, TextTrackCue b)]) => IterableMixinWorkaround.max(this, compare);
 
   TextTrackCue removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   TextTrackCue removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(TextTrackCue element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(TextTrackCue element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<TextTrackCue> from, [int startFrom]) {
@@ -23138,12 +23150,12 @@
 
   // -- end List<TextTrackCue> mixins.
 
-
-  /** @domName TextTrackCueList.getCueById */
+  @DocsEditable
+  @DomName('TextTrackCueList.getCueById')
   TextTrackCue getCueById(String id) native "TextTrackCueList_getCueById_Callback";
 
-
-  /** @domName TextTrackCueList.item */
+  @DocsEditable
+  @DomName('TextTrackCueList.item')
   TextTrackCue item(int index) native "TextTrackCueList_item_Callback";
 
 }
@@ -23154,18 +23166,20 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName TextTrackList
+@DocsEditable
+@DomName('TextTrackList')
 class TextTrackList extends EventTarget implements List<TextTrack> {
   TextTrackList.internal() : super.internal();
 
   static const EventStreamProvider<TrackEvent> addTrackEvent = const EventStreamProvider<TrackEvent>('addtrack');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   TextTrackListEvents get on =>
     new TextTrackListEvents(this);
 
-
-  /** @domName TextTrackList.length */
+  @DocsEditable
+  @DomName('TextTrackList.length')
   int get length native "TextTrackList_length_Getter";
 
   TextTrack operator[](int index) native "TextTrackList_item_Callback";
@@ -23186,50 +23200,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, TextTrack)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(TextTrack element) => Collections.contains(this, element);
+  bool contains(TextTrack element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(TextTrack element)) => Collections.forEach(this, f);
+  void forEach(void f(TextTrack element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(TextTrack element)) => new MappedList<TextTrack, dynamic>(this, f);
+  List mappedBy(f(TextTrack element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<TextTrack> where(bool f(TextTrack element)) => new WhereIterable<TextTrack>(this, f);
+  Iterable<TextTrack> where(bool f(TextTrack element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(TextTrack element)) => Collections.every(this, f);
+  bool every(bool f(TextTrack element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(TextTrack element)) => Collections.any(this, f);
+  bool any(bool f(TextTrack element)) => IterableMixinWorkaround.any(this, f);
 
   List<TextTrack> toList() => new List<TextTrack>.from(this);
   Set<TextTrack> toSet() => new Set<TextTrack>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<TextTrack> take(int n) => new ListView<TextTrack>(this, 0, n);
+  List<TextTrack> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<TextTrack> takeWhile(bool test(TextTrack value)) {
-    return new TakeWhileIterable<TextTrack>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<TextTrack> skip(int n) => new ListView<TextTrack>(this, n, null);
+  List<TextTrack> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<TextTrack> skipWhile(bool test(TextTrack value)) {
-    return new SkipWhileIterable<TextTrack>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   TextTrack firstMatching(bool test(TextTrack value), { TextTrack orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   TextTrack lastMatching(bool test(TextTrack value), {TextTrack orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   TextTrack singleMatching(bool test(TextTrack value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   TextTrack elementAt(int index) {
@@ -23287,16 +23301,36 @@
     throw new StateError("More than one element");
   }
 
-  TextTrack min([int compare(TextTrack a, TextTrack b)]) => Collections.min(this, compare);
+  TextTrack min([int compare(TextTrack a, TextTrack b)]) => IterableMixinWorkaround.min(this, compare);
 
-  TextTrack max([int compare(TextTrack a, TextTrack b)]) => Collections.max(this, compare);
+  TextTrack max([int compare(TextTrack a, TextTrack b)]) => IterableMixinWorkaround.max(this, compare);
 
   TextTrack removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   TextTrack removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(TextTrack element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(TextTrack element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<TextTrack> from, [int startFrom]) {
@@ -23316,32 +23350,32 @@
 
   // -- end List<TextTrack> mixins.
 
-
-  /** @domName TextTrackList.addEventListener */
+  @DocsEditable
+  @DomName('TextTrackList.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackList_addEventListener_Callback";
 
-
-  /** @domName TextTrackList.dispatchEvent */
+  @DocsEditable
+  @DomName('TextTrackList.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "TextTrackList_dispatchEvent_Callback";
 
-
-  /** @domName TextTrackList.item */
+  @DocsEditable
+  @DomName('TextTrackList.item')
   TextTrack item(int index) native "TextTrackList_item_Callback";
 
-
-  /** @domName TextTrackList.removeEventListener */
+  @DocsEditable
+  @DomName('TextTrackList.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackList_removeEventListener_Callback";
 
   Stream<TrackEvent> get onAddTrack => addTrackEvent.forTarget(this);
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class TextTrackListEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   TextTrackListEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get addTrack => this['addtrack'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23351,20 +23385,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName TimeRanges
+@DocsEditable
+@DomName('TimeRanges')
 class TimeRanges extends NativeFieldWrapperClass1 {
   TimeRanges.internal();
 
-
-  /** @domName TimeRanges.length */
+  @DocsEditable
+  @DomName('TimeRanges.length')
   int get length native "TimeRanges_length_Getter";
 
-
-  /** @domName TimeRanges.end */
+  @DocsEditable
+  @DomName('TimeRanges.end')
   num end(int index) native "TimeRanges_end_Callback";
 
-
-  /** @domName TimeRanges.start */
+  @DocsEditable
+  @DomName('TimeRanges.start')
   num start(int index) native "TimeRanges_start_Callback";
 
 }
@@ -23383,11 +23418,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLTitleElement
+@DocsEditable
+@DomName('HTMLTitleElement')
 class TitleElement extends _Element_Merged {
   TitleElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory TitleElement() => document.$dom_createElement("title");
 
 }
@@ -23398,56 +23434,57 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Touch
+@DocsEditable
+@DomName('Touch')
 class Touch extends NativeFieldWrapperClass1 {
   Touch.internal();
 
-
-  /** @domName Touch.clientX */
+  @DocsEditable
+  @DomName('Touch.clientX')
   int get clientX native "Touch_clientX_Getter";
 
-
-  /** @domName Touch.clientY */
+  @DocsEditable
+  @DomName('Touch.clientY')
   int get clientY native "Touch_clientY_Getter";
 
-
-  /** @domName Touch.identifier */
+  @DocsEditable
+  @DomName('Touch.identifier')
   int get identifier native "Touch_identifier_Getter";
 
-
-  /** @domName Touch.pageX */
+  @DocsEditable
+  @DomName('Touch.pageX')
   int get pageX native "Touch_pageX_Getter";
 
-
-  /** @domName Touch.pageY */
+  @DocsEditable
+  @DomName('Touch.pageY')
   int get pageY native "Touch_pageY_Getter";
 
-
-  /** @domName Touch.screenX */
+  @DocsEditable
+  @DomName('Touch.screenX')
   int get screenX native "Touch_screenX_Getter";
 
-
-  /** @domName Touch.screenY */
+  @DocsEditable
+  @DomName('Touch.screenY')
   int get screenY native "Touch_screenY_Getter";
 
-
-  /** @domName Touch.target */
+  @DocsEditable
+  @DomName('Touch.target')
   EventTarget get target native "Touch_target_Getter";
 
-
-  /** @domName Touch.webkitForce */
+  @DocsEditable
+  @DomName('Touch.webkitForce')
   num get webkitForce native "Touch_webkitForce_Getter";
 
-
-  /** @domName Touch.webkitRadiusX */
+  @DocsEditable
+  @DomName('Touch.webkitRadiusX')
   int get webkitRadiusX native "Touch_webkitRadiusX_Getter";
 
-
-  /** @domName Touch.webkitRadiusY */
+  @DocsEditable
+  @DomName('Touch.webkitRadiusY')
   int get webkitRadiusY native "Touch_webkitRadiusY_Getter";
 
-
-  /** @domName Touch.webkitRotationAngle */
+  @DocsEditable
+  @DomName('Touch.webkitRotationAngle')
   num get webkitRotationAngle native "Touch_webkitRotationAngle_Getter";
 
 }
@@ -23458,40 +23495,41 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName TouchEvent
+@DocsEditable
+@DomName('TouchEvent')
 class TouchEvent extends UIEvent {
   TouchEvent.internal() : super.internal();
 
-
-  /** @domName TouchEvent.altKey */
+  @DocsEditable
+  @DomName('TouchEvent.altKey')
   bool get altKey native "TouchEvent_altKey_Getter";
 
-
-  /** @domName TouchEvent.changedTouches */
+  @DocsEditable
+  @DomName('TouchEvent.changedTouches')
   TouchList get changedTouches native "TouchEvent_changedTouches_Getter";
 
-
-  /** @domName TouchEvent.ctrlKey */
+  @DocsEditable
+  @DomName('TouchEvent.ctrlKey')
   bool get ctrlKey native "TouchEvent_ctrlKey_Getter";
 
-
-  /** @domName TouchEvent.metaKey */
+  @DocsEditable
+  @DomName('TouchEvent.metaKey')
   bool get metaKey native "TouchEvent_metaKey_Getter";
 
-
-  /** @domName TouchEvent.shiftKey */
+  @DocsEditable
+  @DomName('TouchEvent.shiftKey')
   bool get shiftKey native "TouchEvent_shiftKey_Getter";
 
-
-  /** @domName TouchEvent.targetTouches */
+  @DocsEditable
+  @DomName('TouchEvent.targetTouches')
   TouchList get targetTouches native "TouchEvent_targetTouches_Getter";
 
-
-  /** @domName TouchEvent.touches */
+  @DocsEditable
+  @DomName('TouchEvent.touches')
   TouchList get touches native "TouchEvent_touches_Getter";
 
-
-  /** @domName TouchEvent.initTouchEvent */
+  @DocsEditable
+  @DomName('TouchEvent.initTouchEvent')
   void initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native "TouchEvent_initTouchEvent_Callback";
 
 }
@@ -23502,12 +23540,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName TouchList
+@DocsEditable
+@DomName('TouchList')
 class TouchList extends NativeFieldWrapperClass1 implements List<Touch> {
   TouchList.internal();
 
-
-  /** @domName TouchList.length */
+  @DocsEditable
+  @DomName('TouchList.length')
   int get length native "TouchList_length_Getter";
 
   Touch operator[](int index) native "TouchList_item_Callback";
@@ -23528,50 +23567,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Touch)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Touch element) => Collections.contains(this, element);
+  bool contains(Touch element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Touch element)) => Collections.forEach(this, f);
+  void forEach(void f(Touch element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Touch element)) => new MappedList<Touch, dynamic>(this, f);
+  List mappedBy(f(Touch element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Touch> where(bool f(Touch element)) => new WhereIterable<Touch>(this, f);
+  Iterable<Touch> where(bool f(Touch element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Touch element)) => Collections.every(this, f);
+  bool every(bool f(Touch element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Touch element)) => Collections.any(this, f);
+  bool any(bool f(Touch element)) => IterableMixinWorkaround.any(this, f);
 
   List<Touch> toList() => new List<Touch>.from(this);
   Set<Touch> toSet() => new Set<Touch>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Touch> take(int n) => new ListView<Touch>(this, 0, n);
+  List<Touch> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Touch> takeWhile(bool test(Touch value)) {
-    return new TakeWhileIterable<Touch>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Touch> skip(int n) => new ListView<Touch>(this, n, null);
+  List<Touch> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Touch> skipWhile(bool test(Touch value)) {
-    return new SkipWhileIterable<Touch>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Touch firstMatching(bool test(Touch value), { Touch orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Touch lastMatching(bool test(Touch value), {Touch orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Touch singleMatching(bool test(Touch value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Touch elementAt(int index) {
@@ -23629,16 +23668,36 @@
     throw new StateError("More than one element");
   }
 
-  Touch min([int compare(Touch a, Touch b)]) => Collections.min(this, compare);
+  Touch min([int compare(Touch a, Touch b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Touch max([int compare(Touch a, Touch b)]) => Collections.max(this, compare);
+  Touch max([int compare(Touch a, Touch b)]) => IterableMixinWorkaround.max(this, compare);
 
   Touch removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Touch removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Touch element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Touch element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Touch> from, [int startFrom]) {
@@ -23658,8 +23717,8 @@
 
   // -- end List<Touch> mixins.
 
-
-  /** @domName TouchList.item */
+  @DocsEditable
+  @DomName('TouchList.item')
   Touch item(int index) native "TouchList_item_Callback";
 
 }
@@ -23670,14 +23729,15 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLTrackElement
+@DocsEditable
+@DomName('HTMLTrackElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
 class TrackElement extends _Element_Merged {
   TrackElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory TrackElement() => document.$dom_createElement("track");
 
   /// Checks if this type is supported on the current platform.
@@ -23691,52 +23751,52 @@
 
   static const int NONE = 0;
 
-
-  /** @domName HTMLTrackElement.default */
+  @DocsEditable
+  @DomName('HTMLTrackElement.default')
   bool get defaultValue native "HTMLTrackElement_default_Getter";
 
-
-  /** @domName HTMLTrackElement.default */
+  @DocsEditable
+  @DomName('HTMLTrackElement.default')
   void set defaultValue(bool value) native "HTMLTrackElement_default_Setter";
 
-
-  /** @domName HTMLTrackElement.kind */
+  @DocsEditable
+  @DomName('HTMLTrackElement.kind')
   String get kind native "HTMLTrackElement_kind_Getter";
 
-
-  /** @domName HTMLTrackElement.kind */
+  @DocsEditable
+  @DomName('HTMLTrackElement.kind')
   void set kind(String value) native "HTMLTrackElement_kind_Setter";
 
-
-  /** @domName HTMLTrackElement.label */
+  @DocsEditable
+  @DomName('HTMLTrackElement.label')
   String get label native "HTMLTrackElement_label_Getter";
 
-
-  /** @domName HTMLTrackElement.label */
+  @DocsEditable
+  @DomName('HTMLTrackElement.label')
   void set label(String value) native "HTMLTrackElement_label_Setter";
 
-
-  /** @domName HTMLTrackElement.readyState */
+  @DocsEditable
+  @DomName('HTMLTrackElement.readyState')
   int get readyState native "HTMLTrackElement_readyState_Getter";
 
-
-  /** @domName HTMLTrackElement.src */
+  @DocsEditable
+  @DomName('HTMLTrackElement.src')
   String get src native "HTMLTrackElement_src_Getter";
 
-
-  /** @domName HTMLTrackElement.src */
+  @DocsEditable
+  @DomName('HTMLTrackElement.src')
   void set src(String value) native "HTMLTrackElement_src_Setter";
 
-
-  /** @domName HTMLTrackElement.srclang */
+  @DocsEditable
+  @DomName('HTMLTrackElement.srclang')
   String get srclang native "HTMLTrackElement_srclang_Getter";
 
-
-  /** @domName HTMLTrackElement.srclang */
+  @DocsEditable
+  @DomName('HTMLTrackElement.srclang')
   void set srclang(String value) native "HTMLTrackElement_srclang_Setter";
 
-
-  /** @domName HTMLTrackElement.track */
+  @DocsEditable
+  @DomName('HTMLTrackElement.track')
   TextTrack get track native "HTMLTrackElement_track_Getter";
 
 }
@@ -23747,12 +23807,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName TrackEvent
+@DocsEditable
+@DomName('TrackEvent')
 class TrackEvent extends Event {
   TrackEvent.internal() : super.internal();
 
-
-  /** @domName TrackEvent.track */
+  @DocsEditable
+  @DomName('TrackEvent.track')
   Object get track native "TrackEvent_track_Getter";
 
 }
@@ -23763,16 +23824,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebKitTransitionEvent
+@DocsEditable
+@DomName('WebKitTransitionEvent')
 class TransitionEvent extends Event {
   TransitionEvent.internal() : super.internal();
 
-
-  /** @domName WebKitTransitionEvent.elapsedTime */
+  @DocsEditable
+  @DomName('WebKitTransitionEvent.elapsedTime')
   num get elapsedTime native "WebKitTransitionEvent_elapsedTime_Getter";
 
-
-  /** @domName WebKitTransitionEvent.propertyName */
+  @DocsEditable
+  @DomName('WebKitTransitionEvent.propertyName')
   String get propertyName native "WebKitTransitionEvent_propertyName_Getter";
 
 }
@@ -23783,60 +23845,61 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName TreeWalker
+@DocsEditable
+@DomName('TreeWalker')
 class TreeWalker extends NativeFieldWrapperClass1 {
   TreeWalker.internal();
 
-
-  /** @domName TreeWalker.currentNode */
+  @DocsEditable
+  @DomName('TreeWalker.currentNode')
   Node get currentNode native "TreeWalker_currentNode_Getter";
 
-
-  /** @domName TreeWalker.currentNode */
+  @DocsEditable
+  @DomName('TreeWalker.currentNode')
   void set currentNode(Node value) native "TreeWalker_currentNode_Setter";
 
-
-  /** @domName TreeWalker.expandEntityReferences */
+  @DocsEditable
+  @DomName('TreeWalker.expandEntityReferences')
   bool get expandEntityReferences native "TreeWalker_expandEntityReferences_Getter";
 
-
-  /** @domName TreeWalker.filter */
+  @DocsEditable
+  @DomName('TreeWalker.filter')
   NodeFilter get filter native "TreeWalker_filter_Getter";
 
-
-  /** @domName TreeWalker.root */
+  @DocsEditable
+  @DomName('TreeWalker.root')
   Node get root native "TreeWalker_root_Getter";
 
-
-  /** @domName TreeWalker.whatToShow */
+  @DocsEditable
+  @DomName('TreeWalker.whatToShow')
   int get whatToShow native "TreeWalker_whatToShow_Getter";
 
-
-  /** @domName TreeWalker.firstChild */
+  @DocsEditable
+  @DomName('TreeWalker.firstChild')
   Node firstChild() native "TreeWalker_firstChild_Callback";
 
-
-  /** @domName TreeWalker.lastChild */
+  @DocsEditable
+  @DomName('TreeWalker.lastChild')
   Node lastChild() native "TreeWalker_lastChild_Callback";
 
-
-  /** @domName TreeWalker.nextNode */
+  @DocsEditable
+  @DomName('TreeWalker.nextNode')
   Node nextNode() native "TreeWalker_nextNode_Callback";
 
-
-  /** @domName TreeWalker.nextSibling */
+  @DocsEditable
+  @DomName('TreeWalker.nextSibling')
   Node nextSibling() native "TreeWalker_nextSibling_Callback";
 
-
-  /** @domName TreeWalker.parentNode */
+  @DocsEditable
+  @DomName('TreeWalker.parentNode')
   Node parentNode() native "TreeWalker_parentNode_Callback";
 
-
-  /** @domName TreeWalker.previousNode */
+  @DocsEditable
+  @DomName('TreeWalker.previousNode')
   Node previousNode() native "TreeWalker_previousNode_Callback";
 
-
-  /** @domName TreeWalker.previousSibling */
+  @DocsEditable
+  @DomName('TreeWalker.previousSibling')
   Node previousSibling() native "TreeWalker_previousSibling_Callback";
 
 }
@@ -23847,7 +23910,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName UIEvent; @docsEditable true
+@DocsEditable
+@DomName('UIEvent')
 class UIEvent extends Event {
   // In JS, canBubble and cancelable are technically required parameters to
   // init*Event. In practice, though, if they aren't provided they simply
@@ -23863,44 +23927,44 @@
   }
   UIEvent.internal() : super.internal();
 
-
-  /** @domName UIEvent.charCode */
+  @DocsEditable
+  @DomName('UIEvent.charCode')
   int get $dom_charCode native "UIEvent_charCode_Getter";
 
-
-  /** @domName UIEvent.detail */
+  @DocsEditable
+  @DomName('UIEvent.detail')
   int get detail native "UIEvent_detail_Getter";
 
-
-  /** @domName UIEvent.keyCode */
+  @DocsEditable
+  @DomName('UIEvent.keyCode')
   int get $dom_keyCode native "UIEvent_keyCode_Getter";
 
-
-  /** @domName UIEvent.layerX */
+  @DocsEditable
+  @DomName('UIEvent.layerX')
   int get layerX native "UIEvent_layerX_Getter";
 
-
-  /** @domName UIEvent.layerY */
+  @DocsEditable
+  @DomName('UIEvent.layerY')
   int get layerY native "UIEvent_layerY_Getter";
 
-
-  /** @domName UIEvent.pageX */
+  @DocsEditable
+  @DomName('UIEvent.pageX')
   int get pageX native "UIEvent_pageX_Getter";
 
-
-  /** @domName UIEvent.pageY */
+  @DocsEditable
+  @DomName('UIEvent.pageY')
   int get pageY native "UIEvent_pageY_Getter";
 
-
-  /** @domName UIEvent.view */
+  @DocsEditable
+  @DomName('UIEvent.view')
   WindowBase get view native "UIEvent_view_Getter";
 
-
-  /** @domName UIEvent.which */
+  @DocsEditable
+  @DomName('UIEvent.which')
   int get which native "UIEvent_which_Getter";
 
-
-  /** @domName UIEvent.initUIEvent */
+  @DocsEditable
+  @DomName('UIEvent.initUIEvent')
   void $dom_initUIEvent(String type, bool canBubble, bool cancelable, Window view, int detail) native "UIEvent_initUIEvent_Callback";
 
 }
@@ -23911,11 +23975,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLUListElement
+@DocsEditable
+@DomName('HTMLUListElement')
 class UListElement extends _Element_Merged {
   UListElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory UListElement() => document.$dom_createElement("ul");
 
 }
@@ -23926,7 +23991,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Uint16Array
+@DocsEditable
+@DomName('Uint16Array')
 class Uint16Array extends ArrayBufferView implements List<int> {
   Uint16Array.internal() : super.internal();
 
@@ -23941,16 +24007,16 @@
 
   static const int BYTES_PER_ELEMENT = 2;
 
-
-  /** @domName Uint16Array.length */
+  @DocsEditable
+  @DomName('Uint16Array.length')
   int get length native "Uint16Array_length_Getter";
 
-
-  /** @domName Uint16Array.numericIndexGetter */
+  @DocsEditable
+  @DomName('Uint16Array.numericIndexGetter')
   int operator[](int index) native "Uint16Array_numericIndexGetter_Callback";
 
-
-  /** @domName Uint16Array.numericIndexSetter */
+  @DocsEditable
+  @DomName('Uint16Array.numericIndexSetter')
   void operator[]=(int index, int value) native "Uint16Array_numericIndexSetter_Callback";
   // -- start List<int> mixins.
   // int is the element type.
@@ -23965,50 +24031,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(int element) => Collections.contains(this, element);
+  bool contains(int element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(int element)) => Collections.forEach(this, f);
+  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(int element)) => new MappedList<int, dynamic>(this, f);
+  List mappedBy(f(int element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<int> where(bool f(int element)) => new WhereIterable<int>(this, f);
+  Iterable<int> where(bool f(int element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(int element)) => Collections.every(this, f);
+  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(int element)) => Collections.any(this, f);
+  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);
 
   List<int> toList() => new List<int>.from(this);
   Set<int> toSet() => new Set<int>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<int> take(int n) => new ListView<int>(this, 0, n);
+  List<int> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<int> takeWhile(bool test(int value)) {
-    return new TakeWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<int> skip(int n) => new ListView<int>(this, n, null);
+  List<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<int> skipWhile(bool test(int value)) {
-    return new SkipWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   int firstMatching(bool test(int value), { int orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   int lastMatching(bool test(int value), {int orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   int singleMatching(bool test(int value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   int elementAt(int index) {
@@ -24066,16 +24132,36 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) => Collections.min(this, compare);
+  int min([int compare(int a, int b)]) => IterableMixinWorkaround.min(this, compare);
 
-  int max([int compare(int a, int b)]) => Collections.max(this, compare);
+  int max([int compare(int a, int b)]) => IterableMixinWorkaround.max(this, compare);
 
   int removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
@@ -24095,23 +24181,23 @@
 
   // -- end List<int> mixins.
 
-
-  /** @domName Uint16Array.setElements */
+  @DocsEditable
+  @DomName('Uint16Array.setElements')
   void setElements(Object array, [int offset]) native "Uint16Array_setElements_Callback";
 
-  Uint16Array subarray(/*long*/ start, [/*long*/ end]) {
+  Uint16Array subarray(int start, [int end]) {
     if (?end) {
       return _subarray_1(start, end);
     }
     return _subarray_2(start);
   }
 
-
-  /** @domName Uint16Array.subarray_1 */
+  @DocsEditable
+  @DomName('Uint16Array.subarray_1')
   Uint16Array _subarray_1(start, end) native "Uint16Array_subarray_1_Callback";
 
-
-  /** @domName Uint16Array.subarray_2 */
+  @DocsEditable
+  @DomName('Uint16Array.subarray_2')
   Uint16Array _subarray_2(start) native "Uint16Array_subarray_2_Callback";
 
 }
@@ -24122,7 +24208,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Uint32Array
+@DocsEditable
+@DomName('Uint32Array')
 class Uint32Array extends ArrayBufferView implements List<int> {
   Uint32Array.internal() : super.internal();
 
@@ -24137,16 +24224,16 @@
 
   static const int BYTES_PER_ELEMENT = 4;
 
-
-  /** @domName Uint32Array.length */
+  @DocsEditable
+  @DomName('Uint32Array.length')
   int get length native "Uint32Array_length_Getter";
 
-
-  /** @domName Uint32Array.numericIndexGetter */
+  @DocsEditable
+  @DomName('Uint32Array.numericIndexGetter')
   int operator[](int index) native "Uint32Array_numericIndexGetter_Callback";
 
-
-  /** @domName Uint32Array.numericIndexSetter */
+  @DocsEditable
+  @DomName('Uint32Array.numericIndexSetter')
   void operator[]=(int index, int value) native "Uint32Array_numericIndexSetter_Callback";
   // -- start List<int> mixins.
   // int is the element type.
@@ -24161,50 +24248,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(int element) => Collections.contains(this, element);
+  bool contains(int element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(int element)) => Collections.forEach(this, f);
+  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(int element)) => new MappedList<int, dynamic>(this, f);
+  List mappedBy(f(int element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<int> where(bool f(int element)) => new WhereIterable<int>(this, f);
+  Iterable<int> where(bool f(int element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(int element)) => Collections.every(this, f);
+  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(int element)) => Collections.any(this, f);
+  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);
 
   List<int> toList() => new List<int>.from(this);
   Set<int> toSet() => new Set<int>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<int> take(int n) => new ListView<int>(this, 0, n);
+  List<int> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<int> takeWhile(bool test(int value)) {
-    return new TakeWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<int> skip(int n) => new ListView<int>(this, n, null);
+  List<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<int> skipWhile(bool test(int value)) {
-    return new SkipWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   int firstMatching(bool test(int value), { int orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   int lastMatching(bool test(int value), {int orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   int singleMatching(bool test(int value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   int elementAt(int index) {
@@ -24262,16 +24349,36 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) => Collections.min(this, compare);
+  int min([int compare(int a, int b)]) => IterableMixinWorkaround.min(this, compare);
 
-  int max([int compare(int a, int b)]) => Collections.max(this, compare);
+  int max([int compare(int a, int b)]) => IterableMixinWorkaround.max(this, compare);
 
   int removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
@@ -24291,23 +24398,23 @@
 
   // -- end List<int> mixins.
 
-
-  /** @domName Uint32Array.setElements */
+  @DocsEditable
+  @DomName('Uint32Array.setElements')
   void setElements(Object array, [int offset]) native "Uint32Array_setElements_Callback";
 
-  Uint32Array subarray(/*long*/ start, [/*long*/ end]) {
+  Uint32Array subarray(int start, [int end]) {
     if (?end) {
       return _subarray_1(start, end);
     }
     return _subarray_2(start);
   }
 
-
-  /** @domName Uint32Array.subarray_1 */
+  @DocsEditable
+  @DomName('Uint32Array.subarray_1')
   Uint32Array _subarray_1(start, end) native "Uint32Array_subarray_1_Callback";
 
-
-  /** @domName Uint32Array.subarray_2 */
+  @DocsEditable
+  @DomName('Uint32Array.subarray_2')
   Uint32Array _subarray_2(start) native "Uint32Array_subarray_2_Callback";
 
 }
@@ -24318,7 +24425,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Uint8Array
+@DocsEditable
+@DomName('Uint8Array')
 class Uint8Array extends ArrayBufferView implements List<int> {
   Uint8Array.internal() : super.internal();
 
@@ -24333,16 +24441,16 @@
 
   static const int BYTES_PER_ELEMENT = 1;
 
-
-  /** @domName Uint8Array.length */
+  @DocsEditable
+  @DomName('Uint8Array.length')
   int get length native "Uint8Array_length_Getter";
 
-
-  /** @domName Uint8Array.numericIndexGetter */
+  @DocsEditable
+  @DomName('Uint8Array.numericIndexGetter')
   int operator[](int index) native "Uint8Array_numericIndexGetter_Callback";
 
-
-  /** @domName Uint8Array.numericIndexSetter */
+  @DocsEditable
+  @DomName('Uint8Array.numericIndexSetter')
   void operator[]=(int index, int value) native "Uint8Array_numericIndexSetter_Callback";
   // -- start List<int> mixins.
   // int is the element type.
@@ -24357,50 +24465,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(int element) => Collections.contains(this, element);
+  bool contains(int element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(int element)) => Collections.forEach(this, f);
+  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(int element)) => new MappedList<int, dynamic>(this, f);
+  List mappedBy(f(int element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<int> where(bool f(int element)) => new WhereIterable<int>(this, f);
+  Iterable<int> where(bool f(int element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(int element)) => Collections.every(this, f);
+  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(int element)) => Collections.any(this, f);
+  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);
 
   List<int> toList() => new List<int>.from(this);
   Set<int> toSet() => new Set<int>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<int> take(int n) => new ListView<int>(this, 0, n);
+  List<int> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<int> takeWhile(bool test(int value)) {
-    return new TakeWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<int> skip(int n) => new ListView<int>(this, n, null);
+  List<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<int> skipWhile(bool test(int value)) {
-    return new SkipWhileIterable<int>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   int firstMatching(bool test(int value), { int orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   int lastMatching(bool test(int value), {int orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   int singleMatching(bool test(int value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   int elementAt(int index) {
@@ -24458,16 +24566,36 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) => Collections.min(this, compare);
+  int min([int compare(int a, int b)]) => IterableMixinWorkaround.min(this, compare);
 
-  int max([int compare(int a, int b)]) => Collections.max(this, compare);
+  int max([int compare(int a, int b)]) => IterableMixinWorkaround.max(this, compare);
 
   int removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
@@ -24487,23 +24615,23 @@
 
   // -- end List<int> mixins.
 
-
-  /** @domName Uint8Array.setElements */
+  @DocsEditable
+  @DomName('Uint8Array.setElements')
   void setElements(Object array, [int offset]) native "Uint8Array_setElements_Callback";
 
-  Uint8Array subarray(/*long*/ start, [/*long*/ end]) {
+  Uint8Array subarray(int start, [int end]) {
     if (?end) {
       return _subarray_1(start, end);
     }
     return _subarray_2(start);
   }
 
-
-  /** @domName Uint8Array.subarray_1 */
+  @DocsEditable
+  @DomName('Uint8Array.subarray_1')
   Uint8Array _subarray_1(start, end) native "Uint8Array_subarray_1_Callback";
 
-
-  /** @domName Uint8Array.subarray_2 */
+  @DocsEditable
+  @DomName('Uint8Array.subarray_2')
   Uint8Array _subarray_2(start) native "Uint8Array_subarray_2_Callback";
 
 }
@@ -24514,8 +24642,9 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Uint8ClampedArray
-class Uint8ClampedArray extends Uint8Array {
+@DocsEditable
+@DomName('Uint8ClampedArray')
+class Uint8ClampedArray extends Uint8Array implements List<int> {
   Uint8ClampedArray.internal() : super.internal();
 
   factory Uint8ClampedArray(int length) =>
@@ -24527,35 +24656,197 @@
   factory Uint8ClampedArray.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createUint8ClampedArray_fromBuffer(buffer, byteOffset, length);
 
-
-  /** @domName Uint8ClampedArray.length */
+  @DocsEditable
+  @DomName('Uint8ClampedArray.length')
   int get length native "Uint8ClampedArray_length_Getter";
 
-
-  /** @domName Uint8ClampedArray.numericIndexGetter */
+  @DocsEditable
+  @DomName('Uint8ClampedArray.numericIndexGetter')
   int operator[](int index) native "Uint8ClampedArray_numericIndexGetter_Callback";
 
-
-  /** @domName Uint8ClampedArray.numericIndexSetter */
+  @DocsEditable
+  @DomName('Uint8ClampedArray.numericIndexSetter')
   void operator[]=(int index, int value) native "Uint8ClampedArray_numericIndexSetter_Callback";
+  // -- start List<int> mixins.
+  // int is the element type.
 
+  // From Iterable<int>:
 
-  /** @domName Uint8ClampedArray.setElements */
+  Iterator<int> get iterator {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new FixedSizeListIterator<int>(this);
+  }
+
+  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  }
+
+  bool contains(int element) => IterableMixinWorkaround.contains(this, element);
+
+  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
+
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
+
+  List mappedBy(f(int element)) => IterableMixinWorkaround.mappedByList(this, f);
+
+  Iterable<int> where(bool f(int element)) => IterableMixinWorkaround.where(this, f);
+
+  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);
+
+  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);
+
+  List<int> toList() => new List<int>.from(this);
+  Set<int> toSet() => new Set<int>.from(this);
+
+  bool get isEmpty => this.length == 0;
+
+  List<int> take(int n) => IterableMixinWorkaround.takeList(this, n);
+
+  Iterable<int> takeWhile(bool test(int value)) {
+    return IterableMixinWorkaround.takeWhile(this, test);
+  }
+
+  List<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);
+
+  Iterable<int> skipWhile(bool test(int value)) {
+    return IterableMixinWorkaround.skipWhile(this, test);
+  }
+
+  int firstMatching(bool test(int value), { int orElse() }) {
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
+  }
+
+  int lastMatching(bool test(int value), {int orElse()}) {
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
+  }
+
+  int singleMatching(bool test(int value)) {
+    return IterableMixinWorkaround.singleMatching(this, test);
+  }
+
+  int elementAt(int index) {
+    return this[index];
+  }
+
+  // From Collection<int>:
+
+  void add(int value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(int value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Iterable<int> iterable) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  // From List<int>:
+  void set length(int value) {
+    throw new UnsupportedError("Cannot resize immutable List.");
+  }
+
+  void clear() {
+    throw new UnsupportedError("Cannot clear immutable List.");
+  }
+
+  void sort([int compare(int a, int b)]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(int element, [int start = 0]) =>
+      Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(int element, [int start]) {
+    if (start == null) start = length - 1;
+    return Lists.lastIndexOf(this, element, start);
+  }
+
+  int get first {
+    if (this.length > 0) return this[0];
+    throw new StateError("No elements");
+  }
+
+  int get last {
+    if (this.length > 0) return this[this.length - 1];
+    throw new StateError("No elements");
+  }
+
+  int get single {
+    if (length == 1) return this[0];
+    if (length == 0) throw new StateError("No elements");
+    throw new StateError("More than one element");
+  }
+
+  int min([int compare(int a, int b)]) => IterableMixinWorkaround.min(this, compare);
+
+  int max([int compare(int a, int b)]) => IterableMixinWorkaround.max(this, compare);
+
+  int removeAt(int pos) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  int removeLast() {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(int element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [int initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<int> getRange(int start, int rangeLength) =>
+      Lists.getRange(this, start, rangeLength, <int>[]);
+
+  // -- end List<int> mixins.
+
+  @DocsEditable
+  @DomName('Uint8ClampedArray.setElements')
   void setElements(Object array, [int offset]) native "Uint8ClampedArray_setElements_Callback";
 
-  Uint8ClampedArray subarray(/*long*/ start, [/*long*/ end]) {
+  Uint8ClampedArray subarray(int start, [int end]) {
     if (?end) {
       return _subarray_1(start, end);
     }
     return _subarray_2(start);
   }
 
-
-  /** @domName Uint8ClampedArray.subarray_1 */
+  @DocsEditable
+  @DomName('Uint8ClampedArray.subarray_1')
   Uint8ClampedArray _subarray_1(start, end) native "Uint8ClampedArray_subarray_1_Callback";
 
-
-  /** @domName Uint8ClampedArray.subarray_2 */
+  @DocsEditable
+  @DomName('Uint8ClampedArray.subarray_2')
   Uint8ClampedArray _subarray_2(start) native "Uint8ClampedArray_subarray_2_Callback";
 
 }
@@ -24566,7 +24857,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLUnknownElement
+@DocsEditable
+@DomName('HTMLUnknownElement')
 class UnknownElement extends _Element_Merged {
   UnknownElement.internal() : super.internal();
 
@@ -24578,7 +24870,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName URL
+@DocsEditable
+@DomName('URL')
 class Url extends NativeFieldWrapperClass1 {
   Url.internal();
 
@@ -24595,20 +24888,20 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName DOMURL.createObjectURL_1 */
+  @DocsEditable
+  @DomName('DOMURL.createObjectURL_1')
   static String _createObjectURL_1(blob_OR_source_OR_stream) native "DOMURL_createObjectURL_1_Callback";
 
-
-  /** @domName DOMURL.createObjectURL_2 */
+  @DocsEditable
+  @DomName('DOMURL.createObjectURL_2')
   static String _createObjectURL_2(blob_OR_source_OR_stream) native "DOMURL_createObjectURL_2_Callback";
 
-
-  /** @domName DOMURL.createObjectURL_3 */
+  @DocsEditable
+  @DomName('DOMURL.createObjectURL_3')
   static String _createObjectURL_3(blob_OR_source_OR_stream) native "DOMURL_createObjectURL_3_Callback";
 
-
-  /** @domName DOMURL.revokeObjectURL */
+  @DocsEditable
+  @DomName('DOMURL.revokeObjectURL')
   static void revokeObjectUrl(String url) native "DOMURL_revokeObjectURL_Callback";
 
 }
@@ -24619,48 +24912,49 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ValidityState
+@DocsEditable
+@DomName('ValidityState')
 class ValidityState extends NativeFieldWrapperClass1 {
   ValidityState.internal();
 
-
-  /** @domName ValidityState.badInput */
+  @DocsEditable
+  @DomName('ValidityState.badInput')
   bool get badInput native "ValidityState_badInput_Getter";
 
-
-  /** @domName ValidityState.customError */
+  @DocsEditable
+  @DomName('ValidityState.customError')
   bool get customError native "ValidityState_customError_Getter";
 
-
-  /** @domName ValidityState.patternMismatch */
+  @DocsEditable
+  @DomName('ValidityState.patternMismatch')
   bool get patternMismatch native "ValidityState_patternMismatch_Getter";
 
-
-  /** @domName ValidityState.rangeOverflow */
+  @DocsEditable
+  @DomName('ValidityState.rangeOverflow')
   bool get rangeOverflow native "ValidityState_rangeOverflow_Getter";
 
-
-  /** @domName ValidityState.rangeUnderflow */
+  @DocsEditable
+  @DomName('ValidityState.rangeUnderflow')
   bool get rangeUnderflow native "ValidityState_rangeUnderflow_Getter";
 
-
-  /** @domName ValidityState.stepMismatch */
+  @DocsEditable
+  @DomName('ValidityState.stepMismatch')
   bool get stepMismatch native "ValidityState_stepMismatch_Getter";
 
-
-  /** @domName ValidityState.tooLong */
+  @DocsEditable
+  @DomName('ValidityState.tooLong')
   bool get tooLong native "ValidityState_tooLong_Getter";
 
-
-  /** @domName ValidityState.typeMismatch */
+  @DocsEditable
+  @DomName('ValidityState.typeMismatch')
   bool get typeMismatch native "ValidityState_typeMismatch_Getter";
 
-
-  /** @domName ValidityState.valid */
+  @DocsEditable
+  @DomName('ValidityState.valid')
   bool get valid native "ValidityState_valid_Getter";
 
-
-  /** @domName ValidityState.valueMissing */
+  @DocsEditable
+  @DomName('ValidityState.valueMissing')
   bool get valueMissing native "ValidityState_valueMissing_Getter";
 
 }
@@ -24671,75 +24965,76 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLVideoElement
+@DocsEditable
+@DomName('HTMLVideoElement')
 class VideoElement extends MediaElement {
   VideoElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory VideoElement() => document.$dom_createElement("video");
 
-
-  /** @domName HTMLVideoElement.height */
+  @DocsEditable
+  @DomName('HTMLVideoElement.height')
   int get height native "HTMLVideoElement_height_Getter";
 
-
-  /** @domName HTMLVideoElement.height */
+  @DocsEditable
+  @DomName('HTMLVideoElement.height')
   void set height(int value) native "HTMLVideoElement_height_Setter";
 
-
-  /** @domName HTMLVideoElement.poster */
+  @DocsEditable
+  @DomName('HTMLVideoElement.poster')
   String get poster native "HTMLVideoElement_poster_Getter";
 
-
-  /** @domName HTMLVideoElement.poster */
+  @DocsEditable
+  @DomName('HTMLVideoElement.poster')
   void set poster(String value) native "HTMLVideoElement_poster_Setter";
 
-
-  /** @domName HTMLVideoElement.videoHeight */
+  @DocsEditable
+  @DomName('HTMLVideoElement.videoHeight')
   int get videoHeight native "HTMLVideoElement_videoHeight_Getter";
 
-
-  /** @domName HTMLVideoElement.videoWidth */
+  @DocsEditable
+  @DomName('HTMLVideoElement.videoWidth')
   int get videoWidth native "HTMLVideoElement_videoWidth_Getter";
 
-
-  /** @domName HTMLVideoElement.webkitDecodedFrameCount */
+  @DocsEditable
+  @DomName('HTMLVideoElement.webkitDecodedFrameCount')
   int get webkitDecodedFrameCount native "HTMLVideoElement_webkitDecodedFrameCount_Getter";
 
-
-  /** @domName HTMLVideoElement.webkitDisplayingFullscreen */
+  @DocsEditable
+  @DomName('HTMLVideoElement.webkitDisplayingFullscreen')
   bool get webkitDisplayingFullscreen native "HTMLVideoElement_webkitDisplayingFullscreen_Getter";
 
-
-  /** @domName HTMLVideoElement.webkitDroppedFrameCount */
+  @DocsEditable
+  @DomName('HTMLVideoElement.webkitDroppedFrameCount')
   int get webkitDroppedFrameCount native "HTMLVideoElement_webkitDroppedFrameCount_Getter";
 
-
-  /** @domName HTMLVideoElement.webkitSupportsFullscreen */
+  @DocsEditable
+  @DomName('HTMLVideoElement.webkitSupportsFullscreen')
   bool get webkitSupportsFullscreen native "HTMLVideoElement_webkitSupportsFullscreen_Getter";
 
-
-  /** @domName HTMLVideoElement.width */
+  @DocsEditable
+  @DomName('HTMLVideoElement.width')
   int get width native "HTMLVideoElement_width_Getter";
 
-
-  /** @domName HTMLVideoElement.width */
+  @DocsEditable
+  @DomName('HTMLVideoElement.width')
   void set width(int value) native "HTMLVideoElement_width_Setter";
 
-
-  /** @domName HTMLVideoElement.webkitEnterFullScreen */
+  @DocsEditable
+  @DomName('HTMLVideoElement.webkitEnterFullScreen')
   void webkitEnterFullScreen() native "HTMLVideoElement_webkitEnterFullScreen_Callback";
 
-
-  /** @domName HTMLVideoElement.webkitEnterFullscreen */
+  @DocsEditable
+  @DomName('HTMLVideoElement.webkitEnterFullscreen')
   void webkitEnterFullscreen() native "HTMLVideoElement_webkitEnterFullscreen_Callback";
 
-
-  /** @domName HTMLVideoElement.webkitExitFullScreen */
+  @DocsEditable
+  @DomName('HTMLVideoElement.webkitExitFullScreen')
   void webkitExitFullScreen() native "HTMLVideoElement_webkitExitFullScreen_Callback";
 
-
-  /** @domName HTMLVideoElement.webkitExitFullscreen */
+  @DocsEditable
+  @DomName('HTMLVideoElement.webkitExitFullscreen')
   void webkitExitFullscreen() native "HTMLVideoElement_webkitExitFullscreen_Callback";
 
 }
@@ -24758,20 +25053,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLActiveInfo
+@DocsEditable
+@DomName('WebGLActiveInfo')
 class WebGLActiveInfo extends NativeFieldWrapperClass1 {
   WebGLActiveInfo.internal();
 
-
-  /** @domName WebGLActiveInfo.name */
+  @DocsEditable
+  @DomName('WebGLActiveInfo.name')
   String get name native "WebGLActiveInfo_name_Getter";
 
-
-  /** @domName WebGLActiveInfo.size */
+  @DocsEditable
+  @DomName('WebGLActiveInfo.size')
   int get size native "WebGLActiveInfo_size_Getter";
 
-
-  /** @domName WebGLActiveInfo.type */
+  @DocsEditable
+  @DomName('WebGLActiveInfo.type')
   int get type native "WebGLActiveInfo_type_Getter";
 
 }
@@ -24782,7 +25078,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLBuffer
+@DocsEditable
+@DomName('WebGLBuffer')
 class WebGLBuffer extends NativeFieldWrapperClass1 {
   WebGLBuffer.internal();
 
@@ -24794,7 +25091,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLCompressedTextureS3TC
+@DocsEditable
+@DomName('WebGLCompressedTextureS3TC')
 class WebGLCompressedTextureS3TC extends NativeFieldWrapperClass1 {
   WebGLCompressedTextureS3TC.internal();
 
@@ -24814,56 +25112,57 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLContextAttributes
+@DocsEditable
+@DomName('WebGLContextAttributes')
 class WebGLContextAttributes extends NativeFieldWrapperClass1 {
   WebGLContextAttributes.internal();
 
-
-  /** @domName WebGLContextAttributes.alpha */
+  @DocsEditable
+  @DomName('WebGLContextAttributes.alpha')
   bool get alpha native "WebGLContextAttributes_alpha_Getter";
 
-
-  /** @domName WebGLContextAttributes.alpha */
+  @DocsEditable
+  @DomName('WebGLContextAttributes.alpha')
   void set alpha(bool value) native "WebGLContextAttributes_alpha_Setter";
 
-
-  /** @domName WebGLContextAttributes.antialias */
+  @DocsEditable
+  @DomName('WebGLContextAttributes.antialias')
   bool get antialias native "WebGLContextAttributes_antialias_Getter";
 
-
-  /** @domName WebGLContextAttributes.antialias */
+  @DocsEditable
+  @DomName('WebGLContextAttributes.antialias')
   void set antialias(bool value) native "WebGLContextAttributes_antialias_Setter";
 
-
-  /** @domName WebGLContextAttributes.depth */
+  @DocsEditable
+  @DomName('WebGLContextAttributes.depth')
   bool get depth native "WebGLContextAttributes_depth_Getter";
 
-
-  /** @domName WebGLContextAttributes.depth */
+  @DocsEditable
+  @DomName('WebGLContextAttributes.depth')
   void set depth(bool value) native "WebGLContextAttributes_depth_Setter";
 
-
-  /** @domName WebGLContextAttributes.premultipliedAlpha */
+  @DocsEditable
+  @DomName('WebGLContextAttributes.premultipliedAlpha')
   bool get premultipliedAlpha native "WebGLContextAttributes_premultipliedAlpha_Getter";
 
-
-  /** @domName WebGLContextAttributes.premultipliedAlpha */
+  @DocsEditable
+  @DomName('WebGLContextAttributes.premultipliedAlpha')
   void set premultipliedAlpha(bool value) native "WebGLContextAttributes_premultipliedAlpha_Setter";
 
-
-  /** @domName WebGLContextAttributes.preserveDrawingBuffer */
+  @DocsEditable
+  @DomName('WebGLContextAttributes.preserveDrawingBuffer')
   bool get preserveDrawingBuffer native "WebGLContextAttributes_preserveDrawingBuffer_Getter";
 
-
-  /** @domName WebGLContextAttributes.preserveDrawingBuffer */
+  @DocsEditable
+  @DomName('WebGLContextAttributes.preserveDrawingBuffer')
   void set preserveDrawingBuffer(bool value) native "WebGLContextAttributes_preserveDrawingBuffer_Setter";
 
-
-  /** @domName WebGLContextAttributes.stencil */
+  @DocsEditable
+  @DomName('WebGLContextAttributes.stencil')
   bool get stencil native "WebGLContextAttributes_stencil_Getter";
 
-
-  /** @domName WebGLContextAttributes.stencil */
+  @DocsEditable
+  @DomName('WebGLContextAttributes.stencil')
   void set stencil(bool value) native "WebGLContextAttributes_stencil_Setter";
 
 }
@@ -24874,12 +25173,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLContextEvent
+@DocsEditable
+@DomName('WebGLContextEvent')
 class WebGLContextEvent extends Event {
   WebGLContextEvent.internal() : super.internal();
 
-
-  /** @domName WebGLContextEvent.statusMessage */
+  @DocsEditable
+  @DomName('WebGLContextEvent.statusMessage')
   String get statusMessage native "WebGLContextEvent_statusMessage_Getter";
 
 }
@@ -24890,7 +25190,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLDebugRendererInfo
+@DocsEditable
+@DomName('WebGLDebugRendererInfo')
 class WebGLDebugRendererInfo extends NativeFieldWrapperClass1 {
   WebGLDebugRendererInfo.internal();
 
@@ -24906,12 +25207,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLDebugShaders
+@DocsEditable
+@DomName('WebGLDebugShaders')
 class WebGLDebugShaders extends NativeFieldWrapperClass1 {
   WebGLDebugShaders.internal();
 
-
-  /** @domName WebGLDebugShaders.getTranslatedShaderSource */
+  @DocsEditable
+  @DomName('WebGLDebugShaders.getTranslatedShaderSource')
   String getTranslatedShaderSource(WebGLShader shader) native "WebGLDebugShaders_getTranslatedShaderSource_Callback";
 
 }
@@ -24922,7 +25224,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLDepthTexture
+@DocsEditable
+@DomName('WebGLDepthTexture')
 class WebGLDepthTexture extends NativeFieldWrapperClass1 {
   WebGLDepthTexture.internal();
 
@@ -24936,7 +25239,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLFramebuffer
+@DocsEditable
+@DomName('WebGLFramebuffer')
 class WebGLFramebuffer extends NativeFieldWrapperClass1 {
   WebGLFramebuffer.internal();
 
@@ -24948,16 +25252,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLLoseContext
+@DocsEditable
+@DomName('WebGLLoseContext')
 class WebGLLoseContext extends NativeFieldWrapperClass1 {
   WebGLLoseContext.internal();
 
-
-  /** @domName WebGLLoseContext.loseContext */
+  @DocsEditable
+  @DomName('WebGLLoseContext.loseContext')
   void loseContext() native "WebGLLoseContext_loseContext_Callback";
 
-
-  /** @domName WebGLLoseContext.restoreContext */
+  @DocsEditable
+  @DomName('WebGLLoseContext.restoreContext')
   void restoreContext() native "WebGLLoseContext_restoreContext_Callback";
 
 }
@@ -24968,7 +25273,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLProgram
+@DocsEditable
+@DomName('WebGLProgram')
 class WebGLProgram extends NativeFieldWrapperClass1 {
   WebGLProgram.internal();
 
@@ -24980,7 +25286,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLRenderbuffer
+@DocsEditable
+@DomName('WebGLRenderbuffer')
 class WebGLRenderbuffer extends NativeFieldWrapperClass1 {
   WebGLRenderbuffer.internal();
 
@@ -24992,7 +25299,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLRenderingContext
+@DocsEditable
+@DomName('WebGLRenderingContext')
 class WebGLRenderingContext extends CanvasRenderingContext {
   WebGLRenderingContext.internal() : super.internal();
 
@@ -25586,63 +25894,63 @@
 
   static const int ZERO = 0;
 
-
-  /** @domName WebGLRenderingContext.drawingBufferHeight */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.drawingBufferHeight')
   int get drawingBufferHeight native "WebGLRenderingContext_drawingBufferHeight_Getter";
 
-
-  /** @domName WebGLRenderingContext.drawingBufferWidth */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.drawingBufferWidth')
   int get drawingBufferWidth native "WebGLRenderingContext_drawingBufferWidth_Getter";
 
-
-  /** @domName WebGLRenderingContext.activeTexture */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.activeTexture')
   void activeTexture(int texture) native "WebGLRenderingContext_activeTexture_Callback";
 
-
-  /** @domName WebGLRenderingContext.attachShader */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.attachShader')
   void attachShader(WebGLProgram program, WebGLShader shader) native "WebGLRenderingContext_attachShader_Callback";
 
-
-  /** @domName WebGLRenderingContext.bindAttribLocation */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.bindAttribLocation')
   void bindAttribLocation(WebGLProgram program, int index, String name) native "WebGLRenderingContext_bindAttribLocation_Callback";
 
-
-  /** @domName WebGLRenderingContext.bindBuffer */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.bindBuffer')
   void bindBuffer(int target, WebGLBuffer buffer) native "WebGLRenderingContext_bindBuffer_Callback";
 
-
-  /** @domName WebGLRenderingContext.bindFramebuffer */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.bindFramebuffer')
   void bindFramebuffer(int target, WebGLFramebuffer framebuffer) native "WebGLRenderingContext_bindFramebuffer_Callback";
 
-
-  /** @domName WebGLRenderingContext.bindRenderbuffer */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.bindRenderbuffer')
   void bindRenderbuffer(int target, WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_bindRenderbuffer_Callback";
 
-
-  /** @domName WebGLRenderingContext.bindTexture */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.bindTexture')
   void bindTexture(int target, WebGLTexture texture) native "WebGLRenderingContext_bindTexture_Callback";
 
-
-  /** @domName WebGLRenderingContext.blendColor */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.blendColor')
   void blendColor(num red, num green, num blue, num alpha) native "WebGLRenderingContext_blendColor_Callback";
 
-
-  /** @domName WebGLRenderingContext.blendEquation */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.blendEquation')
   void blendEquation(int mode) native "WebGLRenderingContext_blendEquation_Callback";
 
-
-  /** @domName WebGLRenderingContext.blendEquationSeparate */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.blendEquationSeparate')
   void blendEquationSeparate(int modeRGB, int modeAlpha) native "WebGLRenderingContext_blendEquationSeparate_Callback";
 
-
-  /** @domName WebGLRenderingContext.blendFunc */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.blendFunc')
   void blendFunc(int sfactor, int dfactor) native "WebGLRenderingContext_blendFunc_Callback";
 
-
-  /** @domName WebGLRenderingContext.blendFuncSeparate */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.blendFuncSeparate')
   void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) native "WebGLRenderingContext_blendFuncSeparate_Callback";
 
-  void bufferData(/*unsigned long*/ target, data_OR_size, /*unsigned long*/ usage) {
+  void bufferData(int target, data_OR_size, int usage) {
     if ((target is int || target == null) && (data_OR_size is ArrayBuffer || data_OR_size == null) && (usage is int || usage == null)) {
       _bufferData_1(target, data_OR_size, usage);
       return;
@@ -25658,19 +25966,19 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName WebGLRenderingContext.bufferData_1 */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.bufferData_1')
   void _bufferData_1(target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_1_Callback";
 
-
-  /** @domName WebGLRenderingContext.bufferData_2 */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.bufferData_2')
   void _bufferData_2(target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_2_Callback";
 
-
-  /** @domName WebGLRenderingContext.bufferData_3 */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.bufferData_3')
   void _bufferData_3(target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_3_Callback";
 
-  void bufferSubData(/*unsigned long*/ target, /*long long*/ offset, data) {
+  void bufferSubData(int target, int offset, data) {
     if ((target is int || target == null) && (offset is int || offset == null) && (data is ArrayBuffer || data == null)) {
       _bufferSubData_1(target, offset, data);
       return;
@@ -25682,367 +25990,367 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName WebGLRenderingContext.bufferSubData_1 */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.bufferSubData_1')
   void _bufferSubData_1(target, offset, data) native "WebGLRenderingContext_bufferSubData_1_Callback";
 
-
-  /** @domName WebGLRenderingContext.bufferSubData_2 */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.bufferSubData_2')
   void _bufferSubData_2(target, offset, data) native "WebGLRenderingContext_bufferSubData_2_Callback";
 
-
-  /** @domName WebGLRenderingContext.checkFramebufferStatus */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.checkFramebufferStatus')
   int checkFramebufferStatus(int target) native "WebGLRenderingContext_checkFramebufferStatus_Callback";
 
-
-  /** @domName WebGLRenderingContext.clear */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.clear')
   void clear(int mask) native "WebGLRenderingContext_clear_Callback";
 
-
-  /** @domName WebGLRenderingContext.clearColor */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.clearColor')
   void clearColor(num red, num green, num blue, num alpha) native "WebGLRenderingContext_clearColor_Callback";
 
-
-  /** @domName WebGLRenderingContext.clearDepth */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.clearDepth')
   void clearDepth(num depth) native "WebGLRenderingContext_clearDepth_Callback";
 
-
-  /** @domName WebGLRenderingContext.clearStencil */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.clearStencil')
   void clearStencil(int s) native "WebGLRenderingContext_clearStencil_Callback";
 
-
-  /** @domName WebGLRenderingContext.colorMask */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.colorMask')
   void colorMask(bool red, bool green, bool blue, bool alpha) native "WebGLRenderingContext_colorMask_Callback";
 
-
-  /** @domName WebGLRenderingContext.compileShader */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.compileShader')
   void compileShader(WebGLShader shader) native "WebGLRenderingContext_compileShader_Callback";
 
-
-  /** @domName WebGLRenderingContext.compressedTexImage2D */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.compressedTexImage2D')
   void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, ArrayBufferView data) native "WebGLRenderingContext_compressedTexImage2D_Callback";
 
-
-  /** @domName WebGLRenderingContext.compressedTexSubImage2D */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.compressedTexSubImage2D')
   void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, ArrayBufferView data) native "WebGLRenderingContext_compressedTexSubImage2D_Callback";
 
-
-  /** @domName WebGLRenderingContext.copyTexImage2D */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.copyTexImage2D')
   void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) native "WebGLRenderingContext_copyTexImage2D_Callback";
 
-
-  /** @domName WebGLRenderingContext.copyTexSubImage2D */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.copyTexSubImage2D')
   void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) native "WebGLRenderingContext_copyTexSubImage2D_Callback";
 
-
-  /** @domName WebGLRenderingContext.createBuffer */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.createBuffer')
   WebGLBuffer createBuffer() native "WebGLRenderingContext_createBuffer_Callback";
 
-
-  /** @domName WebGLRenderingContext.createFramebuffer */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.createFramebuffer')
   WebGLFramebuffer createFramebuffer() native "WebGLRenderingContext_createFramebuffer_Callback";
 
-
-  /** @domName WebGLRenderingContext.createProgram */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.createProgram')
   WebGLProgram createProgram() native "WebGLRenderingContext_createProgram_Callback";
 
-
-  /** @domName WebGLRenderingContext.createRenderbuffer */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.createRenderbuffer')
   WebGLRenderbuffer createRenderbuffer() native "WebGLRenderingContext_createRenderbuffer_Callback";
 
-
-  /** @domName WebGLRenderingContext.createShader */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.createShader')
   WebGLShader createShader(int type) native "WebGLRenderingContext_createShader_Callback";
 
-
-  /** @domName WebGLRenderingContext.createTexture */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.createTexture')
   WebGLTexture createTexture() native "WebGLRenderingContext_createTexture_Callback";
 
-
-  /** @domName WebGLRenderingContext.cullFace */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.cullFace')
   void cullFace(int mode) native "WebGLRenderingContext_cullFace_Callback";
 
-
-  /** @domName WebGLRenderingContext.deleteBuffer */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.deleteBuffer')
   void deleteBuffer(WebGLBuffer buffer) native "WebGLRenderingContext_deleteBuffer_Callback";
 
-
-  /** @domName WebGLRenderingContext.deleteFramebuffer */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.deleteFramebuffer')
   void deleteFramebuffer(WebGLFramebuffer framebuffer) native "WebGLRenderingContext_deleteFramebuffer_Callback";
 
-
-  /** @domName WebGLRenderingContext.deleteProgram */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.deleteProgram')
   void deleteProgram(WebGLProgram program) native "WebGLRenderingContext_deleteProgram_Callback";
 
-
-  /** @domName WebGLRenderingContext.deleteRenderbuffer */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.deleteRenderbuffer')
   void deleteRenderbuffer(WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_deleteRenderbuffer_Callback";
 
-
-  /** @domName WebGLRenderingContext.deleteShader */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.deleteShader')
   void deleteShader(WebGLShader shader) native "WebGLRenderingContext_deleteShader_Callback";
 
-
-  /** @domName WebGLRenderingContext.deleteTexture */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.deleteTexture')
   void deleteTexture(WebGLTexture texture) native "WebGLRenderingContext_deleteTexture_Callback";
 
-
-  /** @domName WebGLRenderingContext.depthFunc */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.depthFunc')
   void depthFunc(int func) native "WebGLRenderingContext_depthFunc_Callback";
 
-
-  /** @domName WebGLRenderingContext.depthMask */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.depthMask')
   void depthMask(bool flag) native "WebGLRenderingContext_depthMask_Callback";
 
-
-  /** @domName WebGLRenderingContext.depthRange */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.depthRange')
   void depthRange(num zNear, num zFar) native "WebGLRenderingContext_depthRange_Callback";
 
-
-  /** @domName WebGLRenderingContext.detachShader */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.detachShader')
   void detachShader(WebGLProgram program, WebGLShader shader) native "WebGLRenderingContext_detachShader_Callback";
 
-
-  /** @domName WebGLRenderingContext.disable */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.disable')
   void disable(int cap) native "WebGLRenderingContext_disable_Callback";
 
-
-  /** @domName WebGLRenderingContext.disableVertexAttribArray */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.disableVertexAttribArray')
   void disableVertexAttribArray(int index) native "WebGLRenderingContext_disableVertexAttribArray_Callback";
 
-
-  /** @domName WebGLRenderingContext.drawArrays */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.drawArrays')
   void drawArrays(int mode, int first, int count) native "WebGLRenderingContext_drawArrays_Callback";
 
-
-  /** @domName WebGLRenderingContext.drawElements */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.drawElements')
   void drawElements(int mode, int count, int type, int offset) native "WebGLRenderingContext_drawElements_Callback";
 
-
-  /** @domName WebGLRenderingContext.enable */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.enable')
   void enable(int cap) native "WebGLRenderingContext_enable_Callback";
 
-
-  /** @domName WebGLRenderingContext.enableVertexAttribArray */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.enableVertexAttribArray')
   void enableVertexAttribArray(int index) native "WebGLRenderingContext_enableVertexAttribArray_Callback";
 
-
-  /** @domName WebGLRenderingContext.finish */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.finish')
   void finish() native "WebGLRenderingContext_finish_Callback";
 
-
-  /** @domName WebGLRenderingContext.flush */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.flush')
   void flush() native "WebGLRenderingContext_flush_Callback";
 
-
-  /** @domName WebGLRenderingContext.framebufferRenderbuffer */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.framebufferRenderbuffer')
   void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_framebufferRenderbuffer_Callback";
 
-
-  /** @domName WebGLRenderingContext.framebufferTexture2D */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.framebufferTexture2D')
   void framebufferTexture2D(int target, int attachment, int textarget, WebGLTexture texture, int level) native "WebGLRenderingContext_framebufferTexture2D_Callback";
 
-
-  /** @domName WebGLRenderingContext.frontFace */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.frontFace')
   void frontFace(int mode) native "WebGLRenderingContext_frontFace_Callback";
 
-
-  /** @domName WebGLRenderingContext.generateMipmap */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.generateMipmap')
   void generateMipmap(int target) native "WebGLRenderingContext_generateMipmap_Callback";
 
-
-  /** @domName WebGLRenderingContext.getActiveAttrib */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getActiveAttrib')
   WebGLActiveInfo getActiveAttrib(WebGLProgram program, int index) native "WebGLRenderingContext_getActiveAttrib_Callback";
 
-
-  /** @domName WebGLRenderingContext.getActiveUniform */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getActiveUniform')
   WebGLActiveInfo getActiveUniform(WebGLProgram program, int index) native "WebGLRenderingContext_getActiveUniform_Callback";
 
-
-  /** @domName WebGLRenderingContext.getAttachedShaders */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getAttachedShaders')
   void getAttachedShaders(WebGLProgram program) native "WebGLRenderingContext_getAttachedShaders_Callback";
 
-
-  /** @domName WebGLRenderingContext.getAttribLocation */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getAttribLocation')
   int getAttribLocation(WebGLProgram program, String name) native "WebGLRenderingContext_getAttribLocation_Callback";
 
-
-  /** @domName WebGLRenderingContext.getBufferParameter */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getBufferParameter')
   Object getBufferParameter(int target, int pname) native "WebGLRenderingContext_getBufferParameter_Callback";
 
-
-  /** @domName WebGLRenderingContext.getContextAttributes */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getContextAttributes')
   WebGLContextAttributes getContextAttributes() native "WebGLRenderingContext_getContextAttributes_Callback";
 
-
-  /** @domName WebGLRenderingContext.getError */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getError')
   int getError() native "WebGLRenderingContext_getError_Callback";
 
-
-  /** @domName WebGLRenderingContext.getExtension */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getExtension')
   Object getExtension(String name) native "WebGLRenderingContext_getExtension_Callback";
 
-
-  /** @domName WebGLRenderingContext.getFramebufferAttachmentParameter */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getFramebufferAttachmentParameter')
   Object getFramebufferAttachmentParameter(int target, int attachment, int pname) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";
 
-
-  /** @domName WebGLRenderingContext.getParameter */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getParameter')
   Object getParameter(int pname) native "WebGLRenderingContext_getParameter_Callback";
 
-
-  /** @domName WebGLRenderingContext.getProgramInfoLog */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getProgramInfoLog')
   String getProgramInfoLog(WebGLProgram program) native "WebGLRenderingContext_getProgramInfoLog_Callback";
 
-
-  /** @domName WebGLRenderingContext.getProgramParameter */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getProgramParameter')
   Object getProgramParameter(WebGLProgram program, int pname) native "WebGLRenderingContext_getProgramParameter_Callback";
 
-
-  /** @domName WebGLRenderingContext.getRenderbufferParameter */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getRenderbufferParameter')
   Object getRenderbufferParameter(int target, int pname) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
 
-
-  /** @domName WebGLRenderingContext.getShaderInfoLog */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getShaderInfoLog')
   String getShaderInfoLog(WebGLShader shader) native "WebGLRenderingContext_getShaderInfoLog_Callback";
 
-
-  /** @domName WebGLRenderingContext.getShaderParameter */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getShaderParameter')
   Object getShaderParameter(WebGLShader shader, int pname) native "WebGLRenderingContext_getShaderParameter_Callback";
 
-
-  /** @domName WebGLRenderingContext.getShaderPrecisionFormat */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getShaderPrecisionFormat')
   WebGLShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback";
 
-
-  /** @domName WebGLRenderingContext.getShaderSource */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getShaderSource')
   String getShaderSource(WebGLShader shader) native "WebGLRenderingContext_getShaderSource_Callback";
 
-
-  /** @domName WebGLRenderingContext.getSupportedExtensions */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getSupportedExtensions')
   List<String> getSupportedExtensions() native "WebGLRenderingContext_getSupportedExtensions_Callback";
 
-
-  /** @domName WebGLRenderingContext.getTexParameter */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getTexParameter')
   Object getTexParameter(int target, int pname) native "WebGLRenderingContext_getTexParameter_Callback";
 
-
-  /** @domName WebGLRenderingContext.getUniform */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getUniform')
   Object getUniform(WebGLProgram program, WebGLUniformLocation location) native "WebGLRenderingContext_getUniform_Callback";
 
-
-  /** @domName WebGLRenderingContext.getUniformLocation */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getUniformLocation')
   WebGLUniformLocation getUniformLocation(WebGLProgram program, String name) native "WebGLRenderingContext_getUniformLocation_Callback";
 
-
-  /** @domName WebGLRenderingContext.getVertexAttrib */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getVertexAttrib')
   Object getVertexAttrib(int index, int pname) native "WebGLRenderingContext_getVertexAttrib_Callback";
 
-
-  /** @domName WebGLRenderingContext.getVertexAttribOffset */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.getVertexAttribOffset')
   int getVertexAttribOffset(int index, int pname) native "WebGLRenderingContext_getVertexAttribOffset_Callback";
 
-
-  /** @domName WebGLRenderingContext.hint */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.hint')
   void hint(int target, int mode) native "WebGLRenderingContext_hint_Callback";
 
-
-  /** @domName WebGLRenderingContext.isBuffer */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.isBuffer')
   bool isBuffer(WebGLBuffer buffer) native "WebGLRenderingContext_isBuffer_Callback";
 
-
-  /** @domName WebGLRenderingContext.isContextLost */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.isContextLost')
   bool isContextLost() native "WebGLRenderingContext_isContextLost_Callback";
 
-
-  /** @domName WebGLRenderingContext.isEnabled */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.isEnabled')
   bool isEnabled(int cap) native "WebGLRenderingContext_isEnabled_Callback";
 
-
-  /** @domName WebGLRenderingContext.isFramebuffer */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.isFramebuffer')
   bool isFramebuffer(WebGLFramebuffer framebuffer) native "WebGLRenderingContext_isFramebuffer_Callback";
 
-
-  /** @domName WebGLRenderingContext.isProgram */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.isProgram')
   bool isProgram(WebGLProgram program) native "WebGLRenderingContext_isProgram_Callback";
 
-
-  /** @domName WebGLRenderingContext.isRenderbuffer */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.isRenderbuffer')
   bool isRenderbuffer(WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_isRenderbuffer_Callback";
 
-
-  /** @domName WebGLRenderingContext.isShader */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.isShader')
   bool isShader(WebGLShader shader) native "WebGLRenderingContext_isShader_Callback";
 
-
-  /** @domName WebGLRenderingContext.isTexture */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.isTexture')
   bool isTexture(WebGLTexture texture) native "WebGLRenderingContext_isTexture_Callback";
 
-
-  /** @domName WebGLRenderingContext.lineWidth */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.lineWidth')
   void lineWidth(num width) native "WebGLRenderingContext_lineWidth_Callback";
 
-
-  /** @domName WebGLRenderingContext.linkProgram */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.linkProgram')
   void linkProgram(WebGLProgram program) native "WebGLRenderingContext_linkProgram_Callback";
 
-
-  /** @domName WebGLRenderingContext.pixelStorei */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.pixelStorei')
   void pixelStorei(int pname, int param) native "WebGLRenderingContext_pixelStorei_Callback";
 
-
-  /** @domName WebGLRenderingContext.polygonOffset */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.polygonOffset')
   void polygonOffset(num factor, num units) native "WebGLRenderingContext_polygonOffset_Callback";
 
-
-  /** @domName WebGLRenderingContext.readPixels */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.readPixels')
   void readPixels(int x, int y, int width, int height, int format, int type, ArrayBufferView pixels) native "WebGLRenderingContext_readPixels_Callback";
 
-
-  /** @domName WebGLRenderingContext.releaseShaderCompiler */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.releaseShaderCompiler')
   void releaseShaderCompiler() native "WebGLRenderingContext_releaseShaderCompiler_Callback";
 
-
-  /** @domName WebGLRenderingContext.renderbufferStorage */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.renderbufferStorage')
   void renderbufferStorage(int target, int internalformat, int width, int height) native "WebGLRenderingContext_renderbufferStorage_Callback";
 
-
-  /** @domName WebGLRenderingContext.sampleCoverage */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.sampleCoverage')
   void sampleCoverage(num value, bool invert) native "WebGLRenderingContext_sampleCoverage_Callback";
 
-
-  /** @domName WebGLRenderingContext.scissor */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.scissor')
   void scissor(int x, int y, int width, int height) native "WebGLRenderingContext_scissor_Callback";
 
-
-  /** @domName WebGLRenderingContext.shaderSource */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.shaderSource')
   void shaderSource(WebGLShader shader, String string) native "WebGLRenderingContext_shaderSource_Callback";
 
-
-  /** @domName WebGLRenderingContext.stencilFunc */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.stencilFunc')
   void stencilFunc(int func, int ref, int mask) native "WebGLRenderingContext_stencilFunc_Callback";
 
-
-  /** @domName WebGLRenderingContext.stencilFuncSeparate */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.stencilFuncSeparate')
   void stencilFuncSeparate(int face, int func, int ref, int mask) native "WebGLRenderingContext_stencilFuncSeparate_Callback";
 
-
-  /** @domName WebGLRenderingContext.stencilMask */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.stencilMask')
   void stencilMask(int mask) native "WebGLRenderingContext_stencilMask_Callback";
 
-
-  /** @domName WebGLRenderingContext.stencilMaskSeparate */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.stencilMaskSeparate')
   void stencilMaskSeparate(int face, int mask) native "WebGLRenderingContext_stencilMaskSeparate_Callback";
 
-
-  /** @domName WebGLRenderingContext.stencilOp */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.stencilOp')
   void stencilOp(int fail, int zfail, int zpass) native "WebGLRenderingContext_stencilOp_Callback";
 
-
-  /** @domName WebGLRenderingContext.stencilOpSeparate */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.stencilOpSeparate')
   void stencilOpSeparate(int face, int fail, int zfail, int zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback";
 
-  void texImage2D(/*unsigned long*/ target, /*long*/ level, /*unsigned long*/ internalformat, /*long*/ format_OR_width, /*long*/ height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [/*unsigned long*/ format, /*unsigned long*/ type, /*ArrayBufferView*/ pixels]) {
+  void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, ArrayBufferView pixels]) {
     if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (format is int || format == null) && (type is int || type == null) && (pixels is ArrayBufferView || pixels == null)) {
       _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
       return;
@@ -26066,35 +26374,35 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName WebGLRenderingContext.texImage2D_1 */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.texImage2D_1')
   void _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContext_texImage2D_1_Callback";
 
-
-  /** @domName WebGLRenderingContext.texImage2D_2 */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.texImage2D_2')
   void _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_2_Callback";
 
-
-  /** @domName WebGLRenderingContext.texImage2D_3 */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.texImage2D_3')
   void _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_3_Callback";
 
-
-  /** @domName WebGLRenderingContext.texImage2D_4 */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.texImage2D_4')
   void _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_4_Callback";
 
-
-  /** @domName WebGLRenderingContext.texImage2D_5 */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.texImage2D_5')
   void _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_5_Callback";
 
-
-  /** @domName WebGLRenderingContext.texParameterf */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.texParameterf')
   void texParameterf(int target, int pname, num param) native "WebGLRenderingContext_texParameterf_Callback";
 
-
-  /** @domName WebGLRenderingContext.texParameteri */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.texParameteri')
   void texParameteri(int target, int pname, int param) native "WebGLRenderingContext_texParameteri_Callback";
 
-  void texSubImage2D(/*unsigned long*/ target, /*long*/ level, /*long*/ xoffset, /*long*/ yoffset, /*long*/ format_OR_width, /*long*/ height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [/*unsigned long*/ type, /*ArrayBufferView*/ pixels]) {
+  void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, ArrayBufferView pixels]) {
     if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (type is int || type == null) && (pixels is ArrayBufferView || pixels == null)) {
       _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
       return;
@@ -26118,148 +26426,148 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName WebGLRenderingContext.texSubImage2D_1 */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.texSubImage2D_1')
   void _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContext_texSubImage2D_1_Callback";
 
-
-  /** @domName WebGLRenderingContext.texSubImage2D_2 */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.texSubImage2D_2')
   void _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_2_Callback";
 
-
-  /** @domName WebGLRenderingContext.texSubImage2D_3 */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.texSubImage2D_3')
   void _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_3_Callback";
 
-
-  /** @domName WebGLRenderingContext.texSubImage2D_4 */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.texSubImage2D_4')
   void _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_4_Callback";
 
-
-  /** @domName WebGLRenderingContext.texSubImage2D_5 */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.texSubImage2D_5')
   void _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_5_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniform1f */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniform1f')
   void uniform1f(WebGLUniformLocation location, num x) native "WebGLRenderingContext_uniform1f_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniform1fv */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniform1fv')
   void uniform1fv(WebGLUniformLocation location, Float32Array v) native "WebGLRenderingContext_uniform1fv_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniform1i */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniform1i')
   void uniform1i(WebGLUniformLocation location, int x) native "WebGLRenderingContext_uniform1i_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniform1iv */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniform1iv')
   void uniform1iv(WebGLUniformLocation location, Int32Array v) native "WebGLRenderingContext_uniform1iv_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniform2f */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniform2f')
   void uniform2f(WebGLUniformLocation location, num x, num y) native "WebGLRenderingContext_uniform2f_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniform2fv */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniform2fv')
   void uniform2fv(WebGLUniformLocation location, Float32Array v) native "WebGLRenderingContext_uniform2fv_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniform2i */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniform2i')
   void uniform2i(WebGLUniformLocation location, int x, int y) native "WebGLRenderingContext_uniform2i_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniform2iv */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniform2iv')
   void uniform2iv(WebGLUniformLocation location, Int32Array v) native "WebGLRenderingContext_uniform2iv_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniform3f */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniform3f')
   void uniform3f(WebGLUniformLocation location, num x, num y, num z) native "WebGLRenderingContext_uniform3f_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniform3fv */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniform3fv')
   void uniform3fv(WebGLUniformLocation location, Float32Array v) native "WebGLRenderingContext_uniform3fv_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniform3i */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniform3i')
   void uniform3i(WebGLUniformLocation location, int x, int y, int z) native "WebGLRenderingContext_uniform3i_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniform3iv */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniform3iv')
   void uniform3iv(WebGLUniformLocation location, Int32Array v) native "WebGLRenderingContext_uniform3iv_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniform4f */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniform4f')
   void uniform4f(WebGLUniformLocation location, num x, num y, num z, num w) native "WebGLRenderingContext_uniform4f_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniform4fv */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniform4fv')
   void uniform4fv(WebGLUniformLocation location, Float32Array v) native "WebGLRenderingContext_uniform4fv_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniform4i */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniform4i')
   void uniform4i(WebGLUniformLocation location, int x, int y, int z, int w) native "WebGLRenderingContext_uniform4i_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniform4iv */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniform4iv')
   void uniform4iv(WebGLUniformLocation location, Int32Array v) native "WebGLRenderingContext_uniform4iv_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniformMatrix2fv */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniformMatrix2fv')
   void uniformMatrix2fv(WebGLUniformLocation location, bool transpose, Float32Array array) native "WebGLRenderingContext_uniformMatrix2fv_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniformMatrix3fv */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniformMatrix3fv')
   void uniformMatrix3fv(WebGLUniformLocation location, bool transpose, Float32Array array) native "WebGLRenderingContext_uniformMatrix3fv_Callback";
 
-
-  /** @domName WebGLRenderingContext.uniformMatrix4fv */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.uniformMatrix4fv')
   void uniformMatrix4fv(WebGLUniformLocation location, bool transpose, Float32Array array) native "WebGLRenderingContext_uniformMatrix4fv_Callback";
 
-
-  /** @domName WebGLRenderingContext.useProgram */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.useProgram')
   void useProgram(WebGLProgram program) native "WebGLRenderingContext_useProgram_Callback";
 
-
-  /** @domName WebGLRenderingContext.validateProgram */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.validateProgram')
   void validateProgram(WebGLProgram program) native "WebGLRenderingContext_validateProgram_Callback";
 
-
-  /** @domName WebGLRenderingContext.vertexAttrib1f */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.vertexAttrib1f')
   void vertexAttrib1f(int indx, num x) native "WebGLRenderingContext_vertexAttrib1f_Callback";
 
-
-  /** @domName WebGLRenderingContext.vertexAttrib1fv */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.vertexAttrib1fv')
   void vertexAttrib1fv(int indx, Float32Array values) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
 
-
-  /** @domName WebGLRenderingContext.vertexAttrib2f */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.vertexAttrib2f')
   void vertexAttrib2f(int indx, num x, num y) native "WebGLRenderingContext_vertexAttrib2f_Callback";
 
-
-  /** @domName WebGLRenderingContext.vertexAttrib2fv */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.vertexAttrib2fv')
   void vertexAttrib2fv(int indx, Float32Array values) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
 
-
-  /** @domName WebGLRenderingContext.vertexAttrib3f */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.vertexAttrib3f')
   void vertexAttrib3f(int indx, num x, num y, num z) native "WebGLRenderingContext_vertexAttrib3f_Callback";
 
-
-  /** @domName WebGLRenderingContext.vertexAttrib3fv */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.vertexAttrib3fv')
   void vertexAttrib3fv(int indx, Float32Array values) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
 
-
-  /** @domName WebGLRenderingContext.vertexAttrib4f */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.vertexAttrib4f')
   void vertexAttrib4f(int indx, num x, num y, num z, num w) native "WebGLRenderingContext_vertexAttrib4f_Callback";
 
-
-  /** @domName WebGLRenderingContext.vertexAttrib4fv */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.vertexAttrib4fv')
   void vertexAttrib4fv(int indx, Float32Array values) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
 
-
-  /** @domName WebGLRenderingContext.vertexAttribPointer */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.vertexAttribPointer')
   void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) native "WebGLRenderingContext_vertexAttribPointer_Callback";
 
-
-  /** @domName WebGLRenderingContext.viewport */
+  @DocsEditable
+  @DomName('WebGLRenderingContext.viewport')
   void viewport(int x, int y, int width, int height) native "WebGLRenderingContext_viewport_Callback";
 
 }
@@ -26270,7 +26578,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLShader
+@DocsEditable
+@DomName('WebGLShader')
 class WebGLShader extends NativeFieldWrapperClass1 {
   WebGLShader.internal();
 
@@ -26282,20 +26591,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLShaderPrecisionFormat
+@DocsEditable
+@DomName('WebGLShaderPrecisionFormat')
 class WebGLShaderPrecisionFormat extends NativeFieldWrapperClass1 {
   WebGLShaderPrecisionFormat.internal();
 
-
-  /** @domName WebGLShaderPrecisionFormat.precision */
+  @DocsEditable
+  @DomName('WebGLShaderPrecisionFormat.precision')
   int get precision native "WebGLShaderPrecisionFormat_precision_Getter";
 
-
-  /** @domName WebGLShaderPrecisionFormat.rangeMax */
+  @DocsEditable
+  @DomName('WebGLShaderPrecisionFormat.rangeMax')
   int get rangeMax native "WebGLShaderPrecisionFormat_rangeMax_Getter";
 
-
-  /** @domName WebGLShaderPrecisionFormat.rangeMin */
+  @DocsEditable
+  @DomName('WebGLShaderPrecisionFormat.rangeMin')
   int get rangeMin native "WebGLShaderPrecisionFormat_rangeMin_Getter";
 
 }
@@ -26306,7 +26616,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLTexture
+@DocsEditable
+@DomName('WebGLTexture')
 class WebGLTexture extends NativeFieldWrapperClass1 {
   WebGLTexture.internal();
 
@@ -26318,7 +26629,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLUniformLocation
+@DocsEditable
+@DomName('WebGLUniformLocation')
 class WebGLUniformLocation extends NativeFieldWrapperClass1 {
   WebGLUniformLocation.internal();
 
@@ -26330,7 +26642,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebGLVertexArrayObjectOES
+@DocsEditable
+@DomName('WebGLVertexArrayObjectOES')
 class WebGLVertexArrayObject extends NativeFieldWrapperClass1 {
   WebGLVertexArrayObject.internal();
 
@@ -26342,7 +26655,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebKitCSSFilterValue
+@DocsEditable
+@DomName('WebKitCSSFilterValue')
 class WebKitCssFilterValue extends _CssValueList {
   WebKitCssFilterValue.internal() : super.internal();
 
@@ -26370,8 +26684,8 @@
 
   static const int CSS_FILTER_SEPIA = 3;
 
-
-  /** @domName WebKitCSSFilterValue.operationType */
+  @DocsEditable
+  @DomName('WebKitCSSFilterValue.operationType')
   int get operationType native "WebKitCSSFilterValue_operationType_Getter";
 
 }
@@ -26382,7 +26696,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebKitCSSMixFunctionValue
+@DocsEditable
+@DomName('WebKitCSSMixFunctionValue')
 class WebKitCssMixFunctionValue extends _CssValueList {
   WebKitCssMixFunctionValue.internal() : super.internal();
 
@@ -26394,44 +26709,45 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebKitNamedFlow
+@DocsEditable
+@DomName('WebKitNamedFlow')
 class WebKitNamedFlow extends EventTarget {
   WebKitNamedFlow.internal() : super.internal();
 
-
-  /** @domName WebKitNamedFlow.firstEmptyRegionIndex */
+  @DocsEditable
+  @DomName('WebKitNamedFlow.firstEmptyRegionIndex')
   int get firstEmptyRegionIndex native "WebKitNamedFlow_firstEmptyRegionIndex_Getter";
 
-
-  /** @domName WebKitNamedFlow.name */
+  @DocsEditable
+  @DomName('WebKitNamedFlow.name')
   String get name native "WebKitNamedFlow_name_Getter";
 
-
-  /** @domName WebKitNamedFlow.overset */
+  @DocsEditable
+  @DomName('WebKitNamedFlow.overset')
   bool get overset native "WebKitNamedFlow_overset_Getter";
 
-
-  /** @domName WebKitNamedFlow.addEventListener */
+  @DocsEditable
+  @DomName('WebKitNamedFlow.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitNamedFlow_addEventListener_Callback";
 
-
-  /** @domName WebKitNamedFlow.dispatchEvent */
+  @DocsEditable
+  @DomName('WebKitNamedFlow.dispatchEvent')
   bool $dom_dispatchEvent(Event event) native "WebKitNamedFlow_dispatchEvent_Callback";
 
-
-  /** @domName WebKitNamedFlow.getContent */
+  @DocsEditable
+  @DomName('WebKitNamedFlow.getContent')
   List<Node> getContent() native "WebKitNamedFlow_getContent_Callback";
 
-
-  /** @domName WebKitNamedFlow.getRegions */
+  @DocsEditable
+  @DomName('WebKitNamedFlow.getRegions')
   List<Node> getRegions() native "WebKitNamedFlow_getRegions_Callback";
 
-
-  /** @domName WebKitNamedFlow.getRegionsByContent */
+  @DocsEditable
+  @DomName('WebKitNamedFlow.getRegionsByContent')
   List<Node> getRegionsByContent(Node contentNode) native "WebKitNamedFlow_getRegionsByContent_Callback";
 
-
-  /** @domName WebKitNamedFlow.removeEventListener */
+  @DocsEditable
+  @DomName('WebKitNamedFlow.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitNamedFlow_removeEventListener_Callback";
 
 }
@@ -26442,7 +26758,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WebSocket
+@DocsEditable
+@DomName('WebSocket')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -26458,14 +26775,15 @@
 
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
 
-  ///@docsEditable true
+  @DocsEditable
   factory WebSocket(String url) => WebSocket._create(url);
   static WebSocket _create(String url) native "WebSocket_constructor_Callback";
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   WebSocketEvents get on =>
     new WebSocketEvents(this);
 
@@ -26477,43 +26795,43 @@
 
   static const int OPEN = 1;
 
-
-  /** @domName WebSocket.URL */
+  @DocsEditable
+  @DomName('WebSocket.URL')
   String get Url native "WebSocket_URL_Getter";
 
-
-  /** @domName WebSocket.binaryType */
+  @DocsEditable
+  @DomName('WebSocket.binaryType')
   String get binaryType native "WebSocket_binaryType_Getter";
 
-
-  /** @domName WebSocket.binaryType */
+  @DocsEditable
+  @DomName('WebSocket.binaryType')
   void set binaryType(String value) native "WebSocket_binaryType_Setter";
 
-
-  /** @domName WebSocket.bufferedAmount */
+  @DocsEditable
+  @DomName('WebSocket.bufferedAmount')
   int get bufferedAmount native "WebSocket_bufferedAmount_Getter";
 
-
-  /** @domName WebSocket.extensions */
+  @DocsEditable
+  @DomName('WebSocket.extensions')
   String get extensions native "WebSocket_extensions_Getter";
 
-
-  /** @domName WebSocket.protocol */
+  @DocsEditable
+  @DomName('WebSocket.protocol')
   String get protocol native "WebSocket_protocol_Getter";
 
-
-  /** @domName WebSocket.readyState */
+  @DocsEditable
+  @DomName('WebSocket.readyState')
   int get readyState native "WebSocket_readyState_Getter";
 
-
-  /** @domName WebSocket.url */
+  @DocsEditable
+  @DomName('WebSocket.url')
   String get url native "WebSocket_url_Getter";
 
-
-  /** @domName WebSocket.addEventListener */
+  @DocsEditable
+  @DomName('WebSocket.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_addEventListener_Callback";
 
-  void close([/*unsigned short*/ code, /*DOMString*/ reason]) {
+  void close([int code, String reason]) {
     if (?reason) {
       _close_1(code, reason);
       return;
@@ -26525,28 +26843,28 @@
     _close_3();
   }
 
-
-  /** @domName WebSocket.close_1 */
+  @DocsEditable
+  @DomName('WebSocket.close_1')
   void _close_1(code, reason) native "WebSocket_close_1_Callback";
 
-
-  /** @domName WebSocket.close_2 */
+  @DocsEditable
+  @DomName('WebSocket.close_2')
   void _close_2(code) native "WebSocket_close_2_Callback";
 
-
-  /** @domName WebSocket.close_3 */
+  @DocsEditable
+  @DomName('WebSocket.close_3')
   void _close_3() native "WebSocket_close_3_Callback";
 
-
-  /** @domName WebSocket.dispatchEvent */
+  @DocsEditable
+  @DomName('WebSocket.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "WebSocket_dispatchEvent_Callback";
 
-
-  /** @domName WebSocket.removeEventListener */
+  @DocsEditable
+  @DomName('WebSocket.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_removeEventListener_Callback";
 
-
-  /** @domName WebSocket.send */
+  @DocsEditable
+  @DomName('WebSocket.send')
   void send(data) native "WebSocket_send_Callback";
 
   Stream<CloseEvent> get onClose => closeEvent.forTarget(this);
@@ -26559,21 +26877,21 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class WebSocketEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   WebSocketEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get close => this['close'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get message => this['message'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get open => this['open'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26581,32 +26899,58 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WheelEvent
+@DocsEditable
+@DomName('WheelEvent')
 class WheelEvent extends MouseEvent {
+
+  factory WheelEvent(String type, Window view, int wheelDeltaX, int wheelDeltaY,
+      int detail, int screenX, int screenY, int clientX, int clientY,
+      int button,
+      [bool canBubble = true, bool cancelable = true, bool ctrlKey = false,
+      bool altKey = false, bool shiftKey = false, bool metaKey = false,
+      EventTarget relatedTarget = null]) {
+
+    var eventType = 'WheelEvent';
+    if (_Device.isFirefox) {
+      eventType = 'MouseScrollEvents';
+    }
+    final event = document.$dom_createEvent(eventType);
+      // Fallthrough for Dartium.
+      event.$dom_initMouseEvent(type, canBubble, cancelable, view, detail,
+          screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
+          metaKey, button, relatedTarget);
+      event.$dom_initWebKitWheelEvent(wheelDeltaX,
+          wheelDeltaY ~/ 120, // Chrome does an auto-convert to pixels.
+          view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
+          metaKey);
+
+    return event;
+  }
+
   WheelEvent.internal() : super.internal();
 
-
-  /** @domName WheelEvent.webkitDirectionInvertedFromDevice */
+  @DocsEditable
+  @DomName('WheelEvent.webkitDirectionInvertedFromDevice')
   bool get webkitDirectionInvertedFromDevice native "WheelEvent_webkitDirectionInvertedFromDevice_Getter";
 
-
-  /** @domName WheelEvent.wheelDeltaX */
+  @DocsEditable
+  @DomName('WheelEvent.wheelDeltaX')
   int get $dom_wheelDeltaX native "WheelEvent_wheelDeltaX_Getter";
 
-
-  /** @domName WheelEvent.wheelDeltaY */
+  @DocsEditable
+  @DomName('WheelEvent.wheelDeltaY')
   int get $dom_wheelDeltaY native "WheelEvent_wheelDeltaY_Getter";
 
-
-  /** @domName WheelEvent.initWebKitWheelEvent */
-  void initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native "WheelEvent_initWebKitWheelEvent_Callback";
+  @DocsEditable
+  @DomName('WheelEvent.initWebKitWheelEvent')
+  void $dom_initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native "WheelEvent_initWebKitWheelEvent_Callback";
 
 
-  /** @domName WheelEvent.deltaX */
+  @DomName('WheelEvent.deltaX')
   num get deltaX => $dom_wheelDeltaX;
-  /** @domName WheelEvent.deltaY */
+  @DomName('WheelEvent.deltaY')
   num get deltaY => $dom_wheelDeltaY;
-  /** @domName WheelEvent.deltaMode */
+  @DomName('WheelEvent.deltaMode')
   int get deltaMode => 0;
 
 }
@@ -26615,7 +26959,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Window
+@DocsEditable
+@DomName('Window')
 class Window extends EventTarget implements WindowBase {
 
   /**
@@ -26650,86 +26995,16 @@
 
   static const EventStreamProvider<Event> contentLoadedEvent = const EventStreamProvider<Event>('DOMContentLoaded');
 
-  static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
-
   static const EventStreamProvider<Event> beforeUnloadEvent = const EventStreamProvider<Event>('beforeunload');
 
-  static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
-
-  static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');
-
-  static const EventStreamProvider<Event> canPlayThroughEvent = const EventStreamProvider<Event>('canplaythrough');
-
-  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
-
-  static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
-
-  static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
-
-  static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
-
   static const EventStreamProvider<DeviceMotionEvent> deviceMotionEvent = const EventStreamProvider<DeviceMotionEvent>('devicemotion');
 
   static const EventStreamProvider<DeviceOrientationEvent> deviceOrientationEvent = const EventStreamProvider<DeviceOrientationEvent>('deviceorientation');
 
-  static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
-
-  static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
-
-  static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
-
-  static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
-
-  static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
-
-  static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
-
-  static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
-
-  static const EventStreamProvider<Event> durationChangeEvent = const EventStreamProvider<Event>('durationchange');
-
-  static const EventStreamProvider<Event> emptiedEvent = const EventStreamProvider<Event>('emptied');
-
-  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
-
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
-
-  static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
-
   static const EventStreamProvider<HashChangeEvent> hashChangeEvent = const EventStreamProvider<HashChangeEvent>('hashchange');
 
-  static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
-
-  static const EventStreamProvider<Event> invalidEvent = const EventStreamProvider<Event>('invalid');
-
-  static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
-
-  static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
-
-  static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
-
-  static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
-
-  static const EventStreamProvider<Event> loadedDataEvent = const EventStreamProvider<Event>('loadeddata');
-
-  static const EventStreamProvider<Event> loadedMetadataEvent = const EventStreamProvider<Event>('loadedmetadata');
-
-  static const EventStreamProvider<Event> loadStartEvent = const EventStreamProvider<Event>('loadstart');
-
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
-  static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
-
-  static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
-
-  static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
-
-  static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
-
-  static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
-
-  static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
-
   static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');
 
   static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');
@@ -26738,65 +27013,22 @@
 
   static const EventStreamProvider<Event> pageShowEvent = const EventStreamProvider<Event>('pageshow');
 
-  static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
-
-  static const EventStreamProvider<Event> playEvent = const EventStreamProvider<Event>('play');
-
-  static const EventStreamProvider<Event> playingEvent = const EventStreamProvider<Event>('playing');
-
   static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
 
-  static const EventStreamProvider<Event> progressEvent = const EventStreamProvider<Event>('progress');
-
-  static const EventStreamProvider<Event> rateChangeEvent = const EventStreamProvider<Event>('ratechange');
-
-  static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
-
   static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
 
-  static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
-
-  static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
-
-  static const EventStreamProvider<Event> seekedEvent = const EventStreamProvider<Event>('seeked');
-
-  static const EventStreamProvider<Event> seekingEvent = const EventStreamProvider<Event>('seeking');
-
-  static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
-
-  static const EventStreamProvider<Event> stalledEvent = const EventStreamProvider<Event>('stalled');
-
   static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');
 
-  static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
-
-  static const EventStreamProvider<Event> suspendEvent = const EventStreamProvider<Event>('suspend');
-
-  static const EventStreamProvider<Event> timeUpdateEvent = const EventStreamProvider<Event>('timeupdate');
-
-  static const EventStreamProvider<TouchEvent> touchCancelEvent = const EventStreamProvider<TouchEvent>('touchcancel');
-
-  static const EventStreamProvider<TouchEvent> touchEndEvent = const EventStreamProvider<TouchEvent>('touchend');
-
-  static const EventStreamProvider<TouchEvent> touchMoveEvent = const EventStreamProvider<TouchEvent>('touchmove');
-
-  static const EventStreamProvider<TouchEvent> touchStartEvent = const EventStreamProvider<TouchEvent>('touchstart');
-
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
 
-  static const EventStreamProvider<Event> volumeChangeEvent = const EventStreamProvider<Event>('volumechange');
-
-  static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
-
   static const EventStreamProvider<AnimationEvent> animationEndEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationEnd');
 
   static const EventStreamProvider<AnimationEvent> animationIterationEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationIteration');
 
   static const EventStreamProvider<AnimationEvent> animationStartEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationStart');
 
-  static const EventStreamProvider<TransitionEvent> transitionEndEvent = const EventStreamProvider<TransitionEvent>('webkitTransitionEnd');
-
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   WindowEvents get on =>
     new WindowEvents(this);
 
@@ -26804,466 +27036,453 @@
 
   static const int TEMPORARY = 0;
 
-
-  /** @domName DOMWindow.applicationCache */
+  @DocsEditable
+  @DomName('DOMWindow.applicationCache')
   ApplicationCache get applicationCache native "DOMWindow_applicationCache_Getter";
 
-
-  /** @domName DOMWindow.closed */
+  @DocsEditable
+  @DomName('DOMWindow.closed')
   bool get closed native "DOMWindow_closed_Getter";
 
-
-  /** @domName DOMWindow.console */
+  @DocsEditable
+  @DomName('DOMWindow.console')
   Console get console native "DOMWindow_console_Getter";
 
-
-  /** @domName DOMWindow.crypto */
+  @DocsEditable
+  @DomName('DOMWindow.crypto')
   Crypto get crypto native "DOMWindow_crypto_Getter";
 
-
-  /** @domName DOMWindow.defaultStatus */
+  @DocsEditable
+  @DomName('DOMWindow.defaultStatus')
   String get defaultStatus native "DOMWindow_defaultStatus_Getter";
 
-
-  /** @domName DOMWindow.defaultStatus */
+  @DocsEditable
+  @DomName('DOMWindow.defaultStatus')
   void set defaultStatus(String value) native "DOMWindow_defaultStatus_Setter";
 
-
-  /** @domName DOMWindow.defaultstatus */
+  @DocsEditable
+  @DomName('DOMWindow.defaultstatus')
   String get defaultstatus native "DOMWindow_defaultstatus_Getter";
 
-
-  /** @domName DOMWindow.defaultstatus */
+  @DocsEditable
+  @DomName('DOMWindow.defaultstatus')
   void set defaultstatus(String value) native "DOMWindow_defaultstatus_Setter";
 
-
-  /** @domName DOMWindow.devicePixelRatio */
+  @DocsEditable
+  @DomName('DOMWindow.devicePixelRatio')
   num get devicePixelRatio native "DOMWindow_devicePixelRatio_Getter";
 
-
-  /** @domName DOMWindow.document */
+  @DocsEditable
+  @DomName('DOMWindow.document')
   Document get document native "DOMWindow_document_Getter";
 
-
-  /** @domName DOMWindow.event */
+  @DocsEditable
+  @DomName('DOMWindow.event')
   Event get event native "DOMWindow_event_Getter";
 
-
-  /** @domName DOMWindow.history */
+  @DocsEditable
+  @DomName('DOMWindow.history')
   History get history native "DOMWindow_history_Getter";
 
-
-  /** @domName DOMWindow.indexedDB */
+  @DocsEditable
+  @DomName('DOMWindow.indexedDB')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @Experimental()
   IdbFactory get indexedDB native "DOMWindow_indexedDB_Getter";
 
-
-  /** @domName DOMWindow.innerHeight */
+  @DocsEditable
+  @DomName('DOMWindow.innerHeight')
   int get innerHeight native "DOMWindow_innerHeight_Getter";
 
-
-  /** @domName DOMWindow.innerWidth */
+  @DocsEditable
+  @DomName('DOMWindow.innerWidth')
   int get innerWidth native "DOMWindow_innerWidth_Getter";
 
-
-  /** @domName DOMWindow.localStorage */
+  @DocsEditable
+  @DomName('DOMWindow.localStorage')
   Storage get localStorage native "DOMWindow_localStorage_Getter";
 
-
-  /** @domName DOMWindow.location */
+  @DocsEditable
+  @DomName('DOMWindow.location')
   Location get location native "DOMWindow_location_Getter";
 
-
-  /** @domName DOMWindow.location */
+  @DocsEditable
+  @DomName('DOMWindow.location')
   void set location(Location value) native "DOMWindow_location_Setter";
 
-
-  /** @domName DOMWindow.locationbar */
+  @DocsEditable
+  @DomName('DOMWindow.locationbar')
   BarInfo get locationbar native "DOMWindow_locationbar_Getter";
 
-
-  /** @domName DOMWindow.menubar */
+  @DocsEditable
+  @DomName('DOMWindow.menubar')
   BarInfo get menubar native "DOMWindow_menubar_Getter";
 
-
-  /** @domName DOMWindow.name */
+  @DocsEditable
+  @DomName('DOMWindow.name')
   String get name native "DOMWindow_name_Getter";
 
-
-  /** @domName DOMWindow.name */
+  @DocsEditable
+  @DomName('DOMWindow.name')
   void set name(String value) native "DOMWindow_name_Setter";
 
-
-  /** @domName DOMWindow.navigator */
+  @DocsEditable
+  @DomName('DOMWindow.navigator')
   Navigator get navigator native "DOMWindow_navigator_Getter";
 
-
-  /** @domName DOMWindow.offscreenBuffering */
+  @DocsEditable
+  @DomName('DOMWindow.offscreenBuffering')
   bool get offscreenBuffering native "DOMWindow_offscreenBuffering_Getter";
 
-
-  /** @domName DOMWindow.opener */
+  @DocsEditable
+  @DomName('DOMWindow.opener')
   WindowBase get opener native "DOMWindow_opener_Getter";
 
-
-  /** @domName DOMWindow.outerHeight */
+  @DocsEditable
+  @DomName('DOMWindow.outerHeight')
   int get outerHeight native "DOMWindow_outerHeight_Getter";
 
-
-  /** @domName DOMWindow.outerWidth */
+  @DocsEditable
+  @DomName('DOMWindow.outerWidth')
   int get outerWidth native "DOMWindow_outerWidth_Getter";
 
-
-  /** @domName DOMWindow.pagePopupController */
+  @DocsEditable
+  @DomName('DOMWindow.pagePopupController')
   PagePopupController get pagePopupController native "DOMWindow_pagePopupController_Getter";
 
-
-  /** @domName DOMWindow.pageXOffset */
+  @DocsEditable
+  @DomName('DOMWindow.pageXOffset')
   int get pageXOffset native "DOMWindow_pageXOffset_Getter";
 
-
-  /** @domName DOMWindow.pageYOffset */
+  @DocsEditable
+  @DomName('DOMWindow.pageYOffset')
   int get pageYOffset native "DOMWindow_pageYOffset_Getter";
 
-
-  /** @domName DOMWindow.parent */
+  @DocsEditable
+  @DomName('DOMWindow.parent')
   WindowBase get parent native "DOMWindow_parent_Getter";
 
-
-  /** @domName DOMWindow.performance */
+  @DocsEditable
+  @DomName('DOMWindow.performance')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE)
   Performance get performance native "DOMWindow_performance_Getter";
 
-
-  /** @domName DOMWindow.personalbar */
+  @DocsEditable
+  @DomName('DOMWindow.personalbar')
   BarInfo get personalbar native "DOMWindow_personalbar_Getter";
 
-
-  /** @domName DOMWindow.screen */
+  @DocsEditable
+  @DomName('DOMWindow.screen')
   Screen get screen native "DOMWindow_screen_Getter";
 
-
-  /** @domName DOMWindow.screenLeft */
+  @DocsEditable
+  @DomName('DOMWindow.screenLeft')
   int get screenLeft native "DOMWindow_screenLeft_Getter";
 
-
-  /** @domName DOMWindow.screenTop */
+  @DocsEditable
+  @DomName('DOMWindow.screenTop')
   int get screenTop native "DOMWindow_screenTop_Getter";
 
-
-  /** @domName DOMWindow.screenX */
+  @DocsEditable
+  @DomName('DOMWindow.screenX')
   int get screenX native "DOMWindow_screenX_Getter";
 
-
-  /** @domName DOMWindow.screenY */
+  @DocsEditable
+  @DomName('DOMWindow.screenY')
   int get screenY native "DOMWindow_screenY_Getter";
 
-
-  /** @domName DOMWindow.scrollX */
+  @DocsEditable
+  @DomName('DOMWindow.scrollX')
   int get scrollX native "DOMWindow_scrollX_Getter";
 
-
-  /** @domName DOMWindow.scrollY */
+  @DocsEditable
+  @DomName('DOMWindow.scrollY')
   int get scrollY native "DOMWindow_scrollY_Getter";
 
-
-  /** @domName DOMWindow.scrollbars */
+  @DocsEditable
+  @DomName('DOMWindow.scrollbars')
   BarInfo get scrollbars native "DOMWindow_scrollbars_Getter";
 
-
-  /** @domName DOMWindow.self */
+  @DocsEditable
+  @DomName('DOMWindow.self')
   WindowBase get self native "DOMWindow_self_Getter";
 
-
-  /** @domName DOMWindow.sessionStorage */
+  @DocsEditable
+  @DomName('DOMWindow.sessionStorage')
   Storage get sessionStorage native "DOMWindow_sessionStorage_Getter";
 
-
-  /** @domName DOMWindow.status */
+  @DocsEditable
+  @DomName('DOMWindow.status')
   String get status native "DOMWindow_status_Getter";
 
-
-  /** @domName DOMWindow.status */
+  @DocsEditable
+  @DomName('DOMWindow.status')
   void set status(String value) native "DOMWindow_status_Setter";
 
-
-  /** @domName DOMWindow.statusbar */
+  @DocsEditable
+  @DomName('DOMWindow.statusbar')
   BarInfo get statusbar native "DOMWindow_statusbar_Getter";
 
-
-  /** @domName DOMWindow.styleMedia */
+  @DocsEditable
+  @DomName('DOMWindow.styleMedia')
   StyleMedia get styleMedia native "DOMWindow_styleMedia_Getter";
 
-
-  /** @domName DOMWindow.toolbar */
+  @DocsEditable
+  @DomName('DOMWindow.toolbar')
   BarInfo get toolbar native "DOMWindow_toolbar_Getter";
 
-
-  /** @domName DOMWindow.top */
+  @DocsEditable
+  @DomName('DOMWindow.top')
   WindowBase get top native "DOMWindow_top_Getter";
 
+  @DocsEditable
+  @DomName('DOMWindow.webkitNotifications')
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental()
+  NotificationCenter get notifications native "DOMWindow_webkitNotifications_Getter";
 
-  /** @domName DOMWindow.webkitNotifications */
-  NotificationCenter get webkitNotifications native "DOMWindow_webkitNotifications_Getter";
-
-
-  /** @domName DOMWindow.webkitStorageInfo */
+  @DocsEditable
+  @DomName('DOMWindow.webkitStorageInfo')
   StorageInfo get webkitStorageInfo native "DOMWindow_webkitStorageInfo_Getter";
 
-
-  /** @domName DOMWindow.window */
+  @DocsEditable
+  @DomName('DOMWindow.window')
   WindowBase get window native "DOMWindow_window_Getter";
 
-
-  /** @domName DOMWindow.addEventListener */
+  @DocsEditable
+  @DomName('DOMWindow.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "DOMWindow_addEventListener_Callback";
 
-
-  /** @domName DOMWindow.alert */
+  @DocsEditable
+  @DomName('DOMWindow.alert')
   void alert(String message) native "DOMWindow_alert_Callback";
 
-
-  /** @domName DOMWindow.atob */
+  @DocsEditable
+  @DomName('DOMWindow.atob')
   String atob(String string) native "DOMWindow_atob_Callback";
 
-
-  /** @domName DOMWindow.btoa */
+  @DocsEditable
+  @DomName('DOMWindow.btoa')
   String btoa(String string) native "DOMWindow_btoa_Callback";
 
-
-  /** @domName DOMWindow.cancelAnimationFrame */
+  @DocsEditable
+  @DomName('DOMWindow.cancelAnimationFrame')
   void cancelAnimationFrame(int id) native "DOMWindow_cancelAnimationFrame_Callback";
 
-
-  /** @domName DOMWindow.captureEvents */
+  @DocsEditable
+  @DomName('DOMWindow.captureEvents')
   void captureEvents() native "DOMWindow_captureEvents_Callback";
 
-
-  /** @domName DOMWindow.clearInterval */
+  @DocsEditable
+  @DomName('DOMWindow.clearInterval')
   void clearInterval(int handle) native "DOMWindow_clearInterval_Callback";
 
-
-  /** @domName DOMWindow.clearTimeout */
+  @DocsEditable
+  @DomName('DOMWindow.clearTimeout')
   void clearTimeout(int handle) native "DOMWindow_clearTimeout_Callback";
 
-
-  /** @domName DOMWindow.close */
+  @DocsEditable
+  @DomName('DOMWindow.close')
   void close() native "DOMWindow_close_Callback";
 
-
-  /** @domName DOMWindow.confirm */
+  @DocsEditable
+  @DomName('DOMWindow.confirm')
   bool confirm(String message) native "DOMWindow_confirm_Callback";
 
-
-  /** @domName DOMWindow.dispatchEvent */
+  @DocsEditable
+  @DomName('DOMWindow.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "DOMWindow_dispatchEvent_Callback";
 
-
-  /** @domName DOMWindow.find */
+  @DocsEditable
+  @DomName('DOMWindow.find')
   bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) native "DOMWindow_find_Callback";
 
-
-  /** @domName DOMWindow.getComputedStyle */
+  @DocsEditable
+  @DomName('DOMWindow.getComputedStyle')
   CssStyleDeclaration $dom_getComputedStyle(Element element, String pseudoElement) native "DOMWindow_getComputedStyle_Callback";
 
-
-  /** @domName DOMWindow.getMatchedCSSRules */
+  @DocsEditable
+  @DomName('DOMWindow.getMatchedCSSRules')
   List<CssRule> getMatchedCssRules(Element element, String pseudoElement) native "DOMWindow_getMatchedCSSRules_Callback";
 
-
-  /** @domName DOMWindow.getSelection */
+  @DocsEditable
+  @DomName('DOMWindow.getSelection')
   DomSelection getSelection() native "DOMWindow_getSelection_Callback";
 
-
-  /** @domName DOMWindow.matchMedia */
+  @DocsEditable
+  @DomName('DOMWindow.matchMedia')
   MediaQueryList matchMedia(String query) native "DOMWindow_matchMedia_Callback";
 
-
-  /** @domName DOMWindow.moveBy */
+  @DocsEditable
+  @DomName('DOMWindow.moveBy')
   void moveBy(num x, num y) native "DOMWindow_moveBy_Callback";
 
-
-  /** @domName DOMWindow.moveTo */
+  @DocsEditable
+  @DomName('DOMWindow.moveTo')
   void moveTo(num x, num y) native "DOMWindow_moveTo_Callback";
 
-
-  /** @domName DOMWindow.open */
+  @DocsEditable
+  @DomName('DOMWindow.open')
   WindowBase open(String url, String name, [String options]) native "DOMWindow_open_Callback";
 
-
-  /** @domName DOMWindow.openDatabase */
+  @DocsEditable
+  @DomName('DOMWindow.openDatabase')
   Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "DOMWindow_openDatabase_Callback";
 
-
-  /** @domName DOMWindow.postMessage */
+  @DocsEditable
+  @DomName('DOMWindow.postMessage')
   void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) native "DOMWindow_postMessage_Callback";
 
-
-  /** @domName DOMWindow.print */
+  @DocsEditable
+  @DomName('DOMWindow.print')
   void print() native "DOMWindow_print_Callback";
 
-
-  /** @domName DOMWindow.releaseEvents */
+  @DocsEditable
+  @DomName('DOMWindow.releaseEvents')
   void releaseEvents() native "DOMWindow_releaseEvents_Callback";
 
-
-  /** @domName DOMWindow.removeEventListener */
+  @DocsEditable
+  @DomName('DOMWindow.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "DOMWindow_removeEventListener_Callback";
 
-
-  /** @domName DOMWindow.requestAnimationFrame */
+  @DocsEditable
+  @DomName('DOMWindow.requestAnimationFrame')
   int requestAnimationFrame(RequestAnimationFrameCallback callback) native "DOMWindow_requestAnimationFrame_Callback";
 
-
-  /** @domName DOMWindow.resizeBy */
+  @DocsEditable
+  @DomName('DOMWindow.resizeBy')
   void resizeBy(num x, num y) native "DOMWindow_resizeBy_Callback";
 
-
-  /** @domName DOMWindow.resizeTo */
+  @DocsEditable
+  @DomName('DOMWindow.resizeTo')
   void resizeTo(num width, num height) native "DOMWindow_resizeTo_Callback";
 
-
-  /** @domName DOMWindow.scroll */
+  @DocsEditable
+  @DomName('DOMWindow.scroll')
   void scroll(int x, int y) native "DOMWindow_scroll_Callback";
 
-
-  /** @domName DOMWindow.scrollBy */
+  @DocsEditable
+  @DomName('DOMWindow.scrollBy')
   void scrollBy(int x, int y) native "DOMWindow_scrollBy_Callback";
 
-
-  /** @domName DOMWindow.scrollTo */
+  @DocsEditable
+  @DomName('DOMWindow.scrollTo')
   void scrollTo(int x, int y) native "DOMWindow_scrollTo_Callback";
 
-
-  /** @domName DOMWindow.setInterval */
+  @DocsEditable
+  @DomName('DOMWindow.setInterval')
   int setInterval(TimeoutHandler handler, int timeout) native "DOMWindow_setInterval_Callback";
 
-
-  /** @domName DOMWindow.setTimeout */
+  @DocsEditable
+  @DomName('DOMWindow.setTimeout')
   int setTimeout(TimeoutHandler handler, int timeout) native "DOMWindow_setTimeout_Callback";
 
-
-  /** @domName DOMWindow.showModalDialog */
+  @DocsEditable
+  @DomName('DOMWindow.showModalDialog')
   Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) native "DOMWindow_showModalDialog_Callback";
 
-
-  /** @domName DOMWindow.stop */
+  @DocsEditable
+  @DomName('DOMWindow.stop')
   void stop() native "DOMWindow_stop_Callback";
 
-
-  /** @domName DOMWindow.webkitCancelAnimationFrame */
+  @DocsEditable
+  @DomName('DOMWindow.webkitCancelAnimationFrame')
   void webkitCancelAnimationFrame(int id) native "DOMWindow_webkitCancelAnimationFrame_Callback";
 
-
-  /** @domName DOMWindow.webkitConvertPointFromNodeToPage */
+  @DocsEditable
+  @DomName('DOMWindow.webkitConvertPointFromNodeToPage')
   Point webkitConvertPointFromNodeToPage(Node node, Point p) native "DOMWindow_webkitConvertPointFromNodeToPage_Callback";
 
-
-  /** @domName DOMWindow.webkitConvertPointFromPageToNode */
+  @DocsEditable
+  @DomName('DOMWindow.webkitConvertPointFromPageToNode')
   Point webkitConvertPointFromPageToNode(Node node, Point p) native "DOMWindow_webkitConvertPointFromPageToNode_Callback";
 
-
-  /** @domName DOMWindow.webkitRequestAnimationFrame */
+  @DocsEditable
+  @DomName('DOMWindow.webkitRequestAnimationFrame')
   int webkitRequestAnimationFrame(RequestAnimationFrameCallback callback) native "DOMWindow_webkitRequestAnimationFrame_Callback";
 
-
-  /** @domName DOMWindow.webkitRequestFileSystem */
+  @DocsEditable
+  @DomName('DOMWindow.webkitRequestFileSystem')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental()
   void requestFileSystem(int type, int size, FileSystemCallback successCallback, [ErrorCallback errorCallback]) native "DOMWindow_webkitRequestFileSystem_Callback";
 
-
-  /** @domName DOMWindow.webkitResolveLocalFileSystemURL */
+  @DocsEditable
+  @DomName('DOMWindow.webkitResolveLocalFileSystemURL')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental()
   void resolveLocalFileSystemUrl(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native "DOMWindow_webkitResolveLocalFileSystemURL_Callback";
 
   Stream<Event> get onContentLoaded => contentLoadedEvent.forTarget(this);
 
-  Stream<Event> get onAbort => abortEvent.forTarget(this);
+  Stream<Event> get onAbort => Element.abortEvent.forTarget(this);
 
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
-  Stream<Event> get onBlur => blurEvent.forTarget(this);
+  Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
-  Stream<Event> get onCanPlay => canPlayEvent.forTarget(this);
+  Stream<Event> get onChange => Element.changeEvent.forTarget(this);
 
-  Stream<Event> get onCanPlayThrough => canPlayThroughEvent.forTarget(this);
+  Stream<MouseEvent> get onClick => Element.clickEvent.forTarget(this);
 
-  Stream<Event> get onChange => changeEvent.forTarget(this);
+  Stream<MouseEvent> get onContextMenu => Element.contextMenuEvent.forTarget(this);
 
-  Stream<MouseEvent> get onClick => clickEvent.forTarget(this);
-
-  Stream<MouseEvent> get onContextMenu => contextMenuEvent.forTarget(this);
-
-  Stream<Event> get onDoubleClick => doubleClickEvent.forTarget(this);
+  Stream<Event> get onDoubleClick => Element.doubleClickEvent.forTarget(this);
 
   Stream<DeviceMotionEvent> get onDeviceMotion => deviceMotionEvent.forTarget(this);
 
   Stream<DeviceOrientationEvent> get onDeviceOrientation => deviceOrientationEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDrag => dragEvent.forTarget(this);
+  Stream<MouseEvent> get onDrag => Element.dragEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragEnd => dragEndEvent.forTarget(this);
+  Stream<MouseEvent> get onDragEnd => Element.dragEndEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragEnter => dragEnterEvent.forTarget(this);
+  Stream<MouseEvent> get onDragEnter => Element.dragEnterEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragLeave => dragLeaveEvent.forTarget(this);
+  Stream<MouseEvent> get onDragLeave => Element.dragLeaveEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragOver => dragOverEvent.forTarget(this);
+  Stream<MouseEvent> get onDragOver => Element.dragOverEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDragStart => dragStartEvent.forTarget(this);
+  Stream<MouseEvent> get onDragStart => Element.dragStartEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDrop => dropEvent.forTarget(this);
+  Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
-  Stream<Event> get onDurationChange => durationChangeEvent.forTarget(this);
+  Stream<Event> get onError => Element.errorEvent.forTarget(this);
 
-  Stream<Event> get onEmptied => emptiedEvent.forTarget(this);
-
-  Stream<Event> get onEnded => endedEvent.forTarget(this);
-
-  Stream<Event> get onError => errorEvent.forTarget(this);
-
-  Stream<Event> get onFocus => focusEvent.forTarget(this);
+  Stream<Event> get onFocus => Element.focusEvent.forTarget(this);
 
   Stream<HashChangeEvent> get onHashChange => hashChangeEvent.forTarget(this);
 
-  Stream<Event> get onInput => inputEvent.forTarget(this);
+  Stream<Event> get onInput => Element.inputEvent.forTarget(this);
 
-  Stream<Event> get onInvalid => invalidEvent.forTarget(this);
+  Stream<Event> get onInvalid => Element.invalidEvent.forTarget(this);
 
-  Stream<KeyboardEvent> get onKeyDown => keyDownEvent.forTarget(this);
+  Stream<KeyboardEvent> get onKeyDown => Element.keyDownEvent.forTarget(this);
 
-  Stream<KeyboardEvent> get onKeyPress => keyPressEvent.forTarget(this);
+  Stream<KeyboardEvent> get onKeyPress => Element.keyPressEvent.forTarget(this);
 
-  Stream<KeyboardEvent> get onKeyUp => keyUpEvent.forTarget(this);
+  Stream<KeyboardEvent> get onKeyUp => Element.keyUpEvent.forTarget(this);
 
-  Stream<Event> get onLoad => loadEvent.forTarget(this);
-
-  Stream<Event> get onLoadedData => loadedDataEvent.forTarget(this);
-
-  Stream<Event> get onLoadedMetadata => loadedMetadataEvent.forTarget(this);
-
-  Stream<Event> get onLoadStart => loadStartEvent.forTarget(this);
+  Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseDown => mouseDownEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseMove => mouseMoveEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseOut => mouseOutEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseOut => Element.mouseOutEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseOver => mouseOverEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseOver => Element.mouseOverEvent.forTarget(this);
 
-  Stream<MouseEvent> get onMouseUp => mouseUpEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseUp => Element.mouseUpEvent.forTarget(this);
 
-  Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
+  Stream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent.forTarget(this);
 
   Stream<Event> get onOffline => offlineEvent.forTarget(this);
 
@@ -27273,291 +27492,267 @@
 
   Stream<Event> get onPageShow => pageShowEvent.forTarget(this);
 
-  Stream<Event> get onPause => pauseEvent.forTarget(this);
-
-  Stream<Event> get onPlay => playEvent.forTarget(this);
-
-  Stream<Event> get onPlaying => playingEvent.forTarget(this);
-
   Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);
 
-  Stream<Event> get onProgress => progressEvent.forTarget(this);
-
-  Stream<Event> get onRateChange => rateChangeEvent.forTarget(this);
-
-  Stream<Event> get onReset => resetEvent.forTarget(this);
+  Stream<Event> get onReset => Element.resetEvent.forTarget(this);
 
   Stream<Event> get onResize => resizeEvent.forTarget(this);
 
-  Stream<Event> get onScroll => scrollEvent.forTarget(this);
+  Stream<Event> get onScroll => Element.scrollEvent.forTarget(this);
 
-  Stream<Event> get onSearch => searchEvent.forTarget(this);
+  Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
-  Stream<Event> get onSeeked => seekedEvent.forTarget(this);
-
-  Stream<Event> get onSeeking => seekingEvent.forTarget(this);
-
-  Stream<Event> get onSelect => selectEvent.forTarget(this);
-
-  Stream<Event> get onStalled => stalledEvent.forTarget(this);
+  Stream<Event> get onSelect => Element.selectEvent.forTarget(this);
 
   Stream<StorageEvent> get onStorage => storageEvent.forTarget(this);
 
-  Stream<Event> get onSubmit => submitEvent.forTarget(this);
+  Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
-  Stream<Event> get onSuspend => suspendEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
 
-  Stream<Event> get onTimeUpdate => timeUpdateEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
-  Stream<TouchEvent> get onTouchCancel => touchCancelEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
-  Stream<TouchEvent> get onTouchEnd => touchEndEvent.forTarget(this);
-
-  Stream<TouchEvent> get onTouchMove => touchMoveEvent.forTarget(this);
-
-  Stream<TouchEvent> get onTouchStart => touchStartEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
   Stream<Event> get onUnload => unloadEvent.forTarget(this);
 
-  Stream<Event> get onVolumeChange => volumeChangeEvent.forTarget(this);
-
-  Stream<Event> get onWaiting => waitingEvent.forTarget(this);
-
   Stream<AnimationEvent> get onAnimationEnd => animationEndEvent.forTarget(this);
 
   Stream<AnimationEvent> get onAnimationIteration => animationIterationEvent.forTarget(this);
 
   Stream<AnimationEvent> get onAnimationStart => animationStartEvent.forTarget(this);
 
-  Stream<TransitionEvent> get onTransitionEnd => transitionEndEvent.forTarget(this);
+  Stream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent.forTarget(this);
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class WindowEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   WindowEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get contentLoaded => this['DOMContentLoaded'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get beforeUnload => this['beforeunload'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get blur => this['blur'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get canPlay => this['canplay'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get canPlayThrough => this['canplaythrough'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get change => this['change'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get click => this['click'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get contextMenu => this['contextmenu'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get doubleClick => this['dblclick'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get deviceMotion => this['devicemotion'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get deviceOrientation => this['deviceorientation'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get drag => this['drag'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragEnd => this['dragend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragEnter => this['dragenter'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragLeave => this['dragleave'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragOver => this['dragover'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragStart => this['dragstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get drop => this['drop'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get durationChange => this['durationchange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get emptied => this['emptied'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get ended => this['ended'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get focus => this['focus'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get hashChange => this['hashchange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get input => this['input'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get invalid => this['invalid'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyDown => this['keydown'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyPress => this['keypress'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyUp => this['keyup'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get load => this['load'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadedData => this['loadeddata'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadedMetadata => this['loadedmetadata'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get loadStart => this['loadstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get message => this['message'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseDown => this['mousedown'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseMove => this['mousemove'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseOut => this['mouseout'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseOver => this['mouseover'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseUp => this['mouseup'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseWheel => this['mousewheel'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get offline => this['offline'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get online => this['online'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get pageHide => this['pagehide'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get pageShow => this['pageshow'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get pause => this['pause'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get play => this['play'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get playing => this['playing'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get popState => this['popstate'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get progress => this['progress'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get rateChange => this['ratechange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get reset => this['reset'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get resize => this['resize'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get scroll => this['scroll'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get search => this['search'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get seeked => this['seeked'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get seeking => this['seeking'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get select => this['select'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get stalled => this['stalled'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get storage => this['storage'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get submit => this['submit'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get suspend => this['suspend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get timeUpdate => this['timeupdate'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchCancel => this['touchcancel'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchEnd => this['touchend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchMove => this['touchmove'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get touchStart => this['touchstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get unload => this['unload'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get volumeChange => this['volumechange'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get waiting => this['waiting'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get animationEnd => this['webkitAnimationEnd'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get animationIteration => this['webkitAnimationIteration'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get animationStart => this['webkitAnimationStart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get transitionEnd => this['webkitTransitionEnd'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27567,38 +27762,40 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName Worker
+@DocsEditable
+@DomName('Worker')
 class Worker extends AbstractWorker {
   Worker.internal() : super.internal();
 
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
-  ///@docsEditable true
+  @DocsEditable
   factory Worker(String scriptUrl) => Worker._create(scriptUrl);
   static Worker _create(String scriptUrl) native "Worker_constructor_Callback";
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   WorkerEvents get on =>
     new WorkerEvents(this);
 
-
-  /** @domName Worker.postMessage */
+  @DocsEditable
+  @DomName('Worker.postMessage')
   void postMessage(/*SerializedScriptValue*/ message, [List messagePorts]) native "Worker_postMessage_Callback";
 
-
-  /** @domName Worker.terminate */
+  @DocsEditable
+  @DomName('Worker.terminate')
   void terminate() native "Worker_terminate_Callback";
 
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class WorkerEvents extends AbstractWorkerEvents {
-  /// @docsEditable true
+  @DocsEditable
   WorkerEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get message => this['message'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27608,13 +27805,15 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WorkerContext
+@DocsEditable
+@DomName('WorkerContext')
 class WorkerContext extends EventTarget {
   WorkerContext.internal() : super.internal();
 
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   WorkerContextEvents get on =>
     new WorkerContextEvents(this);
 
@@ -27622,94 +27821,94 @@
 
   static const int TEMPORARY = 0;
 
-
-  /** @domName WorkerContext.indexedDB */
+  @DocsEditable
+  @DomName('WorkerContext.indexedDB')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @Experimental()
   IdbFactory get indexedDB native "WorkerContext_indexedDB_Getter";
 
-
-  /** @domName WorkerContext.location */
+  @DocsEditable
+  @DomName('WorkerContext.location')
   WorkerLocation get location native "WorkerContext_location_Getter";
 
-
-  /** @domName WorkerContext.navigator */
+  @DocsEditable
+  @DomName('WorkerContext.navigator')
   WorkerNavigator get navigator native "WorkerContext_navigator_Getter";
 
-
-  /** @domName WorkerContext.self */
+  @DocsEditable
+  @DomName('WorkerContext.self')
   WorkerContext get self native "WorkerContext_self_Getter";
 
-
-  /** @domName WorkerContext.webkitNotifications */
+  @DocsEditable
+  @DomName('WorkerContext.webkitNotifications')
   NotificationCenter get webkitNotifications native "WorkerContext_webkitNotifications_Getter";
 
-
-  /** @domName WorkerContext.addEventListener */
+  @DocsEditable
+  @DomName('WorkerContext.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerContext_addEventListener_Callback";
 
-
-  /** @domName WorkerContext.clearInterval */
+  @DocsEditable
+  @DomName('WorkerContext.clearInterval')
   void clearInterval(int handle) native "WorkerContext_clearInterval_Callback";
 
-
-  /** @domName WorkerContext.clearTimeout */
+  @DocsEditable
+  @DomName('WorkerContext.clearTimeout')
   void clearTimeout(int handle) native "WorkerContext_clearTimeout_Callback";
 
-
-  /** @domName WorkerContext.close */
+  @DocsEditable
+  @DomName('WorkerContext.close')
   void close() native "WorkerContext_close_Callback";
 
-
-  /** @domName WorkerContext.dispatchEvent */
+  @DocsEditable
+  @DomName('WorkerContext.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "WorkerContext_dispatchEvent_Callback";
 
-
-  /** @domName WorkerContext.importScripts */
+  @DocsEditable
+  @DomName('WorkerContext.importScripts')
   void importScripts() native "WorkerContext_importScripts_Callback";
 
-
-  /** @domName WorkerContext.openDatabase */
+  @DocsEditable
+  @DomName('WorkerContext.openDatabase')
   Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerContext_openDatabase_Callback";
 
-
-  /** @domName WorkerContext.openDatabaseSync */
+  @DocsEditable
+  @DomName('WorkerContext.openDatabaseSync')
   DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerContext_openDatabaseSync_Callback";
 
-
-  /** @domName WorkerContext.removeEventListener */
+  @DocsEditable
+  @DomName('WorkerContext.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerContext_removeEventListener_Callback";
 
-
-  /** @domName WorkerContext.setInterval */
+  @DocsEditable
+  @DomName('WorkerContext.setInterval')
   int setInterval(TimeoutHandler handler, int timeout) native "WorkerContext_setInterval_Callback";
 
-
-  /** @domName WorkerContext.setTimeout */
+  @DocsEditable
+  @DomName('WorkerContext.setTimeout')
   int setTimeout(TimeoutHandler handler, int timeout) native "WorkerContext_setTimeout_Callback";
 
-
-  /** @domName WorkerContext.webkitRequestFileSystem */
+  @DocsEditable
+  @DomName('WorkerContext.webkitRequestFileSystem')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental()
   void requestFileSystem(int type, int size, [FileSystemCallback successCallback, ErrorCallback errorCallback]) native "WorkerContext_webkitRequestFileSystem_Callback";
 
-
-  /** @domName WorkerContext.webkitRequestFileSystemSync */
+  @DocsEditable
+  @DomName('WorkerContext.webkitRequestFileSystemSync')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental()
   FileSystemSync requestFileSystemSync(int type, int size) native "WorkerContext_webkitRequestFileSystemSync_Callback";
 
-
-  /** @domName WorkerContext.webkitResolveLocalFileSystemSyncURL */
+  @DocsEditable
+  @DomName('WorkerContext.webkitResolveLocalFileSystemSyncURL')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental()
   EntrySync resolveLocalFileSystemSyncUrl(String url) native "WorkerContext_webkitResolveLocalFileSystemSyncURL_Callback";
 
-
-  /** @domName WorkerContext.webkitResolveLocalFileSystemURL */
+  @DocsEditable
+  @DomName('WorkerContext.webkitResolveLocalFileSystemURL')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental()
   void resolveLocalFileSystemUrl(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native "WorkerContext_webkitResolveLocalFileSystemURL_Callback";
@@ -27718,12 +27917,12 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class WorkerContextEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   WorkerContextEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27733,44 +27932,45 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WorkerLocation
+@DocsEditable
+@DomName('WorkerLocation')
 class WorkerLocation extends NativeFieldWrapperClass1 {
   WorkerLocation.internal();
 
-
-  /** @domName WorkerLocation.hash */
+  @DocsEditable
+  @DomName('WorkerLocation.hash')
   String get hash native "WorkerLocation_hash_Getter";
 
-
-  /** @domName WorkerLocation.host */
+  @DocsEditable
+  @DomName('WorkerLocation.host')
   String get host native "WorkerLocation_host_Getter";
 
-
-  /** @domName WorkerLocation.hostname */
+  @DocsEditable
+  @DomName('WorkerLocation.hostname')
   String get hostname native "WorkerLocation_hostname_Getter";
 
-
-  /** @domName WorkerLocation.href */
+  @DocsEditable
+  @DomName('WorkerLocation.href')
   String get href native "WorkerLocation_href_Getter";
 
-
-  /** @domName WorkerLocation.pathname */
+  @DocsEditable
+  @DomName('WorkerLocation.pathname')
   String get pathname native "WorkerLocation_pathname_Getter";
 
-
-  /** @domName WorkerLocation.port */
+  @DocsEditable
+  @DomName('WorkerLocation.port')
   String get port native "WorkerLocation_port_Getter";
 
-
-  /** @domName WorkerLocation.protocol */
+  @DocsEditable
+  @DomName('WorkerLocation.protocol')
   String get protocol native "WorkerLocation_protocol_Getter";
 
-
-  /** @domName WorkerLocation.search */
+  @DocsEditable
+  @DomName('WorkerLocation.search')
   String get search native "WorkerLocation_search_Getter";
 
-
-  /** @domName WorkerLocation.toString */
+  @DocsEditable
+  @DomName('WorkerLocation.toString')
   String toString() native "WorkerLocation_toString_Callback";
 
 }
@@ -27781,28 +27981,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WorkerNavigator
+@DocsEditable
+@DomName('WorkerNavigator')
 class WorkerNavigator extends NativeFieldWrapperClass1 {
   WorkerNavigator.internal();
 
-
-  /** @domName WorkerNavigator.appName */
+  @DocsEditable
+  @DomName('WorkerNavigator.appName')
   String get appName native "WorkerNavigator_appName_Getter";
 
-
-  /** @domName WorkerNavigator.appVersion */
+  @DocsEditable
+  @DomName('WorkerNavigator.appVersion')
   String get appVersion native "WorkerNavigator_appVersion_Getter";
 
-
-  /** @domName WorkerNavigator.onLine */
+  @DocsEditable
+  @DomName('WorkerNavigator.onLine')
   bool get onLine native "WorkerNavigator_onLine_Getter";
 
-
-  /** @domName WorkerNavigator.platform */
+  @DocsEditable
+  @DomName('WorkerNavigator.platform')
   String get platform native "WorkerNavigator_platform_Getter";
 
-
-  /** @domName WorkerNavigator.userAgent */
+  @DocsEditable
+  @DomName('WorkerNavigator.userAgent')
   String get userAgent native "WorkerNavigator_userAgent_Getter";
 
 }
@@ -27813,24 +28014,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName XPathEvaluator
+@DocsEditable
+@DomName('XPathEvaluator')
 class XPathEvaluator extends NativeFieldWrapperClass1 {
   XPathEvaluator.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory XPathEvaluator() => XPathEvaluator._create();
   static XPathEvaluator _create() native "XPathEvaluator_constructor_Callback";
 
-
-  /** @domName XPathEvaluator.createExpression */
+  @DocsEditable
+  @DomName('XPathEvaluator.createExpression')
   XPathExpression createExpression(String expression, XPathNSResolver resolver) native "XPathEvaluator_createExpression_Callback";
 
-
-  /** @domName XPathEvaluator.createNSResolver */
+  @DocsEditable
+  @DomName('XPathEvaluator.createNSResolver')
   XPathNSResolver createNSResolver(Node nodeResolver) native "XPathEvaluator_createNSResolver_Callback";
 
-
-  /** @domName XPathEvaluator.evaluate */
+  @DocsEditable
+  @DomName('XPathEvaluator.evaluate')
   XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) native "XPathEvaluator_evaluate_Callback";
 
 }
@@ -27841,7 +28043,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName XPathException
+@DocsEditable
+@DomName('XPathException')
 class XPathException extends NativeFieldWrapperClass1 {
   XPathException.internal();
 
@@ -27849,20 +28052,20 @@
 
   static const int TYPE_ERR = 52;
 
-
-  /** @domName XPathException.code */
+  @DocsEditable
+  @DomName('XPathException.code')
   int get code native "XPathException_code_Getter";
 
-
-  /** @domName XPathException.message */
+  @DocsEditable
+  @DomName('XPathException.message')
   String get message native "XPathException_message_Getter";
 
-
-  /** @domName XPathException.name */
+  @DocsEditable
+  @DomName('XPathException.name')
   String get name native "XPathException_name_Getter";
 
-
-  /** @domName XPathException.toString */
+  @DocsEditable
+  @DomName('XPathException.toString')
   String toString() native "XPathException_toString_Callback";
 
 }
@@ -27873,12 +28076,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName XPathExpression
+@DocsEditable
+@DomName('XPathExpression')
 class XPathExpression extends NativeFieldWrapperClass1 {
   XPathExpression.internal();
 
-
-  /** @domName XPathExpression.evaluate */
+  @DocsEditable
+  @DomName('XPathExpression.evaluate')
   XPathResult evaluate(Node contextNode, int type, XPathResult inResult) native "XPathExpression_evaluate_Callback";
 
 }
@@ -27889,12 +28093,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName XPathNSResolver
+@DocsEditable
+@DomName('XPathNSResolver')
 class XPathNSResolver extends NativeFieldWrapperClass1 {
   XPathNSResolver.internal();
 
-
-  /** @domName XPathNSResolver.lookupNamespaceURI */
+  @DocsEditable
+  @DomName('XPathNSResolver.lookupNamespaceURI')
   String lookupNamespaceUri(String prefix) native "XPathNSResolver_lookupNamespaceURI_Callback";
 
 }
@@ -27905,7 +28110,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName XPathResult
+@DocsEditable
+@DomName('XPathResult')
 class XPathResult extends NativeFieldWrapperClass1 {
   XPathResult.internal();
 
@@ -27929,40 +28135,40 @@
 
   static const int UNORDERED_NODE_SNAPSHOT_TYPE = 6;
 
-
-  /** @domName XPathResult.booleanValue */
+  @DocsEditable
+  @DomName('XPathResult.booleanValue')
   bool get booleanValue native "XPathResult_booleanValue_Getter";
 
-
-  /** @domName XPathResult.invalidIteratorState */
+  @DocsEditable
+  @DomName('XPathResult.invalidIteratorState')
   bool get invalidIteratorState native "XPathResult_invalidIteratorState_Getter";
 
-
-  /** @domName XPathResult.numberValue */
+  @DocsEditable
+  @DomName('XPathResult.numberValue')
   num get numberValue native "XPathResult_numberValue_Getter";
 
-
-  /** @domName XPathResult.resultType */
+  @DocsEditable
+  @DomName('XPathResult.resultType')
   int get resultType native "XPathResult_resultType_Getter";
 
-
-  /** @domName XPathResult.singleNodeValue */
+  @DocsEditable
+  @DomName('XPathResult.singleNodeValue')
   Node get singleNodeValue native "XPathResult_singleNodeValue_Getter";
 
-
-  /** @domName XPathResult.snapshotLength */
+  @DocsEditable
+  @DomName('XPathResult.snapshotLength')
   int get snapshotLength native "XPathResult_snapshotLength_Getter";
 
-
-  /** @domName XPathResult.stringValue */
+  @DocsEditable
+  @DomName('XPathResult.stringValue')
   String get stringValue native "XPathResult_stringValue_Getter";
 
-
-  /** @domName XPathResult.iterateNext */
+  @DocsEditable
+  @DomName('XPathResult.iterateNext')
   Node iterateNext() native "XPathResult_iterateNext_Callback";
 
-
-  /** @domName XPathResult.snapshotItem */
+  @DocsEditable
+  @DomName('XPathResult.snapshotItem')
   Node snapshotItem(int index) native "XPathResult_snapshotItem_Callback";
 
 }
@@ -27973,16 +28179,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName XMLSerializer
+@DocsEditable
+@DomName('XMLSerializer')
 class XmlSerializer extends NativeFieldWrapperClass1 {
   XmlSerializer.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory XmlSerializer() => XmlSerializer._create();
   static XmlSerializer _create() native "XMLSerializer_constructor_Callback";
 
-
-  /** @domName XMLSerializer.serializeToString */
+  @DocsEditable
+  @DomName('XMLSerializer.serializeToString')
   String serializeToString(Node node) native "XMLSerializer_serializeToString_Callback";
 
 }
@@ -27993,44 +28200,45 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName XSLTProcessor
+@DocsEditable
+@DomName('XSLTProcessor')
 class XsltProcessor extends NativeFieldWrapperClass1 {
   XsltProcessor.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory XsltProcessor() => XsltProcessor._create();
   static XsltProcessor _create() native "XSLTProcessor_constructor_Callback";
 
-
-  /** @domName XSLTProcessor.clearParameters */
+  @DocsEditable
+  @DomName('XSLTProcessor.clearParameters')
   void clearParameters() native "XSLTProcessor_clearParameters_Callback";
 
-
-  /** @domName XSLTProcessor.getParameter */
+  @DocsEditable
+  @DomName('XSLTProcessor.getParameter')
   String getParameter(String namespaceURI, String localName) native "XSLTProcessor_getParameter_Callback";
 
-
-  /** @domName XSLTProcessor.importStylesheet */
+  @DocsEditable
+  @DomName('XSLTProcessor.importStylesheet')
   void importStylesheet(Node stylesheet) native "XSLTProcessor_importStylesheet_Callback";
 
-
-  /** @domName XSLTProcessor.removeParameter */
+  @DocsEditable
+  @DomName('XSLTProcessor.removeParameter')
   void removeParameter(String namespaceURI, String localName) native "XSLTProcessor_removeParameter_Callback";
 
-
-  /** @domName XSLTProcessor.reset */
+  @DocsEditable
+  @DomName('XSLTProcessor.reset')
   void reset() native "XSLTProcessor_reset_Callback";
 
-
-  /** @domName XSLTProcessor.setParameter */
+  @DocsEditable
+  @DomName('XSLTProcessor.setParameter')
   void setParameter(String namespaceURI, String localName, String value) native "XSLTProcessor_setParameter_Callback";
 
-
-  /** @domName XSLTProcessor.transformToDocument */
+  @DocsEditable
+  @DomName('XSLTProcessor.transformToDocument')
   Document transformToDocument(Node source) native "XSLTProcessor_transformToDocument_Callback";
 
-
-  /** @domName XSLTProcessor.transformToFragment */
+  @DocsEditable
+  @DomName('XSLTProcessor.transformToFragment')
   DocumentFragment transformToFragment(Node source, Document docVal) native "XSLTProcessor_transformToFragment_Callback";
 
 }
@@ -28041,12 +28249,39 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ClientRectList
+@DocsEditable
+@DomName('HTMLAppletElement')
+class _AppletElement extends _Element_Merged {
+  _AppletElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('HTMLBaseFontElement')
+class _BaseFontElement extends _Element_Merged {
+  _BaseFontElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('ClientRectList')
 class _ClientRectList extends NativeFieldWrapperClass1 implements List<ClientRect> {
   _ClientRectList.internal();
 
-
-  /** @domName ClientRectList.length */
+  @DocsEditable
+  @DomName('ClientRectList.length')
   int get length native "ClientRectList_length_Getter";
 
   ClientRect operator[](int index) native "ClientRectList_item_Callback";
@@ -28067,50 +28302,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, ClientRect)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(ClientRect element) => Collections.contains(this, element);
+  bool contains(ClientRect element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(ClientRect element)) => Collections.forEach(this, f);
+  void forEach(void f(ClientRect element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(ClientRect element)) => new MappedList<ClientRect, dynamic>(this, f);
+  List mappedBy(f(ClientRect element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<ClientRect> where(bool f(ClientRect element)) => new WhereIterable<ClientRect>(this, f);
+  Iterable<ClientRect> where(bool f(ClientRect element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(ClientRect element)) => Collections.every(this, f);
+  bool every(bool f(ClientRect element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(ClientRect element)) => Collections.any(this, f);
+  bool any(bool f(ClientRect element)) => IterableMixinWorkaround.any(this, f);
 
   List<ClientRect> toList() => new List<ClientRect>.from(this);
   Set<ClientRect> toSet() => new Set<ClientRect>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<ClientRect> take(int n) => new ListView<ClientRect>(this, 0, n);
+  List<ClientRect> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<ClientRect> takeWhile(bool test(ClientRect value)) {
-    return new TakeWhileIterable<ClientRect>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<ClientRect> skip(int n) => new ListView<ClientRect>(this, n, null);
+  List<ClientRect> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<ClientRect> skipWhile(bool test(ClientRect value)) {
-    return new SkipWhileIterable<ClientRect>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   ClientRect firstMatching(bool test(ClientRect value), { ClientRect orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   ClientRect lastMatching(bool test(ClientRect value), {ClientRect orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   ClientRect singleMatching(bool test(ClientRect value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   ClientRect elementAt(int index) {
@@ -28168,16 +28403,36 @@
     throw new StateError("More than one element");
   }
 
-  ClientRect min([int compare(ClientRect a, ClientRect b)]) => Collections.min(this, compare);
+  ClientRect min([int compare(ClientRect a, ClientRect b)]) => IterableMixinWorkaround.min(this, compare);
 
-  ClientRect max([int compare(ClientRect a, ClientRect b)]) => Collections.max(this, compare);
+  ClientRect max([int compare(ClientRect a, ClientRect b)]) => IterableMixinWorkaround.max(this, compare);
 
   ClientRect removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   ClientRect removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(ClientRect element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(ClientRect element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<ClientRect> from, [int startFrom]) {
@@ -28197,8 +28452,8 @@
 
   // -- end List<ClientRect> mixins.
 
-
-  /** @domName ClientRectList.item */
+  @DocsEditable
+  @DomName('ClientRectList.item')
   ClientRect item(int index) native "ClientRectList_item_Callback";
 
 }
@@ -28209,12 +28464,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CSSRuleList
+@DocsEditable
+@DomName('CSSRuleList')
 class _CssRuleList extends NativeFieldWrapperClass1 implements List<CssRule> {
   _CssRuleList.internal();
 
-
-  /** @domName CSSRuleList.length */
+  @DocsEditable
+  @DomName('CSSRuleList.length')
   int get length native "CSSRuleList_length_Getter";
 
   CssRule operator[](int index) native "CSSRuleList_item_Callback";
@@ -28235,50 +28491,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, CssRule)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(CssRule element) => Collections.contains(this, element);
+  bool contains(CssRule element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(CssRule element)) => Collections.forEach(this, f);
+  void forEach(void f(CssRule element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(CssRule element)) => new MappedList<CssRule, dynamic>(this, f);
+  List mappedBy(f(CssRule element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<CssRule> where(bool f(CssRule element)) => new WhereIterable<CssRule>(this, f);
+  Iterable<CssRule> where(bool f(CssRule element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(CssRule element)) => Collections.every(this, f);
+  bool every(bool f(CssRule element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(CssRule element)) => Collections.any(this, f);
+  bool any(bool f(CssRule element)) => IterableMixinWorkaround.any(this, f);
 
   List<CssRule> toList() => new List<CssRule>.from(this);
   Set<CssRule> toSet() => new Set<CssRule>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<CssRule> take(int n) => new ListView<CssRule>(this, 0, n);
+  List<CssRule> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<CssRule> takeWhile(bool test(CssRule value)) {
-    return new TakeWhileIterable<CssRule>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<CssRule> skip(int n) => new ListView<CssRule>(this, n, null);
+  List<CssRule> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<CssRule> skipWhile(bool test(CssRule value)) {
-    return new SkipWhileIterable<CssRule>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   CssRule firstMatching(bool test(CssRule value), { CssRule orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   CssRule lastMatching(bool test(CssRule value), {CssRule orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   CssRule singleMatching(bool test(CssRule value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   CssRule elementAt(int index) {
@@ -28336,16 +28592,36 @@
     throw new StateError("More than one element");
   }
 
-  CssRule min([int compare(CssRule a, CssRule b)]) => Collections.min(this, compare);
+  CssRule min([int compare(CssRule a, CssRule b)]) => IterableMixinWorkaround.min(this, compare);
 
-  CssRule max([int compare(CssRule a, CssRule b)]) => Collections.max(this, compare);
+  CssRule max([int compare(CssRule a, CssRule b)]) => IterableMixinWorkaround.max(this, compare);
 
   CssRule removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   CssRule removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(CssRule element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(CssRule element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<CssRule> from, [int startFrom]) {
@@ -28365,8 +28641,8 @@
 
   // -- end List<CssRule> mixins.
 
-
-  /** @domName CSSRuleList.item */
+  @DocsEditable
+  @DomName('CSSRuleList.item')
   CssRule item(int index) native "CSSRuleList_item_Callback";
 
 }
@@ -28377,12 +28653,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName CSSValueList
+@DocsEditable
+@DomName('CSSValueList')
 class _CssValueList extends CssValue implements List<CssValue> {
   _CssValueList.internal() : super.internal();
 
-
-  /** @domName CSSValueList.length */
+  @DocsEditable
+  @DomName('CSSValueList.length')
   int get length native "CSSValueList_length_Getter";
 
   CssValue operator[](int index) native "CSSValueList_item_Callback";
@@ -28403,50 +28680,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, CssValue)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(CssValue element) => Collections.contains(this, element);
+  bool contains(CssValue element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(CssValue element)) => Collections.forEach(this, f);
+  void forEach(void f(CssValue element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(CssValue element)) => new MappedList<CssValue, dynamic>(this, f);
+  List mappedBy(f(CssValue element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<CssValue> where(bool f(CssValue element)) => new WhereIterable<CssValue>(this, f);
+  Iterable<CssValue> where(bool f(CssValue element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(CssValue element)) => Collections.every(this, f);
+  bool every(bool f(CssValue element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(CssValue element)) => Collections.any(this, f);
+  bool any(bool f(CssValue element)) => IterableMixinWorkaround.any(this, f);
 
   List<CssValue> toList() => new List<CssValue>.from(this);
   Set<CssValue> toSet() => new Set<CssValue>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<CssValue> take(int n) => new ListView<CssValue>(this, 0, n);
+  List<CssValue> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<CssValue> takeWhile(bool test(CssValue value)) {
-    return new TakeWhileIterable<CssValue>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<CssValue> skip(int n) => new ListView<CssValue>(this, n, null);
+  List<CssValue> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<CssValue> skipWhile(bool test(CssValue value)) {
-    return new SkipWhileIterable<CssValue>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   CssValue firstMatching(bool test(CssValue value), { CssValue orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   CssValue lastMatching(bool test(CssValue value), {CssValue orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   CssValue singleMatching(bool test(CssValue value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   CssValue elementAt(int index) {
@@ -28504,16 +28781,36 @@
     throw new StateError("More than one element");
   }
 
-  CssValue min([int compare(CssValue a, CssValue b)]) => Collections.min(this, compare);
+  CssValue min([int compare(CssValue a, CssValue b)]) => IterableMixinWorkaround.min(this, compare);
 
-  CssValue max([int compare(CssValue a, CssValue b)]) => Collections.max(this, compare);
+  CssValue max([int compare(CssValue a, CssValue b)]) => IterableMixinWorkaround.max(this, compare);
 
   CssValue removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   CssValue removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(CssValue element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(CssValue element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<CssValue> from, [int startFrom]) {
@@ -28533,8 +28830,8 @@
 
   // -- end List<CssValue> mixins.
 
-
-  /** @domName CSSValueList.item */
+  @DocsEditable
+  @DomName('CSSValueList.item')
   CssValue item(int index) native "CSSValueList_item_Callback";
 
 }
@@ -28545,132 +28842,146 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName HTMLElement
+@DocsEditable
+@DomName('HTMLDirectoryElement')
+class _DirectoryElement extends _Element_Merged {
+  _DirectoryElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('HTMLElement')
 class _Element_Merged extends Element {
   _Element_Merged.internal() : super.internal();
 
-
-  /** @domName HTMLElement.children */
+  @DocsEditable
+  @DomName('HTMLElement.children')
   HtmlCollection get $dom_children native "HTMLElement_children_Getter";
 
-
-  /** @domName HTMLElement.contentEditable */
+  @DocsEditable
+  @DomName('HTMLElement.contentEditable')
   String get contentEditable native "HTMLElement_contentEditable_Getter";
 
-
-  /** @domName HTMLElement.contentEditable */
+  @DocsEditable
+  @DomName('HTMLElement.contentEditable')
   void set contentEditable(String value) native "HTMLElement_contentEditable_Setter";
 
-
-  /** @domName HTMLElement.dir */
+  @DocsEditable
+  @DomName('HTMLElement.dir')
   String get dir native "HTMLElement_dir_Getter";
 
-
-  /** @domName HTMLElement.dir */
+  @DocsEditable
+  @DomName('HTMLElement.dir')
   void set dir(String value) native "HTMLElement_dir_Setter";
 
-
-  /** @domName HTMLElement.draggable */
+  @DocsEditable
+  @DomName('HTMLElement.draggable')
   bool get draggable native "HTMLElement_draggable_Getter";
 
-
-  /** @domName HTMLElement.draggable */
+  @DocsEditable
+  @DomName('HTMLElement.draggable')
   void set draggable(bool value) native "HTMLElement_draggable_Setter";
 
-
-  /** @domName HTMLElement.hidden */
+  @DocsEditable
+  @DomName('HTMLElement.hidden')
   bool get hidden native "HTMLElement_hidden_Getter";
 
-
-  /** @domName HTMLElement.hidden */
+  @DocsEditable
+  @DomName('HTMLElement.hidden')
   void set hidden(bool value) native "HTMLElement_hidden_Setter";
 
-
-  /** @domName HTMLElement.id */
+  @DocsEditable
+  @DomName('HTMLElement.id')
   String get id native "HTMLElement_id_Getter";
 
-
-  /** @domName HTMLElement.id */
+  @DocsEditable
+  @DomName('HTMLElement.id')
   void set id(String value) native "HTMLElement_id_Setter";
 
-
-  /** @domName HTMLElement.innerHTML */
+  @DocsEditable
+  @DomName('HTMLElement.innerHTML')
   String get innerHtml native "HTMLElement_innerHTML_Getter";
 
-
-  /** @domName HTMLElement.innerHTML */
+  @DocsEditable
+  @DomName('HTMLElement.innerHTML')
   void set innerHtml(String value) native "HTMLElement_innerHTML_Setter";
 
-
-  /** @domName HTMLElement.isContentEditable */
+  @DocsEditable
+  @DomName('HTMLElement.isContentEditable')
   bool get isContentEditable native "HTMLElement_isContentEditable_Getter";
 
-
-  /** @domName HTMLElement.lang */
+  @DocsEditable
+  @DomName('HTMLElement.lang')
   String get lang native "HTMLElement_lang_Getter";
 
-
-  /** @domName HTMLElement.lang */
+  @DocsEditable
+  @DomName('HTMLElement.lang')
   void set lang(String value) native "HTMLElement_lang_Setter";
 
-
-  /** @domName HTMLElement.outerHTML */
+  @DocsEditable
+  @DomName('HTMLElement.outerHTML')
   String get outerHtml native "HTMLElement_outerHTML_Getter";
 
-
-  /** @domName HTMLElement.spellcheck */
+  @DocsEditable
+  @DomName('HTMLElement.spellcheck')
   bool get spellcheck native "HTMLElement_spellcheck_Getter";
 
-
-  /** @domName HTMLElement.spellcheck */
+  @DocsEditable
+  @DomName('HTMLElement.spellcheck')
   void set spellcheck(bool value) native "HTMLElement_spellcheck_Setter";
 
-
-  /** @domName HTMLElement.tabIndex */
+  @DocsEditable
+  @DomName('HTMLElement.tabIndex')
   int get tabIndex native "HTMLElement_tabIndex_Getter";
 
-
-  /** @domName HTMLElement.tabIndex */
+  @DocsEditable
+  @DomName('HTMLElement.tabIndex')
   void set tabIndex(int value) native "HTMLElement_tabIndex_Setter";
 
-
-  /** @domName HTMLElement.title */
+  @DocsEditable
+  @DomName('HTMLElement.title')
   String get title native "HTMLElement_title_Getter";
 
-
-  /** @domName HTMLElement.title */
+  @DocsEditable
+  @DomName('HTMLElement.title')
   void set title(String value) native "HTMLElement_title_Setter";
 
-
-  /** @domName HTMLElement.translate */
+  @DocsEditable
+  @DomName('HTMLElement.translate')
   bool get translate native "HTMLElement_translate_Getter";
 
-
-  /** @domName HTMLElement.translate */
+  @DocsEditable
+  @DomName('HTMLElement.translate')
   void set translate(bool value) native "HTMLElement_translate_Setter";
 
-
-  /** @domName HTMLElement.webkitdropzone */
+  @DocsEditable
+  @DomName('HTMLElement.webkitdropzone')
   String get webkitdropzone native "HTMLElement_webkitdropzone_Getter";
 
-
-  /** @domName HTMLElement.webkitdropzone */
+  @DocsEditable
+  @DomName('HTMLElement.webkitdropzone')
   void set webkitdropzone(String value) native "HTMLElement_webkitdropzone_Setter";
 
-
-  /** @domName HTMLElement.click */
+  @DocsEditable
+  @DomName('HTMLElement.click')
   void click() native "HTMLElement_click_Callback";
 
-
-  /** @domName HTMLElement.insertAdjacentElement */
+  @DocsEditable
+  @DomName('HTMLElement.insertAdjacentElement')
   Element insertAdjacentElement(String where, Element element) native "HTMLElement_insertAdjacentElement_Callback";
 
-
-  /** @domName HTMLElement.insertAdjacentHTML */
+  @DocsEditable
+  @DomName('HTMLElement.insertAdjacentHTML')
   void insertAdjacentHtml(String where, String html) native "HTMLElement_insertAdjacentHTML_Callback";
 
-
-  /** @domName HTMLElement.insertAdjacentText */
+  @DocsEditable
+  @DomName('HTMLElement.insertAdjacentText')
   void insertAdjacentText(String where, String text) native "HTMLElement_insertAdjacentText_Callback";
 
 }
@@ -28681,12 +28992,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName EntryArray
+@DocsEditable
+@DomName('EntryArray')
 class _EntryArray extends NativeFieldWrapperClass1 implements List<Entry> {
   _EntryArray.internal();
 
-
-  /** @domName EntryArray.length */
+  @DocsEditable
+  @DomName('EntryArray.length')
   int get length native "EntryArray_length_Getter";
 
   Entry operator[](int index) native "EntryArray_item_Callback";
@@ -28707,50 +29019,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Entry)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Entry element) => Collections.contains(this, element);
+  bool contains(Entry element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Entry element)) => Collections.forEach(this, f);
+  void forEach(void f(Entry element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Entry element)) => new MappedList<Entry, dynamic>(this, f);
+  List mappedBy(f(Entry element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Entry> where(bool f(Entry element)) => new WhereIterable<Entry>(this, f);
+  Iterable<Entry> where(bool f(Entry element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Entry element)) => Collections.every(this, f);
+  bool every(bool f(Entry element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Entry element)) => Collections.any(this, f);
+  bool any(bool f(Entry element)) => IterableMixinWorkaround.any(this, f);
 
   List<Entry> toList() => new List<Entry>.from(this);
   Set<Entry> toSet() => new Set<Entry>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Entry> take(int n) => new ListView<Entry>(this, 0, n);
+  List<Entry> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Entry> takeWhile(bool test(Entry value)) {
-    return new TakeWhileIterable<Entry>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Entry> skip(int n) => new ListView<Entry>(this, n, null);
+  List<Entry> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Entry> skipWhile(bool test(Entry value)) {
-    return new SkipWhileIterable<Entry>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Entry firstMatching(bool test(Entry value), { Entry orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Entry lastMatching(bool test(Entry value), {Entry orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Entry singleMatching(bool test(Entry value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Entry elementAt(int index) {
@@ -28808,16 +29120,36 @@
     throw new StateError("More than one element");
   }
 
-  Entry min([int compare(Entry a, Entry b)]) => Collections.min(this, compare);
+  Entry min([int compare(Entry a, Entry b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Entry max([int compare(Entry a, Entry b)]) => Collections.max(this, compare);
+  Entry max([int compare(Entry a, Entry b)]) => IterableMixinWorkaround.max(this, compare);
 
   Entry removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Entry removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Entry element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Entry element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Entry> from, [int startFrom]) {
@@ -28837,8 +29169,8 @@
 
   // -- end List<Entry> mixins.
 
-
-  /** @domName EntryArray.item */
+  @DocsEditable
+  @DomName('EntryArray.item')
   Entry item(int index) native "EntryArray_item_Callback";
 
 }
@@ -28849,12 +29181,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName EntryArraySync
+@DocsEditable
+@DomName('EntryArraySync')
 class _EntryArraySync extends NativeFieldWrapperClass1 implements List<EntrySync> {
   _EntryArraySync.internal();
 
-
-  /** @domName EntryArraySync.length */
+  @DocsEditable
+  @DomName('EntryArraySync.length')
   int get length native "EntryArraySync_length_Getter";
 
   EntrySync operator[](int index) native "EntryArraySync_item_Callback";
@@ -28875,50 +29208,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, EntrySync)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(EntrySync element) => Collections.contains(this, element);
+  bool contains(EntrySync element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(EntrySync element)) => Collections.forEach(this, f);
+  void forEach(void f(EntrySync element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(EntrySync element)) => new MappedList<EntrySync, dynamic>(this, f);
+  List mappedBy(f(EntrySync element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<EntrySync> where(bool f(EntrySync element)) => new WhereIterable<EntrySync>(this, f);
+  Iterable<EntrySync> where(bool f(EntrySync element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(EntrySync element)) => Collections.every(this, f);
+  bool every(bool f(EntrySync element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(EntrySync element)) => Collections.any(this, f);
+  bool any(bool f(EntrySync element)) => IterableMixinWorkaround.any(this, f);
 
   List<EntrySync> toList() => new List<EntrySync>.from(this);
   Set<EntrySync> toSet() => new Set<EntrySync>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<EntrySync> take(int n) => new ListView<EntrySync>(this, 0, n);
+  List<EntrySync> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<EntrySync> takeWhile(bool test(EntrySync value)) {
-    return new TakeWhileIterable<EntrySync>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<EntrySync> skip(int n) => new ListView<EntrySync>(this, n, null);
+  List<EntrySync> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<EntrySync> skipWhile(bool test(EntrySync value)) {
-    return new SkipWhileIterable<EntrySync>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   EntrySync firstMatching(bool test(EntrySync value), { EntrySync orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   EntrySync lastMatching(bool test(EntrySync value), {EntrySync orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   EntrySync singleMatching(bool test(EntrySync value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   EntrySync elementAt(int index) {
@@ -28976,16 +29309,36 @@
     throw new StateError("More than one element");
   }
 
-  EntrySync min([int compare(EntrySync a, EntrySync b)]) => Collections.min(this, compare);
+  EntrySync min([int compare(EntrySync a, EntrySync b)]) => IterableMixinWorkaround.min(this, compare);
 
-  EntrySync max([int compare(EntrySync a, EntrySync b)]) => Collections.max(this, compare);
+  EntrySync max([int compare(EntrySync a, EntrySync b)]) => IterableMixinWorkaround.max(this, compare);
 
   EntrySync removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   EntrySync removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(EntrySync element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(EntrySync element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<EntrySync> from, [int startFrom]) {
@@ -29005,8 +29358,8 @@
 
   // -- end List<EntrySync> mixins.
 
-
-  /** @domName EntryArraySync.item */
+  @DocsEditable
+  @DomName('EntryArraySync.item')
   EntrySync item(int index) native "EntryArraySync_item_Callback";
 
 }
@@ -29017,12 +29370,102 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName GamepadList
+@DocsEditable
+@DomName('HTMLFontElement')
+class _FontElement extends _Element_Merged {
+  _FontElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('HTMLFrameElement')
+class _FrameElement extends _Element_Merged {
+  _FrameElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('HTMLFrameSetElement')
+class _FrameSetElement extends _Element_Merged {
+  _FrameSetElement.internal() : super.internal();
+
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
+  _FrameSetElementEvents get on =>
+    new _FrameSetElementEvents(this);
+
+}
+
+@DocsEditable
+class _FrameSetElementEvents extends ElementEvents {
+  @DocsEditable
+  _FrameSetElementEvents(EventTarget _ptr) : super(_ptr);
+
+  @DocsEditable
+  EventListenerList get beforeUnload => this['beforeunload'];
+
+  @DocsEditable
+  EventListenerList get blur => this['blur'];
+
+  @DocsEditable
+  EventListenerList get error => this['error'];
+
+  @DocsEditable
+  EventListenerList get focus => this['focus'];
+
+  @DocsEditable
+  EventListenerList get hashChange => this['hashchange'];
+
+  @DocsEditable
+  EventListenerList get load => this['load'];
+
+  @DocsEditable
+  EventListenerList get message => this['message'];
+
+  @DocsEditable
+  EventListenerList get offline => this['offline'];
+
+  @DocsEditable
+  EventListenerList get online => this['online'];
+
+  @DocsEditable
+  EventListenerList get popState => this['popstate'];
+
+  @DocsEditable
+  EventListenerList get resize => this['resize'];
+
+  @DocsEditable
+  EventListenerList get storage => this['storage'];
+
+  @DocsEditable
+  EventListenerList get unload => this['unload'];
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('GamepadList')
 class _GamepadList extends NativeFieldWrapperClass1 implements List<Gamepad> {
   _GamepadList.internal();
 
-
-  /** @domName GamepadList.length */
+  @DocsEditable
+  @DomName('GamepadList.length')
   int get length native "GamepadList_length_Getter";
 
   Gamepad operator[](int index) native "GamepadList_item_Callback";
@@ -29043,50 +29486,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Gamepad)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Gamepad element) => Collections.contains(this, element);
+  bool contains(Gamepad element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Gamepad element)) => Collections.forEach(this, f);
+  void forEach(void f(Gamepad element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Gamepad element)) => new MappedList<Gamepad, dynamic>(this, f);
+  List mappedBy(f(Gamepad element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Gamepad> where(bool f(Gamepad element)) => new WhereIterable<Gamepad>(this, f);
+  Iterable<Gamepad> where(bool f(Gamepad element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Gamepad element)) => Collections.every(this, f);
+  bool every(bool f(Gamepad element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Gamepad element)) => Collections.any(this, f);
+  bool any(bool f(Gamepad element)) => IterableMixinWorkaround.any(this, f);
 
   List<Gamepad> toList() => new List<Gamepad>.from(this);
   Set<Gamepad> toSet() => new Set<Gamepad>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Gamepad> take(int n) => new ListView<Gamepad>(this, 0, n);
+  List<Gamepad> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Gamepad> takeWhile(bool test(Gamepad value)) {
-    return new TakeWhileIterable<Gamepad>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Gamepad> skip(int n) => new ListView<Gamepad>(this, n, null);
+  List<Gamepad> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Gamepad> skipWhile(bool test(Gamepad value)) {
-    return new SkipWhileIterable<Gamepad>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Gamepad firstMatching(bool test(Gamepad value), { Gamepad orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Gamepad lastMatching(bool test(Gamepad value), {Gamepad orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Gamepad singleMatching(bool test(Gamepad value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Gamepad elementAt(int index) {
@@ -29144,16 +29587,36 @@
     throw new StateError("More than one element");
   }
 
-  Gamepad min([int compare(Gamepad a, Gamepad b)]) => Collections.min(this, compare);
+  Gamepad min([int compare(Gamepad a, Gamepad b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Gamepad max([int compare(Gamepad a, Gamepad b)]) => Collections.max(this, compare);
+  Gamepad max([int compare(Gamepad a, Gamepad b)]) => IterableMixinWorkaround.max(this, compare);
 
   Gamepad removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Gamepad removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Gamepad element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Gamepad element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Gamepad> from, [int startFrom]) {
@@ -29173,8 +29636,8 @@
 
   // -- end List<Gamepad> mixins.
 
-
-  /** @domName GamepadList.item */
+  @DocsEditable
+  @DomName('GamepadList.item')
   Gamepad item(int index) native "GamepadList_item_Callback";
 
 }
@@ -29185,12 +29648,26 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaStreamList
+@DocsEditable
+@DomName('HTMLMarqueeElement')
+class _MarqueeElement extends _Element_Merged {
+  _MarqueeElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('MediaStreamList')
 class _MediaStreamList extends NativeFieldWrapperClass1 implements List<MediaStream> {
   _MediaStreamList.internal();
 
-
-  /** @domName MediaStreamList.length */
+  @DocsEditable
+  @DomName('MediaStreamList.length')
   int get length native "MediaStreamList_length_Getter";
 
   MediaStream operator[](int index) native "MediaStreamList_item_Callback";
@@ -29211,50 +29688,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, MediaStream)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(MediaStream element) => Collections.contains(this, element);
+  bool contains(MediaStream element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(MediaStream element)) => Collections.forEach(this, f);
+  void forEach(void f(MediaStream element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(MediaStream element)) => new MappedList<MediaStream, dynamic>(this, f);
+  List mappedBy(f(MediaStream element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<MediaStream> where(bool f(MediaStream element)) => new WhereIterable<MediaStream>(this, f);
+  Iterable<MediaStream> where(bool f(MediaStream element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(MediaStream element)) => Collections.every(this, f);
+  bool every(bool f(MediaStream element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(MediaStream element)) => Collections.any(this, f);
+  bool any(bool f(MediaStream element)) => IterableMixinWorkaround.any(this, f);
 
   List<MediaStream> toList() => new List<MediaStream>.from(this);
   Set<MediaStream> toSet() => new Set<MediaStream>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<MediaStream> take(int n) => new ListView<MediaStream>(this, 0, n);
+  List<MediaStream> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<MediaStream> takeWhile(bool test(MediaStream value)) {
-    return new TakeWhileIterable<MediaStream>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<MediaStream> skip(int n) => new ListView<MediaStream>(this, n, null);
+  List<MediaStream> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<MediaStream> skipWhile(bool test(MediaStream value)) {
-    return new SkipWhileIterable<MediaStream>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   MediaStream firstMatching(bool test(MediaStream value), { MediaStream orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   MediaStream lastMatching(bool test(MediaStream value), {MediaStream orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   MediaStream singleMatching(bool test(MediaStream value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   MediaStream elementAt(int index) {
@@ -29312,16 +29789,36 @@
     throw new StateError("More than one element");
   }
 
-  MediaStream min([int compare(MediaStream a, MediaStream b)]) => Collections.min(this, compare);
+  MediaStream min([int compare(MediaStream a, MediaStream b)]) => IterableMixinWorkaround.min(this, compare);
 
-  MediaStream max([int compare(MediaStream a, MediaStream b)]) => Collections.max(this, compare);
+  MediaStream max([int compare(MediaStream a, MediaStream b)]) => IterableMixinWorkaround.max(this, compare);
 
   MediaStream removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   MediaStream removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(MediaStream element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(MediaStream element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<MediaStream> from, [int startFrom]) {
@@ -29341,8 +29838,8 @@
 
   // -- end List<MediaStream> mixins.
 
-
-  /** @domName MediaStreamList.item */
+  @DocsEditable
+  @DomName('MediaStreamList.item')
   MediaStream item(int index) native "MediaStreamList_item_Callback";
 
 }
@@ -29353,12 +29850,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SpeechInputResultList
+@DocsEditable
+@DomName('SpeechInputResultList')
 class _SpeechInputResultList extends NativeFieldWrapperClass1 implements List<SpeechInputResult> {
   _SpeechInputResultList.internal();
 
-
-  /** @domName SpeechInputResultList.length */
+  @DocsEditable
+  @DomName('SpeechInputResultList.length')
   int get length native "SpeechInputResultList_length_Getter";
 
   SpeechInputResult operator[](int index) native "SpeechInputResultList_item_Callback";
@@ -29379,50 +29877,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechInputResult)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(SpeechInputResult element) => Collections.contains(this, element);
+  bool contains(SpeechInputResult element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(SpeechInputResult element)) => Collections.forEach(this, f);
+  void forEach(void f(SpeechInputResult element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(SpeechInputResult element)) => new MappedList<SpeechInputResult, dynamic>(this, f);
+  List mappedBy(f(SpeechInputResult element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<SpeechInputResult> where(bool f(SpeechInputResult element)) => new WhereIterable<SpeechInputResult>(this, f);
+  Iterable<SpeechInputResult> where(bool f(SpeechInputResult element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(SpeechInputResult element)) => Collections.every(this, f);
+  bool every(bool f(SpeechInputResult element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(SpeechInputResult element)) => Collections.any(this, f);
+  bool any(bool f(SpeechInputResult element)) => IterableMixinWorkaround.any(this, f);
 
   List<SpeechInputResult> toList() => new List<SpeechInputResult>.from(this);
   Set<SpeechInputResult> toSet() => new Set<SpeechInputResult>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<SpeechInputResult> take(int n) => new ListView<SpeechInputResult>(this, 0, n);
+  List<SpeechInputResult> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<SpeechInputResult> takeWhile(bool test(SpeechInputResult value)) {
-    return new TakeWhileIterable<SpeechInputResult>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<SpeechInputResult> skip(int n) => new ListView<SpeechInputResult>(this, n, null);
+  List<SpeechInputResult> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<SpeechInputResult> skipWhile(bool test(SpeechInputResult value)) {
-    return new SkipWhileIterable<SpeechInputResult>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   SpeechInputResult firstMatching(bool test(SpeechInputResult value), { SpeechInputResult orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   SpeechInputResult lastMatching(bool test(SpeechInputResult value), {SpeechInputResult orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   SpeechInputResult singleMatching(bool test(SpeechInputResult value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   SpeechInputResult elementAt(int index) {
@@ -29480,16 +29978,36 @@
     throw new StateError("More than one element");
   }
 
-  SpeechInputResult min([int compare(SpeechInputResult a, SpeechInputResult b)]) => Collections.min(this, compare);
+  SpeechInputResult min([int compare(SpeechInputResult a, SpeechInputResult b)]) => IterableMixinWorkaround.min(this, compare);
 
-  SpeechInputResult max([int compare(SpeechInputResult a, SpeechInputResult b)]) => Collections.max(this, compare);
+  SpeechInputResult max([int compare(SpeechInputResult a, SpeechInputResult b)]) => IterableMixinWorkaround.max(this, compare);
 
   SpeechInputResult removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   SpeechInputResult removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(SpeechInputResult element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(SpeechInputResult element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<SpeechInputResult> from, [int startFrom]) {
@@ -29509,8 +30027,8 @@
 
   // -- end List<SpeechInputResult> mixins.
 
-
-  /** @domName SpeechInputResultList.item */
+  @DocsEditable
+  @DomName('SpeechInputResultList.item')
   SpeechInputResult item(int index) native "SpeechInputResultList_item_Callback";
 
 }
@@ -29521,12 +30039,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SpeechRecognitionResultList
+@DocsEditable
+@DomName('SpeechRecognitionResultList')
 class _SpeechRecognitionResultList extends NativeFieldWrapperClass1 implements List<SpeechRecognitionResult> {
   _SpeechRecognitionResultList.internal();
 
-
-  /** @domName SpeechRecognitionResultList.length */
+  @DocsEditable
+  @DomName('SpeechRecognitionResultList.length')
   int get length native "SpeechRecognitionResultList_length_Getter";
 
   SpeechRecognitionResult operator[](int index) native "SpeechRecognitionResultList_item_Callback";
@@ -29547,50 +30066,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechRecognitionResult)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(SpeechRecognitionResult element) => Collections.contains(this, element);
+  bool contains(SpeechRecognitionResult element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(SpeechRecognitionResult element)) => Collections.forEach(this, f);
+  void forEach(void f(SpeechRecognitionResult element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(SpeechRecognitionResult element)) => new MappedList<SpeechRecognitionResult, dynamic>(this, f);
+  List mappedBy(f(SpeechRecognitionResult element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<SpeechRecognitionResult> where(bool f(SpeechRecognitionResult element)) => new WhereIterable<SpeechRecognitionResult>(this, f);
+  Iterable<SpeechRecognitionResult> where(bool f(SpeechRecognitionResult element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(SpeechRecognitionResult element)) => Collections.every(this, f);
+  bool every(bool f(SpeechRecognitionResult element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(SpeechRecognitionResult element)) => Collections.any(this, f);
+  bool any(bool f(SpeechRecognitionResult element)) => IterableMixinWorkaround.any(this, f);
 
   List<SpeechRecognitionResult> toList() => new List<SpeechRecognitionResult>.from(this);
   Set<SpeechRecognitionResult> toSet() => new Set<SpeechRecognitionResult>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<SpeechRecognitionResult> take(int n) => new ListView<SpeechRecognitionResult>(this, 0, n);
+  List<SpeechRecognitionResult> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<SpeechRecognitionResult> takeWhile(bool test(SpeechRecognitionResult value)) {
-    return new TakeWhileIterable<SpeechRecognitionResult>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<SpeechRecognitionResult> skip(int n) => new ListView<SpeechRecognitionResult>(this, n, null);
+  List<SpeechRecognitionResult> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<SpeechRecognitionResult> skipWhile(bool test(SpeechRecognitionResult value)) {
-    return new SkipWhileIterable<SpeechRecognitionResult>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   SpeechRecognitionResult firstMatching(bool test(SpeechRecognitionResult value), { SpeechRecognitionResult orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   SpeechRecognitionResult lastMatching(bool test(SpeechRecognitionResult value), {SpeechRecognitionResult orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   SpeechRecognitionResult singleMatching(bool test(SpeechRecognitionResult value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   SpeechRecognitionResult elementAt(int index) {
@@ -29648,16 +30167,36 @@
     throw new StateError("More than one element");
   }
 
-  SpeechRecognitionResult min([int compare(SpeechRecognitionResult a, SpeechRecognitionResult b)]) => Collections.min(this, compare);
+  SpeechRecognitionResult min([int compare(SpeechRecognitionResult a, SpeechRecognitionResult b)]) => IterableMixinWorkaround.min(this, compare);
 
-  SpeechRecognitionResult max([int compare(SpeechRecognitionResult a, SpeechRecognitionResult b)]) => Collections.max(this, compare);
+  SpeechRecognitionResult max([int compare(SpeechRecognitionResult a, SpeechRecognitionResult b)]) => IterableMixinWorkaround.max(this, compare);
 
   SpeechRecognitionResult removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   SpeechRecognitionResult removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(SpeechRecognitionResult element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(SpeechRecognitionResult element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<SpeechRecognitionResult> from, [int startFrom]) {
@@ -29677,8 +30216,8 @@
 
   // -- end List<SpeechRecognitionResult> mixins.
 
-
-  /** @domName SpeechRecognitionResultList.item */
+  @DocsEditable
+  @DomName('SpeechRecognitionResultList.item')
   SpeechRecognitionResult item(int index) native "SpeechRecognitionResultList_item_Callback";
 
 }
@@ -29689,12 +30228,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName StyleSheetList
+@DocsEditable
+@DomName('StyleSheetList')
 class _StyleSheetList extends NativeFieldWrapperClass1 implements List<StyleSheet> {
   _StyleSheetList.internal();
 
-
-  /** @domName StyleSheetList.length */
+  @DocsEditable
+  @DomName('StyleSheetList.length')
   int get length native "StyleSheetList_length_Getter";
 
   StyleSheet operator[](int index) native "StyleSheetList_item_Callback";
@@ -29715,50 +30255,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, StyleSheet)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(StyleSheet element) => Collections.contains(this, element);
+  bool contains(StyleSheet element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(StyleSheet element)) => Collections.forEach(this, f);
+  void forEach(void f(StyleSheet element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(StyleSheet element)) => new MappedList<StyleSheet, dynamic>(this, f);
+  List mappedBy(f(StyleSheet element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<StyleSheet> where(bool f(StyleSheet element)) => new WhereIterable<StyleSheet>(this, f);
+  Iterable<StyleSheet> where(bool f(StyleSheet element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(StyleSheet element)) => Collections.every(this, f);
+  bool every(bool f(StyleSheet element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(StyleSheet element)) => Collections.any(this, f);
+  bool any(bool f(StyleSheet element)) => IterableMixinWorkaround.any(this, f);
 
   List<StyleSheet> toList() => new List<StyleSheet>.from(this);
   Set<StyleSheet> toSet() => new Set<StyleSheet>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<StyleSheet> take(int n) => new ListView<StyleSheet>(this, 0, n);
+  List<StyleSheet> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<StyleSheet> takeWhile(bool test(StyleSheet value)) {
-    return new TakeWhileIterable<StyleSheet>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<StyleSheet> skip(int n) => new ListView<StyleSheet>(this, n, null);
+  List<StyleSheet> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<StyleSheet> skipWhile(bool test(StyleSheet value)) {
-    return new SkipWhileIterable<StyleSheet>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   StyleSheet firstMatching(bool test(StyleSheet value), { StyleSheet orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   StyleSheet lastMatching(bool test(StyleSheet value), {StyleSheet orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   StyleSheet singleMatching(bool test(StyleSheet value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   StyleSheet elementAt(int index) {
@@ -29816,16 +30356,36 @@
     throw new StateError("More than one element");
   }
 
-  StyleSheet min([int compare(StyleSheet a, StyleSheet b)]) => Collections.min(this, compare);
+  StyleSheet min([int compare(StyleSheet a, StyleSheet b)]) => IterableMixinWorkaround.min(this, compare);
 
-  StyleSheet max([int compare(StyleSheet a, StyleSheet b)]) => Collections.max(this, compare);
+  StyleSheet max([int compare(StyleSheet a, StyleSheet b)]) => IterableMixinWorkaround.max(this, compare);
 
   StyleSheet removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   StyleSheet removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(StyleSheet element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(StyleSheet element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<StyleSheet> from, [int startFrom]) {
@@ -29845,8 +30405,8 @@
 
   // -- end List<StyleSheet> mixins.
 
-
-  /** @domName StyleSheetList.item */
+  @DocsEditable
+  @DomName('StyleSheetList.item')
   StyleSheet item(int index) native "StyleSheetList_item_Callback";
 
 }
@@ -30268,11 +30828,12 @@
 
   void add(String value) {
     // TODO - figure out if we need to do any validation here
-    // or if the browser natively does enough
+    // or if the browser natively does enough.
     _modify((s) => s.add(value));
   }
 
-  bool remove(String value) {
+  bool remove(Object value) {
+    if (value is! String) return false;
     Set<String> s = readClasses();
     bool result = s.remove(value);
     writeClasses(s);
@@ -30280,7 +30841,7 @@
   }
 
   void addAll(Iterable<String> iterable) {
-    // TODO - see comment above about validation
+    // TODO - see comment above about validation.
     _modify((s) => s.addAll(iterable));
   }
 
@@ -30288,6 +30849,18 @@
     _modify((s) => s.removeAll(iterable));
   }
 
+  void retainAll(Iterable<String> iterable) {
+    _modify((s) => s.retainAll(iterable));
+  }
+
+  void removeMatching(bool test(String name)) {
+    _modify((s) => s.removeMatching(test));
+  }
+
+  void retainMatching(bool test(String name)) {
+    _modify((s) => s.retainMatching(test));
+  }
+
   bool isSubsetOf(Collection<String> collection) =>
     readClasses().isSubsetOf(collection);
 
@@ -30496,6 +31069,21 @@
     return new _EventStream(e, _eventType, useCapture);
   }
 }
+
+/**
+ * A factory to expose DOM events as streams, where the DOM event name has to
+ * be determined on the fly (for example, mouse wheel events).
+ */
+class _CustomEventStreamProvider<T extends Event>
+    implements EventStreamProvider<T> {
+
+  final _eventTypeGetter;
+  const _CustomEventStreamProvider(this._eventTypeGetter);
+
+  Stream<T> forTarget(EventTarget e, {bool useCapture: false}) {
+    return new _EventStream(e, _eventTypeGetter(e), useCapture);
+  }
+}
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -31799,7 +32387,7 @@
 }
 
 class _DocumentFragmentFactoryProvider {
-  /** @domName Document.createDocumentFragment */
+  @DomName('Document.createDocumentFragment')
   static DocumentFragment createDocumentFragment() =>
       document.createDocumentFragment();
 
diff --git a/sdk/lib/html/html_common/filtered_element_list.dart b/sdk/lib/html/html_common/filtered_element_list.dart
index 776d2fd..44768c4 100644
--- a/sdk/lib/html/html_common/filtered_element_list.dart
+++ b/sdk/lib/html/html_common/filtered_element_list.dart
@@ -108,9 +108,39 @@
     return result;
   }
 
+  void remove(Object element) {
+    if (element is! Element) return;
+    for (int i = 0; i < length; i++) {
+      Element indexElement = this[i];
+      if (identical(indexElement, element)) {
+        indexElement.remove();
+        return;
+      }
+    }
+  }
+
+  // Operations defined in terms of [Collections]' [remove].
+
+  void removeAll(Iterable elements) {
+    // This should be optimized to not use [remove] directly.
+    Collections.removeAll(this, elements);
+  }
+
+  void retainAll(Iterable elements) {
+    Collections.retainAll(this, elements);
+  }
+
+  void removeMatching(bool test(Element element)) {
+    Collections.removeMatching(this, test);
+  }
+
+  void retainMatching(bool test(Element element)) {
+    Collections.retainMatching(this, test);
+  }
+
   dynamic reduce(dynamic initialValue,
       dynamic combine(dynamic previousValue, Element element)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
   bool every(bool f(Element element)) => _filtered.every(f);
   bool any(bool f(Element element)) => _filtered.any(f);
@@ -132,7 +162,6 @@
     return this[index];
   }
 
-
   bool get isEmpty => _filtered.isEmpty;
   int get length => _filtered.length;
   Element operator [](int index) => _filtered[index];
diff --git a/sdk/lib/html/html_common/metadata.dart b/sdk/lib/html/html_common/metadata.dart
index d1b2c41..a729ac5 100644
--- a/sdk/lib/html/html_common/metadata.dart
+++ b/sdk/lib/html/html_common/metadata.dart
@@ -15,6 +15,7 @@
   static const String CHROME = "Chrome";
   static const String FIREFOX = "Firefox";
   static const String IE = "Internet Explorer";
+  static const String OPERA = "Opera";
   static const String SAFARI = "Safari";
 
   /// The name of the browser.
@@ -40,3 +41,23 @@
 class Experimental {
   const Experimental();
 }
+
+
+/**
+ * Metadata that specifies the DOM name associated with the element.
+ *
+ * This is used for API generation.
+ *
+ * [name] should be formatted as `interface.member`.
+ */
+class DomName {
+  final String name;
+  const DomName(this.name);
+}
+
+
+/// Metadata that specifies that that member is editable through generated
+/// files.
+class DocsEditable {
+  const DocsEditable();
+}
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index e1b16f6..dd481b1 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -133,26 +133,26 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBCursor; @docsEditable true
+
+@DocsEditable
+@DomName('IDBCursor')
 class Cursor native "*IDBCursor" {
 
-  /// @domName IDBCursor.direction; @docsEditable true
+  @DocsEditable @DomName('IDBCursor.direction')
   final String direction;
 
-  /// @domName IDBCursor.key; @docsEditable true
-  @_annotation_Creates_IDBKey @_annotation_Returns_IDBKey
+  @DocsEditable @DomName('IDBCursor.key') @_annotation_Creates_IDBKey @_annotation_Returns_IDBKey
   final Object key;
 
-  /// @domName IDBCursor.primaryKey; @docsEditable true
+  @DocsEditable @DomName('IDBCursor.primaryKey')
   final Object primaryKey;
 
-  /// @domName IDBCursor.source; @docsEditable true
+  @DocsEditable @DomName('IDBCursor.source')
   final dynamic source;
 
-  /// @domName IDBCursor.advance; @docsEditable true
+  @DocsEditable @DomName('IDBCursor.advance')
   void advance(int count) native;
 
-  /// @domName IDBCursor.continueFunction; @docsEditable true
   void continueFunction([/*IDBKey*/ key]) {
     if (?key) {
       var key_1 = _convertDartToNative_IDBKey(key);
@@ -163,19 +163,21 @@
     return;
   }
   @JSName('continue')
+  @DocsEditable @DomName('IDBCursor.continue')
   void _continueFunction_1(key) native;
   @JSName('continue')
+  @DocsEditable @DomName('IDBCursor.continue')
   void _continueFunction_2() native;
 
-  /// @domName IDBCursor.delete; @docsEditable true
+  @DocsEditable @DomName('IDBCursor.delete')
   Request delete() native;
 
-  /// @domName IDBCursor.update; @docsEditable true
   Request update(/*any*/ value) {
     var value_1 = convertDartToNative_SerializedScriptValue(value);
     return _update_1(value_1);
   }
   @JSName('update')
+  @DocsEditable @DomName('IDBCursor.update')
   Request _update_1(value) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -183,11 +185,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBCursorWithValue; @docsEditable true
+
+@DocsEditable
+@DomName('IDBCursorWithValue')
 class CursorWithValue extends Cursor native "*IDBCursorWithValue" {
 
-  /// @domName IDBCursorWithValue.value; @docsEditable true
-  @annotation_Creates_SerializedScriptValue @annotation_Returns_SerializedScriptValue
+  @DocsEditable @DomName('IDBCursorWithValue.value') @annotation_Creates_SerializedScriptValue @annotation_Returns_SerializedScriptValue
   final Object value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -195,7 +198,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBDatabase
+@DocsEditable
+@DomName('IDBDatabase')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.FIREFOX, '15')
+@SupportedBrowser(SupportedBrowser.IE, '10')
+@Experimental()
 class Database extends EventTarget native "*IDBDatabase" {
 
   Transaction transaction(storeName_OR_storeNames, String mode) {
@@ -222,28 +230,28 @@
 
   static const EventStreamProvider<UpgradeNeededEvent> versionChangeEvent = const EventStreamProvider<UpgradeNeededEvent>('versionchange');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   DatabaseEvents get on =>
     new DatabaseEvents(this);
 
-  /// @domName IDBDatabase.name; @docsEditable true
+  @DocsEditable @DomName('IDBDatabase.name')
   final String name;
 
-  /// @domName IDBDatabase.objectStoreNames; @docsEditable true
+  @DocsEditable @DomName('IDBDatabase.objectStoreNames')
   @Returns('DomStringList') @Creates('DomStringList')
   final List<String> objectStoreNames;
 
-  /// @domName IDBDatabase.version; @docsEditable true
+  @DocsEditable @DomName('IDBDatabase.version')
   final dynamic version;
 
-  /// @domName IDBDatabase.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('IDBDatabase.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName IDBDatabase.close; @docsEditable true
+  @DocsEditable @DomName('IDBDatabase.close')
   void close() native;
 
-  /// @domName IDBDatabase.createObjectStore; @docsEditable true
   ObjectStore createObjectStore(String name, [Map options]) {
     if (?options) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -252,19 +260,21 @@
     return _createObjectStore_2(name);
   }
   @JSName('createObjectStore')
+  @DocsEditable @DomName('IDBDatabase.createObjectStore')
   ObjectStore _createObjectStore_1(name, options) native;
   @JSName('createObjectStore')
+  @DocsEditable @DomName('IDBDatabase.createObjectStore')
   ObjectStore _createObjectStore_2(name) native;
 
-  /// @domName IDBDatabase.deleteObjectStore; @docsEditable true
+  @DocsEditable @DomName('IDBDatabase.deleteObjectStore')
   void deleteObjectStore(String name) native;
 
-  /// @domName IDBDatabase.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('IDBDatabase.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName IDBDatabase.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('IDBDatabase.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   Stream<Event> get onAbort => abortEvent.forTarget(this);
@@ -274,18 +284,18 @@
   Stream<UpgradeNeededEvent> get onVersionChange => versionChangeEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class DatabaseEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   DatabaseEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get versionChange => this['versionchange'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -293,7 +303,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBFactory
+@DocsEditable
+@DomName('IDBFactory')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -310,23 +321,22 @@
   }
 
 
-  /// @domName IDBFactory.cmp; @docsEditable true
   int cmp(/*IDBKey*/ first, /*IDBKey*/ second) {
     var first_1 = _convertDartToNative_IDBKey(first);
     var second_2 = _convertDartToNative_IDBKey(second);
     return _cmp_1(first_1, second_2);
   }
   @JSName('cmp')
+  @DocsEditable @DomName('IDBFactory.cmp')
   int _cmp_1(first, second) native;
 
-  /// @domName IDBFactory.deleteDatabase; @docsEditable true
+  @DocsEditable @DomName('IDBFactory.deleteDatabase')
   VersionChangeRequest deleteDatabase(String name) native;
 
-  /// @domName IDBFactory.open; @docsEditable true
-  @Returns('Request') @Creates('Request') @Creates('Database')
+  @DocsEditable @DomName('IDBFactory.open') @Returns('Request') @Creates('Request') @Creates('Database')
   OpenDBRequest open(String name, [int version]) native;
 
-  /// @domName IDBFactory.webkitGetDatabaseNames; @docsEditable true
+  @DocsEditable @DomName('IDBFactory.webkitGetDatabaseNames')
   Request webkitGetDatabaseNames() native;
 
 }
@@ -335,25 +345,26 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBIndex; @docsEditable true
+
+@DocsEditable
+@DomName('IDBIndex')
 class Index native "*IDBIndex" {
 
-  /// @domName IDBIndex.keyPath; @docsEditable true
+  @DocsEditable @DomName('IDBIndex.keyPath')
   final dynamic keyPath;
 
-  /// @domName IDBIndex.multiEntry; @docsEditable true
+  @DocsEditable @DomName('IDBIndex.multiEntry')
   final bool multiEntry;
 
-  /// @domName IDBIndex.name; @docsEditable true
+  @DocsEditable @DomName('IDBIndex.name')
   final String name;
 
-  /// @domName IDBIndex.objectStore; @docsEditable true
+  @DocsEditable @DomName('IDBIndex.objectStore')
   final ObjectStore objectStore;
 
-  /// @domName IDBIndex.unique; @docsEditable true
+  @DocsEditable @DomName('IDBIndex.unique')
   final bool unique;
 
-  /// @domName IDBIndex.count; @docsEditable true
   Request count([key_OR_range]) {
     if (!?key_OR_range) {
       return _count_1();
@@ -368,13 +379,15 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('count')
+  @DocsEditable @DomName('IDBIndex.count')
   Request _count_1() native;
   @JSName('count')
+  @DocsEditable @DomName('IDBIndex.count')
   Request _count_2(KeyRange range) native;
   @JSName('count')
+  @DocsEditable @DomName('IDBIndex.count')
   Request _count_3(key) native;
 
-  /// @domName IDBIndex.get; @docsEditable true
   Request get(key) {
     if ((key is KeyRange || key == null)) {
       return _get_1(key);
@@ -386,13 +399,12 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('get')
-  @Returns('Request') @Creates('Request') @annotation_Creates_SerializedScriptValue
+  @DocsEditable @DomName('IDBIndex.get') @Returns('Request') @Creates('Request') @annotation_Creates_SerializedScriptValue
   Request _get_1(KeyRange key) native;
   @JSName('get')
-  @Returns('Request') @Creates('Request') @annotation_Creates_SerializedScriptValue
+  @DocsEditable @DomName('IDBIndex.get') @Returns('Request') @Creates('Request') @annotation_Creates_SerializedScriptValue
   Request _get_2(key) native;
 
-  /// @domName IDBIndex.getKey; @docsEditable true
   Request getKey(key) {
     if ((key is KeyRange || key == null)) {
       return _getKey_1(key);
@@ -404,13 +416,12 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('getKey')
-  @Returns('Request') @Creates('Request') @annotation_Creates_SerializedScriptValue @Creates('ObjectStore')
+  @DocsEditable @DomName('IDBIndex.getKey') @Returns('Request') @Creates('Request') @annotation_Creates_SerializedScriptValue @Creates('ObjectStore')
   Request _getKey_1(KeyRange key) native;
   @JSName('getKey')
-  @Returns('Request') @Creates('Request') @annotation_Creates_SerializedScriptValue @Creates('ObjectStore')
+  @DocsEditable @DomName('IDBIndex.getKey') @Returns('Request') @Creates('Request') @annotation_Creates_SerializedScriptValue @Creates('ObjectStore')
   Request _getKey_2(key) native;
 
-  /// @domName IDBIndex.openCursor; @docsEditable true
   Request openCursor([key_OR_range, String direction]) {
     if (!?key_OR_range &&
         !?direction) {
@@ -435,22 +446,21 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('openCursor')
-  @Returns('Request') @Creates('Request') @Creates('Cursor')
+  @DocsEditable @DomName('IDBIndex.openCursor') @Returns('Request') @Creates('Request') @Creates('Cursor')
   Request _openCursor_1() native;
   @JSName('openCursor')
-  @Returns('Request') @Creates('Request') @Creates('Cursor')
+  @DocsEditable @DomName('IDBIndex.openCursor') @Returns('Request') @Creates('Request') @Creates('Cursor')
   Request _openCursor_2(KeyRange range) native;
   @JSName('openCursor')
-  @Returns('Request') @Creates('Request') @Creates('Cursor')
+  @DocsEditable @DomName('IDBIndex.openCursor') @Returns('Request') @Creates('Request') @Creates('Cursor')
   Request _openCursor_3(KeyRange range, direction) native;
   @JSName('openCursor')
-  @Returns('Request') @Creates('Request') @Creates('Cursor')
+  @DocsEditable @DomName('IDBIndex.openCursor') @Returns('Request') @Creates('Request') @Creates('Cursor')
   Request _openCursor_4(key) native;
   @JSName('openCursor')
-  @Returns('Request') @Creates('Request') @Creates('Cursor')
+  @DocsEditable @DomName('IDBIndex.openCursor') @Returns('Request') @Creates('Request') @Creates('Cursor')
   Request _openCursor_5(key, direction) native;
 
-  /// @domName IDBIndex.openKeyCursor; @docsEditable true
   Request openKeyCursor([key_OR_range, String direction]) {
     if (!?key_OR_range &&
         !?direction) {
@@ -475,19 +485,19 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('openKeyCursor')
-  @Returns('Request') @Creates('Request') @Creates('Cursor')
+  @DocsEditable @DomName('IDBIndex.openKeyCursor') @Returns('Request') @Creates('Request') @Creates('Cursor')
   Request _openKeyCursor_1() native;
   @JSName('openKeyCursor')
-  @Returns('Request') @Creates('Request') @Creates('Cursor')
+  @DocsEditable @DomName('IDBIndex.openKeyCursor') @Returns('Request') @Creates('Request') @Creates('Cursor')
   Request _openKeyCursor_2(KeyRange range) native;
   @JSName('openKeyCursor')
-  @Returns('Request') @Creates('Request') @Creates('Cursor')
+  @DocsEditable @DomName('IDBIndex.openKeyCursor') @Returns('Request') @Creates('Request') @Creates('Cursor')
   Request _openKeyCursor_3(KeyRange range, direction) native;
   @JSName('openKeyCursor')
-  @Returns('Request') @Creates('Request') @Creates('Cursor')
+  @DocsEditable @DomName('IDBIndex.openKeyCursor') @Returns('Request') @Creates('Request') @Creates('Cursor')
   Request _openKeyCursor_4(key) native;
   @JSName('openKeyCursor')
-  @Returns('Request') @Creates('Request') @Creates('Cursor')
+  @DocsEditable @DomName('IDBIndex.openKeyCursor') @Returns('Request') @Creates('Request') @Creates('Cursor')
   Request _openKeyCursor_5(key, direction) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -495,7 +505,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBKey; @docsEditable true
+
+@DocsEditable
+@DomName('IDBKey')
 class Key native "*IDBKey" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -503,52 +515,44 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBKeyRange
+@DocsEditable
+@DomName('IDBKeyRange')
 class KeyRange native "*IDBKeyRange" {
-  /**
-   * @domName IDBKeyRange.only
-   */
+  @DomName('IDBKeyRange.only')
   factory KeyRange.only(/*Key*/ value) =>
       _KeyRangeFactoryProvider.createKeyRange_only(value);
 
-  /**
-   * @domName IDBKeyRange.lowerBound
-   */
+  @DomName('IDBKeyRange.lowerBound')
   factory KeyRange.lowerBound(/*Key*/ bound, [bool open = false]) =>
       _KeyRangeFactoryProvider.createKeyRange_lowerBound(bound, open);
 
-  /**
-   * @domName IDBKeyRange.upperBound
-   */
+  @DomName('IDBKeyRange.upperBound')
   factory KeyRange.upperBound(/*Key*/ bound, [bool open = false]) =>
       _KeyRangeFactoryProvider.createKeyRange_upperBound(bound, open);
 
-  /**
-   * @domName KeyRange.bound
-   */
+  @DomName('KeyRange.bound')
   factory KeyRange.bound(/*Key*/ lower, /*Key*/ upper,
                             [bool lowerOpen = false, bool upperOpen = false]) =>
       _KeyRangeFactoryProvider.createKeyRange_bound(
           lower, upper, lowerOpen, upperOpen);
 
 
-  /// @domName IDBKeyRange.lower; @docsEditable true
   dynamic get lower => _convertNativeToDart_IDBKey(this._lower);
   @JSName('lower')
+  @DocsEditable @DomName('IDBKeyRange.lower')
   final dynamic _lower;
 
-  /// @domName IDBKeyRange.lowerOpen; @docsEditable true
+  @DocsEditable @DomName('IDBKeyRange.lowerOpen')
   final bool lowerOpen;
 
-  /// @domName IDBKeyRange.upper; @docsEditable true
   dynamic get upper => _convertNativeToDart_IDBKey(this._upper);
   @JSName('upper')
+  @DocsEditable @DomName('IDBKeyRange.upper')
   final dynamic _upper;
 
-  /// @domName IDBKeyRange.upperOpen; @docsEditable true
+  @DocsEditable @DomName('IDBKeyRange.upperOpen')
   final bool upperOpen;
 
-  /// @domName IDBKeyRange.bound_; @docsEditable true
   static KeyRange bound_(/*IDBKey*/ lower, /*IDBKey*/ upper, [bool lowerOpen, bool upperOpen]) {
     if (?upperOpen) {
       var lower_1 = _convertDartToNative_IDBKey(lower);
@@ -565,13 +569,15 @@
     return _bound__3(lower_5, upper_6);
   }
   @JSName('bound')
+  @DocsEditable @DomName('IDBKeyRange.bound')
   static KeyRange _bound__1(lower, upper, lowerOpen, upperOpen) native;
   @JSName('bound')
+  @DocsEditable @DomName('IDBKeyRange.bound')
   static KeyRange _bound__2(lower, upper, lowerOpen) native;
   @JSName('bound')
+  @DocsEditable @DomName('IDBKeyRange.bound')
   static KeyRange _bound__3(lower, upper) native;
 
-  /// @domName IDBKeyRange.lowerBound_; @docsEditable true
   static KeyRange lowerBound_(/*IDBKey*/ bound, [bool open]) {
     if (?open) {
       var bound_1 = _convertDartToNative_IDBKey(bound);
@@ -581,19 +587,20 @@
     return _lowerBound__2(bound_2);
   }
   @JSName('lowerBound')
+  @DocsEditable @DomName('IDBKeyRange.lowerBound')
   static KeyRange _lowerBound__1(bound, open) native;
   @JSName('lowerBound')
+  @DocsEditable @DomName('IDBKeyRange.lowerBound')
   static KeyRange _lowerBound__2(bound) native;
 
-  /// @domName IDBKeyRange.only_; @docsEditable true
   static KeyRange only_(/*IDBKey*/ value) {
     var value_1 = _convertDartToNative_IDBKey(value);
     return _only__1(value_1);
   }
   @JSName('only')
+  @DocsEditable @DomName('IDBKeyRange.only')
   static KeyRange _only__1(value) native;
 
-  /// @domName IDBKeyRange.upperBound_; @docsEditable true
   static KeyRange upperBound_(/*IDBKey*/ bound, [bool open]) {
     if (?open) {
       var bound_1 = _convertDartToNative_IDBKey(bound);
@@ -603,8 +610,10 @@
     return _upperBound__2(bound_2);
   }
   @JSName('upperBound')
+  @DocsEditable @DomName('IDBKeyRange.upperBound')
   static KeyRange _upperBound__1(bound, open) native;
   @JSName('upperBound')
+  @DocsEditable @DomName('IDBKeyRange.upperBound')
   static KeyRange _upperBound__2(bound) native;
 
 }
@@ -613,26 +622,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBObjectStore; @docsEditable true
+
+@DocsEditable
+@DomName('IDBObjectStore')
 class ObjectStore native "*IDBObjectStore" {
 
-  /// @domName IDBObjectStore.autoIncrement; @docsEditable true
+  @DocsEditable @DomName('IDBObjectStore.autoIncrement')
   final bool autoIncrement;
 
-  /// @domName IDBObjectStore.indexNames; @docsEditable true
+  @DocsEditable @DomName('IDBObjectStore.indexNames')
   @Returns('DomStringList') @Creates('DomStringList')
   final List<String> indexNames;
 
-  /// @domName IDBObjectStore.keyPath; @docsEditable true
+  @DocsEditable @DomName('IDBObjectStore.keyPath')
   final dynamic keyPath;
 
-  /// @domName IDBObjectStore.name; @docsEditable true
+  @DocsEditable @DomName('IDBObjectStore.name')
   final String name;
 
-  /// @domName IDBObjectStore.transaction; @docsEditable true
+  @DocsEditable @DomName('IDBObjectStore.transaction')
   final Transaction transaction;
 
-  /// @domName IDBObjectStore.add; @docsEditable true
   Request add(/*any*/ value, [/*IDBKey*/ key]) {
     if (?key) {
       var value_1 = convertDartToNative_SerializedScriptValue(value);
@@ -643,16 +653,15 @@
     return _add_2(value_3);
   }
   @JSName('add')
-  @Returns('Request') @Creates('Request') @_annotation_Creates_IDBKey
+  @DocsEditable @DomName('IDBObjectStore.add') @Returns('Request') @Creates('Request') @_annotation_Creates_IDBKey
   Request _add_1(value, key) native;
   @JSName('add')
-  @Returns('Request') @Creates('Request') @_annotation_Creates_IDBKey
+  @DocsEditable @DomName('IDBObjectStore.add') @Returns('Request') @Creates('Request') @_annotation_Creates_IDBKey
   Request _add_2(value) native;
 
-  /// @domName IDBObjectStore.clear; @docsEditable true
+  @DocsEditable @DomName('IDBObjectStore.clear')
   Request clear() native;
 
-  /// @domName IDBObjectStore.count; @docsEditable true
   Request count([key_OR_range]) {
     if (!?key_OR_range) {
       return _count_1();
@@ -667,13 +676,15 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('count')
+  @DocsEditable @DomName('IDBObjectStore.count')
   Request _count_1() native;
   @JSName('count')
+  @DocsEditable @DomName('IDBObjectStore.count')
   Request _count_2(KeyRange range) native;
   @JSName('count')
+  @DocsEditable @DomName('IDBObjectStore.count')
   Request _count_3(key) native;
 
-  /// @domName IDBObjectStore.createIndex; @docsEditable true
   Index createIndex(String name, keyPath, [Map options]) {
     if ((keyPath is List<String> || keyPath == null) &&
         !?options) {
@@ -694,15 +705,18 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('createIndex')
+  @DocsEditable @DomName('IDBObjectStore.createIndex')
   Index _createIndex_1(name, List<String> keyPath) native;
   @JSName('createIndex')
+  @DocsEditable @DomName('IDBObjectStore.createIndex')
   Index _createIndex_2(name, List<String> keyPath, options) native;
   @JSName('createIndex')
+  @DocsEditable @DomName('IDBObjectStore.createIndex')
   Index _createIndex_3(name, String keyPath) native;
   @JSName('createIndex')
+  @DocsEditable @DomName('IDBObjectStore.createIndex')
   Index _createIndex_4(name, String keyPath, options) native;
 
-  /// @domName IDBObjectStore.delete; @docsEditable true
   Request delete(key_OR_keyRange) {
     if ((key_OR_keyRange is KeyRange || key_OR_keyRange == null)) {
       return _delete_1(key_OR_keyRange);
@@ -714,14 +728,15 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('delete')
+  @DocsEditable @DomName('IDBObjectStore.delete')
   Request _delete_1(KeyRange keyRange) native;
   @JSName('delete')
+  @DocsEditable @DomName('IDBObjectStore.delete')
   Request _delete_2(key) native;
 
-  /// @domName IDBObjectStore.deleteIndex; @docsEditable true
+  @DocsEditable @DomName('IDBObjectStore.deleteIndex')
   void deleteIndex(String name) native;
 
-  /// @domName IDBObjectStore.getObject; @docsEditable true
   Request getObject(key) {
     if ((key is KeyRange || key == null)) {
       return _getObject_1(key);
@@ -733,16 +748,15 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('get')
-  @Returns('Request') @Creates('Request') @annotation_Creates_SerializedScriptValue
+  @DocsEditable @DomName('IDBObjectStore.get') @Returns('Request') @Creates('Request') @annotation_Creates_SerializedScriptValue
   Request _getObject_1(KeyRange key) native;
   @JSName('get')
-  @Returns('Request') @Creates('Request') @annotation_Creates_SerializedScriptValue
+  @DocsEditable @DomName('IDBObjectStore.get') @Returns('Request') @Creates('Request') @annotation_Creates_SerializedScriptValue
   Request _getObject_2(key) native;
 
-  /// @domName IDBObjectStore.index; @docsEditable true
+  @DocsEditable @DomName('IDBObjectStore.index')
   Index index(String name) native;
 
-  /// @domName IDBObjectStore.openCursor; @docsEditable true
   Request openCursor([key_OR_range, String direction]) {
     if (!?key_OR_range &&
         !?direction) {
@@ -767,22 +781,21 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('openCursor')
-  @Returns('Request') @Creates('Request') @Creates('Cursor')
+  @DocsEditable @DomName('IDBObjectStore.openCursor') @Returns('Request') @Creates('Request') @Creates('Cursor')
   Request _openCursor_1() native;
   @JSName('openCursor')
-  @Returns('Request') @Creates('Request') @Creates('Cursor')
+  @DocsEditable @DomName('IDBObjectStore.openCursor') @Returns('Request') @Creates('Request') @Creates('Cursor')
   Request _openCursor_2(KeyRange range) native;
   @JSName('openCursor')
-  @Returns('Request') @Creates('Request') @Creates('Cursor')
+  @DocsEditable @DomName('IDBObjectStore.openCursor') @Returns('Request') @Creates('Request') @Creates('Cursor')
   Request _openCursor_3(KeyRange range, direction) native;
   @JSName('openCursor')
-  @Returns('Request') @Creates('Request') @Creates('Cursor')
+  @DocsEditable @DomName('IDBObjectStore.openCursor') @Returns('Request') @Creates('Request') @Creates('Cursor')
   Request _openCursor_4(key) native;
   @JSName('openCursor')
-  @Returns('Request') @Creates('Request') @Creates('Cursor')
+  @DocsEditable @DomName('IDBObjectStore.openCursor') @Returns('Request') @Creates('Request') @Creates('Cursor')
   Request _openCursor_5(key, direction) native;
 
-  /// @domName IDBObjectStore.put; @docsEditable true
   Request put(/*any*/ value, [/*IDBKey*/ key]) {
     if (?key) {
       var value_1 = convertDartToNative_SerializedScriptValue(value);
@@ -793,10 +806,10 @@
     return _put_2(value_3);
   }
   @JSName('put')
-  @Returns('Request') @Creates('Request') @_annotation_Creates_IDBKey
+  @DocsEditable @DomName('IDBObjectStore.put') @Returns('Request') @Creates('Request') @_annotation_Creates_IDBKey
   Request _put_1(value, key) native;
   @JSName('put')
-  @Returns('Request') @Creates('Request') @_annotation_Creates_IDBKey
+  @DocsEditable @DomName('IDBObjectStore.put') @Returns('Request') @Creates('Request') @_annotation_Creates_IDBKey
   Request _put_2(value) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -804,14 +817,17 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBOpenDBRequest; @docsEditable true
+
+@DocsEditable
+@DomName('IDBOpenDBRequest')
 class OpenDBRequest extends Request implements EventTarget native "*IDBOpenDBRequest" {
 
   static const EventStreamProvider<Event> blockedEvent = const EventStreamProvider<Event>('blocked');
 
   static const EventStreamProvider<VersionChangeEvent> upgradeNeededEvent = const EventStreamProvider<VersionChangeEvent>('upgradeneeded');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   OpenDBRequestEvents get on =>
     new OpenDBRequestEvents(this);
 
@@ -820,15 +836,15 @@
   Stream<VersionChangeEvent> get onUpgradeNeeded => upgradeNeededEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class OpenDBRequestEvents extends RequestEvents {
-  /// @docsEditable true
+  @DocsEditable
   OpenDBRequestEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get blocked => this['blocked'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get upgradeNeeded => this['upgradeneeded'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -836,49 +852,50 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBRequest; @docsEditable true
+
+@DocsEditable
+@DomName('IDBRequest')
 class Request extends EventTarget native "*IDBRequest" {
 
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
   static const EventStreamProvider<Event> successEvent = const EventStreamProvider<Event>('success');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   RequestEvents get on =>
     new RequestEvents(this);
 
-  /// @domName IDBRequest.error; @docsEditable true
+  @DocsEditable @DomName('IDBRequest.error')
   final DomError error;
 
-  /// @domName IDBRequest.readyState; @docsEditable true
+  @DocsEditable @DomName('IDBRequest.readyState')
   final String readyState;
 
-  /// @domName IDBRequest.result; @docsEditable true
   dynamic get result => _convertNativeToDart_IDBAny(this._result);
   @JSName('result')
-  @Creates('Null')
+  @DocsEditable @DomName('IDBRequest.result') @Creates('Null')
   final dynamic _result;
 
-  /// @domName IDBRequest.source; @docsEditable true
-  @Creates('Null')
+  @DocsEditable @DomName('IDBRequest.source') @Creates('Null')
   final dynamic source;
 
-  /// @domName IDBRequest.transaction; @docsEditable true
+  @DocsEditable @DomName('IDBRequest.transaction')
   final Transaction transaction;
 
-  /// @domName IDBRequest.webkitErrorMessage; @docsEditable true
+  @DocsEditable @DomName('IDBRequest.webkitErrorMessage')
   final String webkitErrorMessage;
 
-  /// @domName IDBRequest.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('IDBRequest.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName IDBRequest.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('IDBRequest.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName IDBRequest.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('IDBRequest.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   Stream<Event> get onError => errorEvent.forTarget(this);
@@ -886,15 +903,15 @@
   Stream<Event> get onSuccess => successEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class RequestEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   RequestEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get success => this['success'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -902,7 +919,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBTransaction; @docsEditable true
+
+@DocsEditable
+@DomName('IDBTransaction')
 class Transaction extends EventTarget native "*IDBTransaction" {
 
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
@@ -911,38 +930,39 @@
 
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   TransactionEvents get on =>
     new TransactionEvents(this);
 
-  /// @domName IDBTransaction.db; @docsEditable true
+  @DocsEditable @DomName('IDBTransaction.db')
   final Database db;
 
-  /// @domName IDBTransaction.error; @docsEditable true
+  @DocsEditable @DomName('IDBTransaction.error')
   final DomError error;
 
-  /// @domName IDBTransaction.mode; @docsEditable true
+  @DocsEditable @DomName('IDBTransaction.mode')
   final String mode;
 
-  /// @domName IDBTransaction.webkitErrorMessage; @docsEditable true
+  @DocsEditable @DomName('IDBTransaction.webkitErrorMessage')
   final String webkitErrorMessage;
 
-  /// @domName IDBTransaction.abort; @docsEditable true
+  @DocsEditable @DomName('IDBTransaction.abort')
   void abort() native;
 
-  /// @domName IDBTransaction.addEventListener; @docsEditable true
   @JSName('addEventListener')
+  @DocsEditable @DomName('IDBTransaction.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  /// @domName IDBTransaction.dispatchEvent; @docsEditable true
   @JSName('dispatchEvent')
+  @DocsEditable @DomName('IDBTransaction.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native;
 
-  /// @domName IDBTransaction.objectStore; @docsEditable true
+  @DocsEditable @DomName('IDBTransaction.objectStore')
   ObjectStore objectStore(String name) native;
 
-  /// @domName IDBTransaction.removeEventListener; @docsEditable true
   @JSName('removeEventListener')
+  @DocsEditable @DomName('IDBTransaction.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   Stream<Event> get onAbort => abortEvent.forTarget(this);
@@ -952,18 +972,18 @@
   Stream<Event> get onError => errorEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class TransactionEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   TransactionEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get complete => this['complete'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -971,13 +991,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBVersionChangeEvent; @docsEditable true
+
+@DocsEditable
+@DomName('IDBVersionChangeEvent')
 class UpgradeNeededEvent extends Event native "*IDBVersionChangeEvent" {
 
-  /// @domName IDBVersionChangeEvent.newVersion; @docsEditable true
+  @DocsEditable @DomName('IDBUpgradeNeededEvent.newVersion')
   final int newVersion;
 
-  /// @domName IDBVersionChangeEvent.oldVersion; @docsEditable true
+  @DocsEditable @DomName('IDBUpgradeNeededEvent.oldVersion')
   final int oldVersion;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -985,10 +1007,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBVersionChangeEvent; @docsEditable true
+
+@DocsEditable
+@DomName('IDBVersionChangeEvent')
 class VersionChangeEvent extends Event native "*IDBVersionChangeEvent" {
 
-  /// @domName IDBVersionChangeEvent.version; @docsEditable true
+  @DocsEditable @DomName('IDBVersionChangeEvent.version')
   final String version;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -996,24 +1020,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBVersionChangeRequest; @docsEditable true
+
+@DocsEditable
+@DomName('IDBVersionChangeRequest')
 class VersionChangeRequest extends Request implements EventTarget native "*IDBVersionChangeRequest" {
 
   static const EventStreamProvider<Event> blockedEvent = const EventStreamProvider<Event>('blocked');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   VersionChangeRequestEvents get on =>
     new VersionChangeRequestEvents(this);
 
   Stream<Event> get onBlocked => blockedEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class VersionChangeRequestEvents extends RequestEvents {
-  /// @docsEditable true
+  @DocsEditable
   VersionChangeRequestEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get blocked => this['blocked'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1021,6 +1048,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBAny; @docsEditable true
+
+@DocsEditable
+@DomName('IDBAny')
 class _Any native "*IDBAny" {
 }
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index 74a6598..fbf035e 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -40,28 +40,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName IDBCursor
+@DocsEditable
+@DomName('IDBCursor')
 class Cursor extends NativeFieldWrapperClass1 {
   Cursor.internal();
 
-
-  /** @domName IDBCursor.direction */
+  @DocsEditable
+  @DomName('IDBCursor.direction')
   String get direction native "IDBCursor_direction_Getter";
 
-
-  /** @domName IDBCursor.key */
+  @DocsEditable
+  @DomName('IDBCursor.key')
   Object get key native "IDBCursor_key_Getter";
 
-
-  /** @domName IDBCursor.primaryKey */
+  @DocsEditable
+  @DomName('IDBCursor.primaryKey')
   Object get primaryKey native "IDBCursor_primaryKey_Getter";
 
-
-  /** @domName IDBCursor.source */
+  @DocsEditable
+  @DomName('IDBCursor.source')
   dynamic get source native "IDBCursor_source_Getter";
 
-
-  /** @domName IDBCursor.advance */
+  @DocsEditable
+  @DomName('IDBCursor.advance')
   void advance(int count) native "IDBCursor_advance_Callback";
 
   void continueFunction([/*IDBKey*/ key]) {
@@ -72,20 +73,20 @@
     _continue_2();
   }
 
-
-  /** @domName IDBCursor.continue_1 */
+  @DocsEditable
+  @DomName('IDBCursor.continue_1')
   void _continue_1(key) native "IDBCursor_continue_1_Callback";
 
-
-  /** @domName IDBCursor.continue_2 */
+  @DocsEditable
+  @DomName('IDBCursor.continue_2')
   void _continue_2() native "IDBCursor_continue_2_Callback";
 
-
-  /** @domName IDBCursor.delete */
+  @DocsEditable
+  @DomName('IDBCursor.delete')
   Request delete() native "IDBCursor_delete_Callback";
 
-
-  /** @domName IDBCursor.update */
+  @DocsEditable
+  @DomName('IDBCursor.update')
   Request update(Object value) native "IDBCursor_update_Callback";
 
 }
@@ -96,12 +97,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName IDBCursorWithValue
+@DocsEditable
+@DomName('IDBCursorWithValue')
 class CursorWithValue extends Cursor {
   CursorWithValue.internal() : super.internal();
 
-
-  /** @domName IDBCursorWithValue.value */
+  @DocsEditable
+  @DomName('IDBCursorWithValue.value')
   Object get value native "IDBCursorWithValue_value_Getter";
 
 }
@@ -112,7 +114,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName IDBDatabase
+@DocsEditable
+@DomName('IDBDatabase')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -126,47 +129,48 @@
 
   static const EventStreamProvider<UpgradeNeededEvent> versionChangeEvent = const EventStreamProvider<UpgradeNeededEvent>('versionchange');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   DatabaseEvents get on =>
     new DatabaseEvents(this);
 
-
-  /** @domName IDBDatabase.name */
+  @DocsEditable
+  @DomName('IDBDatabase.name')
   String get name native "IDBDatabase_name_Getter";
 
-
-  /** @domName IDBDatabase.objectStoreNames */
+  @DocsEditable
+  @DomName('IDBDatabase.objectStoreNames')
   List<String> get objectStoreNames native "IDBDatabase_objectStoreNames_Getter";
 
-
-  /** @domName IDBDatabase.version */
+  @DocsEditable
+  @DomName('IDBDatabase.version')
   dynamic get version native "IDBDatabase_version_Getter";
 
-
-  /** @domName IDBDatabase.addEventListener */
+  @DocsEditable
+  @DomName('IDBDatabase.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_addEventListener_Callback";
 
-
-  /** @domName IDBDatabase.close */
+  @DocsEditable
+  @DomName('IDBDatabase.close')
   void close() native "IDBDatabase_close_Callback";
 
-
-  /** @domName IDBDatabase.createObjectStore */
+  @DocsEditable
+  @DomName('IDBDatabase.createObjectStore')
   ObjectStore createObjectStore(String name, [Map options]) native "IDBDatabase_createObjectStore_Callback";
 
-
-  /** @domName IDBDatabase.deleteObjectStore */
+  @DocsEditable
+  @DomName('IDBDatabase.deleteObjectStore')
   void deleteObjectStore(String name) native "IDBDatabase_deleteObjectStore_Callback";
 
-
-  /** @domName IDBDatabase.dispatchEvent */
+  @DocsEditable
+  @DomName('IDBDatabase.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "IDBDatabase_dispatchEvent_Callback";
 
-
-  /** @domName IDBDatabase.removeEventListener */
+  @DocsEditable
+  @DomName('IDBDatabase.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_removeEventListener_Callback";
 
-  Transaction transaction(storeName_OR_storeNames, /*DOMString*/ mode) {
+  Transaction transaction(storeName_OR_storeNames, String mode) {
     if ((storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null) && (mode is String || mode == null)) {
       return _transaction_1(storeName_OR_storeNames, mode);
     }
@@ -179,16 +183,16 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName IDBDatabase.transaction_1 */
+  @DocsEditable
+  @DomName('IDBDatabase.transaction_1')
   Transaction _transaction_1(storeName_OR_storeNames, mode) native "IDBDatabase_transaction_1_Callback";
 
-
-  /** @domName IDBDatabase.transaction_2 */
+  @DocsEditable
+  @DomName('IDBDatabase.transaction_2')
   Transaction _transaction_2(storeName_OR_storeNames, mode) native "IDBDatabase_transaction_2_Callback";
 
-
-  /** @domName IDBDatabase.transaction_3 */
+  @DocsEditable
+  @DomName('IDBDatabase.transaction_3')
   Transaction _transaction_3(storeName_OR_storeNames, mode) native "IDBDatabase_transaction_3_Callback";
 
   Stream<Event> get onAbort => abortEvent.forTarget(this);
@@ -199,18 +203,18 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class DatabaseEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   DatabaseEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get versionChange => this['versionchange'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -218,7 +222,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBFactory
+@DocsEditable
+@DomName('IDBFactory')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -233,31 +238,31 @@
 
   IdbFactory.internal();
 
-
-  /** @domName IDBFactory.cmp */
+  @DocsEditable
+  @DomName('IDBFactory.cmp')
   int cmp(/*IDBKey*/ first, /*IDBKey*/ second) native "IDBFactory_cmp_Callback";
 
-
-  /** @domName IDBFactory.deleteDatabase */
+  @DocsEditable
+  @DomName('IDBFactory.deleteDatabase')
   VersionChangeRequest deleteDatabase(String name) native "IDBFactory_deleteDatabase_Callback";
 
-  OpenDBRequest open(/*DOMString*/ name, [/*long long*/ version]) {
+  OpenDBRequest open(String name, [int version]) {
     if (?version) {
       return _open_1(name, version);
     }
     return _open_2(name);
   }
 
-
-  /** @domName IDBFactory.open_1 */
+  @DocsEditable
+  @DomName('IDBFactory.open_1')
   OpenDBRequest _open_1(name, version) native "IDBFactory_open_1_Callback";
 
-
-  /** @domName IDBFactory.open_2 */
+  @DocsEditable
+  @DomName('IDBFactory.open_2')
   OpenDBRequest _open_2(name) native "IDBFactory_open_2_Callback";
 
-
-  /** @domName IDBFactory.webkitGetDatabaseNames */
+  @DocsEditable
+  @DomName('IDBFactory.webkitGetDatabaseNames')
   Request webkitGetDatabaseNames() native "IDBFactory_webkitGetDatabaseNames_Callback";
 
 }
@@ -268,28 +273,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName IDBIndex
+@DocsEditable
+@DomName('IDBIndex')
 class Index extends NativeFieldWrapperClass1 {
   Index.internal();
 
-
-  /** @domName IDBIndex.keyPath */
+  @DocsEditable
+  @DomName('IDBIndex.keyPath')
   dynamic get keyPath native "IDBIndex_keyPath_Getter";
 
-
-  /** @domName IDBIndex.multiEntry */
+  @DocsEditable
+  @DomName('IDBIndex.multiEntry')
   bool get multiEntry native "IDBIndex_multiEntry_Getter";
 
-
-  /** @domName IDBIndex.name */
+  @DocsEditable
+  @DomName('IDBIndex.name')
   String get name native "IDBIndex_name_Getter";
 
-
-  /** @domName IDBIndex.objectStore */
+  @DocsEditable
+  @DomName('IDBIndex.objectStore')
   ObjectStore get objectStore native "IDBIndex_objectStore_Getter";
 
-
-  /** @domName IDBIndex.unique */
+  @DocsEditable
+  @DomName('IDBIndex.unique')
   bool get unique native "IDBIndex_unique_Getter";
 
   Request count([key_OR_range]) {
@@ -305,16 +311,16 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName IDBIndex.count_1 */
+  @DocsEditable
+  @DomName('IDBIndex.count_1')
   Request _count_1() native "IDBIndex_count_1_Callback";
 
-
-  /** @domName IDBIndex.count_2 */
+  @DocsEditable
+  @DomName('IDBIndex.count_2')
   Request _count_2(key_OR_range) native "IDBIndex_count_2_Callback";
 
-
-  /** @domName IDBIndex.count_3 */
+  @DocsEditable
+  @DomName('IDBIndex.count_3')
   Request _count_3(key_OR_range) native "IDBIndex_count_3_Callback";
 
   Request get(key) {
@@ -327,12 +333,12 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName IDBIndex.get_1 */
+  @DocsEditable
+  @DomName('IDBIndex.get_1')
   Request _get_1(key) native "IDBIndex_get_1_Callback";
 
-
-  /** @domName IDBIndex.get_2 */
+  @DocsEditable
+  @DomName('IDBIndex.get_2')
   Request _get_2(key) native "IDBIndex_get_2_Callback";
 
   Request getKey(key) {
@@ -345,15 +351,15 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName IDBIndex.getKey_1 */
+  @DocsEditable
+  @DomName('IDBIndex.getKey_1')
   Request _getKey_1(key) native "IDBIndex_getKey_1_Callback";
 
-
-  /** @domName IDBIndex.getKey_2 */
+  @DocsEditable
+  @DomName('IDBIndex.getKey_2')
   Request _getKey_2(key) native "IDBIndex_getKey_2_Callback";
 
-  Request openCursor([key_OR_range, /*DOMString*/ direction]) {
+  Request openCursor([key_OR_range, String direction]) {
     if (!?key_OR_range && !?direction) {
       return _openCursor_1();
     }
@@ -372,27 +378,27 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName IDBIndex.openCursor_1 */
+  @DocsEditable
+  @DomName('IDBIndex.openCursor_1')
   Request _openCursor_1() native "IDBIndex_openCursor_1_Callback";
 
-
-  /** @domName IDBIndex.openCursor_2 */
+  @DocsEditable
+  @DomName('IDBIndex.openCursor_2')
   Request _openCursor_2(key_OR_range) native "IDBIndex_openCursor_2_Callback";
 
-
-  /** @domName IDBIndex.openCursor_3 */
+  @DocsEditable
+  @DomName('IDBIndex.openCursor_3')
   Request _openCursor_3(key_OR_range, direction) native "IDBIndex_openCursor_3_Callback";
 
-
-  /** @domName IDBIndex.openCursor_4 */
+  @DocsEditable
+  @DomName('IDBIndex.openCursor_4')
   Request _openCursor_4(key_OR_range) native "IDBIndex_openCursor_4_Callback";
 
-
-  /** @domName IDBIndex.openCursor_5 */
+  @DocsEditable
+  @DomName('IDBIndex.openCursor_5')
   Request _openCursor_5(key_OR_range, direction) native "IDBIndex_openCursor_5_Callback";
 
-  Request openKeyCursor([key_OR_range, /*DOMString*/ direction]) {
+  Request openKeyCursor([key_OR_range, String direction]) {
     if (!?key_OR_range && !?direction) {
       return _openKeyCursor_1();
     }
@@ -411,24 +417,24 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName IDBIndex.openKeyCursor_1 */
+  @DocsEditable
+  @DomName('IDBIndex.openKeyCursor_1')
   Request _openKeyCursor_1() native "IDBIndex_openKeyCursor_1_Callback";
 
-
-  /** @domName IDBIndex.openKeyCursor_2 */
+  @DocsEditable
+  @DomName('IDBIndex.openKeyCursor_2')
   Request _openKeyCursor_2(key_OR_range) native "IDBIndex_openKeyCursor_2_Callback";
 
-
-  /** @domName IDBIndex.openKeyCursor_3 */
+  @DocsEditable
+  @DomName('IDBIndex.openKeyCursor_3')
   Request _openKeyCursor_3(key_OR_range, direction) native "IDBIndex_openKeyCursor_3_Callback";
 
-
-  /** @domName IDBIndex.openKeyCursor_4 */
+  @DocsEditable
+  @DomName('IDBIndex.openKeyCursor_4')
   Request _openKeyCursor_4(key_OR_range) native "IDBIndex_openKeyCursor_4_Callback";
 
-
-  /** @domName IDBIndex.openKeyCursor_5 */
+  @DocsEditable
+  @DomName('IDBIndex.openKeyCursor_5')
   Request _openKeyCursor_5(key_OR_range, direction) native "IDBIndex_openKeyCursor_5_Callback";
 
 }
@@ -439,7 +445,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName IDBKey
+@DocsEditable
+@DomName('IDBKey')
 class Key extends NativeFieldWrapperClass1 {
   Key.internal();
 
@@ -449,29 +456,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBKeyRange
+@DocsEditable
+@DomName('IDBKeyRange')
 class KeyRange extends NativeFieldWrapperClass1 {
-  /**
-   * @domName IDBKeyRange.only
-   */
+  @DomName('IDBKeyRange.only')
   factory KeyRange.only(/*Key*/ value) =>
       _KeyRangeFactoryProvider.createKeyRange_only(value);
 
-  /**
-   * @domName IDBKeyRange.lowerBound
-   */
+  @DomName('IDBKeyRange.lowerBound')
   factory KeyRange.lowerBound(/*Key*/ bound, [bool open = false]) =>
       _KeyRangeFactoryProvider.createKeyRange_lowerBound(bound, open);
 
-  /**
-   * @domName IDBKeyRange.upperBound
-   */
+  @DomName('IDBKeyRange.upperBound')
   factory KeyRange.upperBound(/*Key*/ bound, [bool open = false]) =>
       _KeyRangeFactoryProvider.createKeyRange_upperBound(bound, open);
 
-  /**
-   * @domName KeyRange.bound
-   */
+  @DomName('KeyRange.bound')
   factory KeyRange.bound(/*Key*/ lower, /*Key*/ upper,
                             [bool lowerOpen = false, bool upperOpen = false]) =>
       _KeyRangeFactoryProvider.createKeyRange_bound(
@@ -479,23 +479,23 @@
 
   KeyRange.internal();
 
-
-  /** @domName IDBKeyRange.lower */
+  @DocsEditable
+  @DomName('IDBKeyRange.lower')
   dynamic get lower native "IDBKeyRange_lower_Getter";
 
-
-  /** @domName IDBKeyRange.lowerOpen */
+  @DocsEditable
+  @DomName('IDBKeyRange.lowerOpen')
   bool get lowerOpen native "IDBKeyRange_lowerOpen_Getter";
 
-
-  /** @domName IDBKeyRange.upper */
+  @DocsEditable
+  @DomName('IDBKeyRange.upper')
   dynamic get upper native "IDBKeyRange_upper_Getter";
 
-
-  /** @domName IDBKeyRange.upperOpen */
+  @DocsEditable
+  @DomName('IDBKeyRange.upperOpen')
   bool get upperOpen native "IDBKeyRange_upperOpen_Getter";
 
-  static KeyRange bound_(/*IDBKey*/ lower, /*IDBKey*/ upper, [/*boolean*/ lowerOpen, /*boolean*/ upperOpen]) {
+  static KeyRange bound_(/*IDBKey*/ lower, /*IDBKey*/ upper, [bool lowerOpen, bool upperOpen]) {
     if (?upperOpen) {
       return _bound_1(lower, upper, lowerOpen, upperOpen);
     }
@@ -505,50 +505,50 @@
     return _bound_3(lower, upper);
   }
 
-
-  /** @domName IDBKeyRange.bound_1 */
+  @DocsEditable
+  @DomName('IDBKeyRange.bound_1')
   static KeyRange _bound_1(lower, upper, lowerOpen, upperOpen) native "IDBKeyRange_bound_1_Callback";
 
-
-  /** @domName IDBKeyRange.bound_2 */
+  @DocsEditable
+  @DomName('IDBKeyRange.bound_2')
   static KeyRange _bound_2(lower, upper, lowerOpen) native "IDBKeyRange_bound_2_Callback";
 
-
-  /** @domName IDBKeyRange.bound_3 */
+  @DocsEditable
+  @DomName('IDBKeyRange.bound_3')
   static KeyRange _bound_3(lower, upper) native "IDBKeyRange_bound_3_Callback";
 
-  static KeyRange lowerBound_(/*IDBKey*/ bound, [/*boolean*/ open]) {
+  static KeyRange lowerBound_(/*IDBKey*/ bound, [bool open]) {
     if (?open) {
       return _lowerBound_1(bound, open);
     }
     return _lowerBound_2(bound);
   }
 
-
-  /** @domName IDBKeyRange.lowerBound_1 */
+  @DocsEditable
+  @DomName('IDBKeyRange.lowerBound_1')
   static KeyRange _lowerBound_1(bound, open) native "IDBKeyRange_lowerBound_1_Callback";
 
-
-  /** @domName IDBKeyRange.lowerBound_2 */
+  @DocsEditable
+  @DomName('IDBKeyRange.lowerBound_2')
   static KeyRange _lowerBound_2(bound) native "IDBKeyRange_lowerBound_2_Callback";
 
-
-  /** @domName IDBKeyRange.only_ */
+  @DocsEditable
+  @DomName('IDBKeyRange.only_')
   static KeyRange only_(/*IDBKey*/ value) native "IDBKeyRange_only__Callback";
 
-  static KeyRange upperBound_(/*IDBKey*/ bound, [/*boolean*/ open]) {
+  static KeyRange upperBound_(/*IDBKey*/ bound, [bool open]) {
     if (?open) {
       return _upperBound_1(bound, open);
     }
     return _upperBound_2(bound);
   }
 
-
-  /** @domName IDBKeyRange.upperBound_1 */
+  @DocsEditable
+  @DomName('IDBKeyRange.upperBound_1')
   static KeyRange _upperBound_1(bound, open) native "IDBKeyRange_upperBound_1_Callback";
 
-
-  /** @domName IDBKeyRange.upperBound_2 */
+  @DocsEditable
+  @DomName('IDBKeyRange.upperBound_2')
   static KeyRange _upperBound_2(bound) native "IDBKeyRange_upperBound_2_Callback";
 
 }
@@ -559,47 +559,48 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName IDBObjectStore
+@DocsEditable
+@DomName('IDBObjectStore')
 class ObjectStore extends NativeFieldWrapperClass1 {
   ObjectStore.internal();
 
-
-  /** @domName IDBObjectStore.autoIncrement */
+  @DocsEditable
+  @DomName('IDBObjectStore.autoIncrement')
   bool get autoIncrement native "IDBObjectStore_autoIncrement_Getter";
 
-
-  /** @domName IDBObjectStore.indexNames */
+  @DocsEditable
+  @DomName('IDBObjectStore.indexNames')
   List<String> get indexNames native "IDBObjectStore_indexNames_Getter";
 
-
-  /** @domName IDBObjectStore.keyPath */
+  @DocsEditable
+  @DomName('IDBObjectStore.keyPath')
   dynamic get keyPath native "IDBObjectStore_keyPath_Getter";
 
-
-  /** @domName IDBObjectStore.name */
+  @DocsEditable
+  @DomName('IDBObjectStore.name')
   String get name native "IDBObjectStore_name_Getter";
 
-
-  /** @domName IDBObjectStore.transaction */
+  @DocsEditable
+  @DomName('IDBObjectStore.transaction')
   Transaction get transaction native "IDBObjectStore_transaction_Getter";
 
-  Request add(/*any*/ value, [/*IDBKey*/ key]) {
+  Request add(Object value, [/*IDBKey*/ key]) {
     if (?key) {
       return _add_1(value, key);
     }
     return _add_2(value);
   }
 
-
-  /** @domName IDBObjectStore.add_1 */
+  @DocsEditable
+  @DomName('IDBObjectStore.add_1')
   Request _add_1(value, key) native "IDBObjectStore_add_1_Callback";
 
-
-  /** @domName IDBObjectStore.add_2 */
+  @DocsEditable
+  @DomName('IDBObjectStore.add_2')
   Request _add_2(value) native "IDBObjectStore_add_2_Callback";
 
-
-  /** @domName IDBObjectStore.clear */
+  @DocsEditable
+  @DomName('IDBObjectStore.clear')
   Request clear() native "IDBObjectStore_clear_Callback";
 
   Request count([key_OR_range]) {
@@ -615,19 +616,19 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName IDBObjectStore.count_1 */
+  @DocsEditable
+  @DomName('IDBObjectStore.count_1')
   Request _count_1() native "IDBObjectStore_count_1_Callback";
 
-
-  /** @domName IDBObjectStore.count_2 */
+  @DocsEditable
+  @DomName('IDBObjectStore.count_2')
   Request _count_2(key_OR_range) native "IDBObjectStore_count_2_Callback";
 
-
-  /** @domName IDBObjectStore.count_3 */
+  @DocsEditable
+  @DomName('IDBObjectStore.count_3')
   Request _count_3(key_OR_range) native "IDBObjectStore_count_3_Callback";
 
-  Index createIndex(/*DOMString*/ name, keyPath, [/*Dictionary*/ options]) {
+  Index createIndex(String name, keyPath, [Map options]) {
     if ((name is String || name == null) && (keyPath is List<String> || keyPath == null) && (options is Map || options == null)) {
       return _createIndex_1(name, keyPath, options);
     }
@@ -637,12 +638,12 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName IDBObjectStore.createIndex_1 */
+  @DocsEditable
+  @DomName('IDBObjectStore.createIndex_1')
   Index _createIndex_1(name, keyPath, options) native "IDBObjectStore_createIndex_1_Callback";
 
-
-  /** @domName IDBObjectStore.createIndex_2 */
+  @DocsEditable
+  @DomName('IDBObjectStore.createIndex_2')
   Index _createIndex_2(name, keyPath, options) native "IDBObjectStore_createIndex_2_Callback";
 
   Request delete(key_OR_keyRange) {
@@ -655,16 +656,16 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName IDBObjectStore.delete_1 */
+  @DocsEditable
+  @DomName('IDBObjectStore.delete_1')
   Request _delete_1(key_OR_keyRange) native "IDBObjectStore_delete_1_Callback";
 
-
-  /** @domName IDBObjectStore.delete_2 */
+  @DocsEditable
+  @DomName('IDBObjectStore.delete_2')
   Request _delete_2(key_OR_keyRange) native "IDBObjectStore_delete_2_Callback";
 
-
-  /** @domName IDBObjectStore.deleteIndex */
+  @DocsEditable
+  @DomName('IDBObjectStore.deleteIndex')
   void deleteIndex(String name) native "IDBObjectStore_deleteIndex_Callback";
 
   Request getObject(key) {
@@ -677,19 +678,19 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName IDBObjectStore.get_1 */
+  @DocsEditable
+  @DomName('IDBObjectStore.get_1')
   Request _get_1(key) native "IDBObjectStore_get_1_Callback";
 
-
-  /** @domName IDBObjectStore.get_2 */
+  @DocsEditable
+  @DomName('IDBObjectStore.get_2')
   Request _get_2(key) native "IDBObjectStore_get_2_Callback";
 
-
-  /** @domName IDBObjectStore.index */
+  @DocsEditable
+  @DomName('IDBObjectStore.index')
   Index index(String name) native "IDBObjectStore_index_Callback";
 
-  Request openCursor([key_OR_range, /*DOMString*/ direction]) {
+  Request openCursor([key_OR_range, String direction]) {
     if (!?key_OR_range && !?direction) {
       return _openCursor_1();
     }
@@ -708,39 +709,39 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName IDBObjectStore.openCursor_1 */
+  @DocsEditable
+  @DomName('IDBObjectStore.openCursor_1')
   Request _openCursor_1() native "IDBObjectStore_openCursor_1_Callback";
 
-
-  /** @domName IDBObjectStore.openCursor_2 */
+  @DocsEditable
+  @DomName('IDBObjectStore.openCursor_2')
   Request _openCursor_2(key_OR_range) native "IDBObjectStore_openCursor_2_Callback";
 
-
-  /** @domName IDBObjectStore.openCursor_3 */
+  @DocsEditable
+  @DomName('IDBObjectStore.openCursor_3')
   Request _openCursor_3(key_OR_range, direction) native "IDBObjectStore_openCursor_3_Callback";
 
-
-  /** @domName IDBObjectStore.openCursor_4 */
+  @DocsEditable
+  @DomName('IDBObjectStore.openCursor_4')
   Request _openCursor_4(key_OR_range) native "IDBObjectStore_openCursor_4_Callback";
 
-
-  /** @domName IDBObjectStore.openCursor_5 */
+  @DocsEditable
+  @DomName('IDBObjectStore.openCursor_5')
   Request _openCursor_5(key_OR_range, direction) native "IDBObjectStore_openCursor_5_Callback";
 
-  Request put(/*any*/ value, [/*IDBKey*/ key]) {
+  Request put(Object value, [/*IDBKey*/ key]) {
     if (?key) {
       return _put_1(value, key);
     }
     return _put_2(value);
   }
 
-
-  /** @domName IDBObjectStore.put_1 */
+  @DocsEditable
+  @DomName('IDBObjectStore.put_1')
   Request _put_1(value, key) native "IDBObjectStore_put_1_Callback";
 
-
-  /** @domName IDBObjectStore.put_2 */
+  @DocsEditable
+  @DomName('IDBObjectStore.put_2')
   Request _put_2(value) native "IDBObjectStore_put_2_Callback";
 
 }
@@ -751,7 +752,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName IDBOpenDBRequest
+@DocsEditable
+@DomName('IDBOpenDBRequest')
 class OpenDBRequest extends Request implements EventTarget {
   OpenDBRequest.internal() : super.internal();
 
@@ -759,7 +761,8 @@
 
   static const EventStreamProvider<VersionChangeEvent> upgradeNeededEvent = const EventStreamProvider<VersionChangeEvent>('upgradeneeded');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   OpenDBRequestEvents get on =>
     new OpenDBRequestEvents(this);
 
@@ -769,15 +772,15 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class OpenDBRequestEvents extends RequestEvents {
-  /// @docsEditable true
+  @DocsEditable
   OpenDBRequestEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get blocked => this['blocked'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get upgradeNeeded => this['upgradeneeded'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -787,7 +790,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName IDBRequest
+@DocsEditable
+@DomName('IDBRequest')
 class Request extends EventTarget {
   Request.internal() : super.internal();
 
@@ -795,44 +799,45 @@
 
   static const EventStreamProvider<Event> successEvent = const EventStreamProvider<Event>('success');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   RequestEvents get on =>
     new RequestEvents(this);
 
-
-  /** @domName IDBRequest.error */
+  @DocsEditable
+  @DomName('IDBRequest.error')
   DomError get error native "IDBRequest_error_Getter";
 
-
-  /** @domName IDBRequest.readyState */
+  @DocsEditable
+  @DomName('IDBRequest.readyState')
   String get readyState native "IDBRequest_readyState_Getter";
 
-
-  /** @domName IDBRequest.result */
+  @DocsEditable
+  @DomName('IDBRequest.result')
   dynamic get result native "IDBRequest_result_Getter";
 
-
-  /** @domName IDBRequest.source */
+  @DocsEditable
+  @DomName('IDBRequest.source')
   dynamic get source native "IDBRequest_source_Getter";
 
-
-  /** @domName IDBRequest.transaction */
+  @DocsEditable
+  @DomName('IDBRequest.transaction')
   Transaction get transaction native "IDBRequest_transaction_Getter";
 
-
-  /** @domName IDBRequest.webkitErrorMessage */
+  @DocsEditable
+  @DomName('IDBRequest.webkitErrorMessage')
   String get webkitErrorMessage native "IDBRequest_webkitErrorMessage_Getter";
 
-
-  /** @domName IDBRequest.addEventListener */
+  @DocsEditable
+  @DomName('IDBRequest.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBRequest_addEventListener_Callback";
 
-
-  /** @domName IDBRequest.dispatchEvent */
+  @DocsEditable
+  @DomName('IDBRequest.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "IDBRequest_dispatchEvent_Callback";
 
-
-  /** @domName IDBRequest.removeEventListener */
+  @DocsEditable
+  @DomName('IDBRequest.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBRequest_removeEventListener_Callback";
 
   Stream<Event> get onError => errorEvent.forTarget(this);
@@ -841,15 +846,15 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class RequestEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   RequestEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get success => this['success'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -859,7 +864,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName IDBTransaction
+@DocsEditable
+@DomName('IDBTransaction')
 class Transaction extends EventTarget {
   Transaction.internal() : super.internal();
 
@@ -869,44 +875,45 @@
 
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   TransactionEvents get on =>
     new TransactionEvents(this);
 
-
-  /** @domName IDBTransaction.db */
+  @DocsEditable
+  @DomName('IDBTransaction.db')
   Database get db native "IDBTransaction_db_Getter";
 
-
-  /** @domName IDBTransaction.error */
+  @DocsEditable
+  @DomName('IDBTransaction.error')
   DomError get error native "IDBTransaction_error_Getter";
 
-
-  /** @domName IDBTransaction.mode */
+  @DocsEditable
+  @DomName('IDBTransaction.mode')
   String get mode native "IDBTransaction_mode_Getter";
 
-
-  /** @domName IDBTransaction.webkitErrorMessage */
+  @DocsEditable
+  @DomName('IDBTransaction.webkitErrorMessage')
   String get webkitErrorMessage native "IDBTransaction_webkitErrorMessage_Getter";
 
-
-  /** @domName IDBTransaction.abort */
+  @DocsEditable
+  @DomName('IDBTransaction.abort')
   void abort() native "IDBTransaction_abort_Callback";
 
-
-  /** @domName IDBTransaction.addEventListener */
+  @DocsEditable
+  @DomName('IDBTransaction.addEventListener')
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBTransaction_addEventListener_Callback";
 
-
-  /** @domName IDBTransaction.dispatchEvent */
+  @DocsEditable
+  @DomName('IDBTransaction.dispatchEvent')
   bool $dom_dispatchEvent(Event evt) native "IDBTransaction_dispatchEvent_Callback";
 
-
-  /** @domName IDBTransaction.objectStore */
+  @DocsEditable
+  @DomName('IDBTransaction.objectStore')
   ObjectStore objectStore(String name) native "IDBTransaction_objectStore_Callback";
 
-
-  /** @domName IDBTransaction.removeEventListener */
+  @DocsEditable
+  @DomName('IDBTransaction.removeEventListener')
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBTransaction_removeEventListener_Callback";
 
   Stream<Event> get onAbort => abortEvent.forTarget(this);
@@ -917,18 +924,18 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class TransactionEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   TransactionEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get complete => this['complete'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -938,16 +945,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName IDBVersionChangeEvent
+@DocsEditable
+@DomName('IDBVersionChangeEvent')
 class UpgradeNeededEvent extends Event {
   UpgradeNeededEvent.internal() : super.internal();
 
-
-  /** @domName IDBUpgradeNeededEvent.newVersion */
+  @DocsEditable
+  @DomName('IDBUpgradeNeededEvent.newVersion')
   int get newVersion native "IDBUpgradeNeededEvent_newVersion_Getter";
 
-
-  /** @domName IDBUpgradeNeededEvent.oldVersion */
+  @DocsEditable
+  @DomName('IDBUpgradeNeededEvent.oldVersion')
   int get oldVersion native "IDBUpgradeNeededEvent_oldVersion_Getter";
 
 }
@@ -958,12 +966,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName IDBVersionChangeEvent
+@DocsEditable
+@DomName('IDBVersionChangeEvent')
 class VersionChangeEvent extends Event {
   VersionChangeEvent.internal() : super.internal();
 
-
-  /** @domName IDBVersionChangeEvent.version */
+  @DocsEditable
+  @DomName('IDBVersionChangeEvent.version')
   String get version native "IDBVersionChangeEvent_version_Getter";
 
 }
@@ -974,13 +983,15 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName IDBVersionChangeRequest
+@DocsEditable
+@DomName('IDBVersionChangeRequest')
 class VersionChangeRequest extends Request implements EventTarget {
   VersionChangeRequest.internal() : super.internal();
 
   static const EventStreamProvider<Event> blockedEvent = const EventStreamProvider<Event>('blocked');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   VersionChangeRequestEvents get on =>
     new VersionChangeRequestEvents(this);
 
@@ -988,12 +999,12 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class VersionChangeRequestEvents extends RequestEvents {
-  /// @docsEditable true
+  @DocsEditable
   VersionChangeRequestEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get blocked => this['blocked'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1003,7 +1014,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName IDBAny
+@DocsEditable
+@DomName('IDBAny')
 class _Any extends NativeFieldWrapperClass1 {
   _Any.internal();
 
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index 08451ab..c0d315c 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -751,9 +751,7 @@
     };
     _socket.onClosed = _httpParser.streamDone;
     _socket.onError = _httpParser.streamError;
-    // Ignore errors in the socket output stream as this is getting
-    // the same errors as the socket itself.
-    _socket.outputStream.onError = (e) => null;
+    _socket.outputStream.onError = _httpParser.streamError;
   }
 
   bool _write(List<int> data, [bool copyBuffer = false]);
@@ -876,13 +874,23 @@
   }
 
   void _onError(e) {
-    onError(e);
+    // Don't report errors for a request parser when HTTP parser is in
+    // idle state. Clients can close the connection and cause a
+    // connection reset by peer error which is OK.
+    _onClosed();
+    if (_state == _HttpConnectionBase.IDLE) return;
+
     // Propagate the error to the streams.
-    if (_request != null && _request._streamErrorHandler != null) {
+    if (_request != null &&
+        !_isRequestDone &&
+        _request._streamErrorHandler != null) {
       _request._streamErrorHandler(e);
-    }
-    if (_response != null && _response._streamErrorHandler != null) {
+    } else if (_response != null &&
+        !_isResponseDone &&
+        _response._streamErrorHandler != null) {
       _response._streamErrorHandler(e);
+    } else {
+      onError(e);
     }
     if (_socket != null) _socket.close();
   }
diff --git a/sdk/lib/io/http_parser.dart b/sdk/lib/io/http_parser.dart
index 69d4505..c0a2819 100644
--- a/sdk/lib/io/http_parser.dart
+++ b/sdk/lib/io/http_parser.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -632,13 +632,6 @@
   }
 
   void streamError(e) {
-    // Don't report errors for a request parser when HTTP parser is in
-    // idle state. Clients can close the connection and cause a
-    // connection reset by peer error which is OK.
-    if (_requestParser && _state == _State.START) {
-      closed();
-      return;
-    }
     error(e);
   }
 
diff --git a/sdk/lib/io/path.dart b/sdk/lib/io/path.dart
index 751b479..c59017a 100644
--- a/sdk/lib/io/path.dart
+++ b/sdk/lib/io/path.dart
@@ -7,7 +7,8 @@
 /**
  * A Path is an immutable wrapper of a String, with additional member functions
  * for useful path manipulations and queries.
- * On the Windows platform, Path also converts from and to native paths.
+ * On the Windows platform, Path also converts from native paths to paths using
+ * '/' as a path separator, and vice versa.
  *
  * Joining of paths and path normalization handle '.' and '..' in the usual way.
  */
@@ -23,7 +24,7 @@
    *
    *     new Path(r'c:\a\b').toString() == '/c:/a/b'
    *
-   * A path starting with '/c:/' (or any other character instead of 'c') is
+   * A path starting with a drive letter is
    * treated specially.  Backwards links ('..') cannot cancel the drive letter.
    *
    * If the path is a share path this is recorded in the Path object and
@@ -50,7 +51,9 @@
   bool get isEmpty;
 
   /**
-   * Is this path an absolute path, beginning with a path separator?
+   * Is this path an absolute path, beginning with a '/'?  Note that
+   * Windows paths beginning with '\' or with a drive letter are absolute,
+   * and a leading '/' is added when they are converted to a Path.
    */
   bool get isAbsolute;
 
@@ -60,12 +63,12 @@
   bool get isWindowsShare;
 
   /**
-   * Does this path end with a path separator?
+   * Does this path end with a '/'?
    */
   bool get hasTrailingSeparator;
 
   /**
-   * Does this path contain no consecutive path separators, no segments that
+   * Does this path contain no consecutive '/'s, no segments that
    * are '.' unless the path is exactly '.', and segments that are '..' only
    * as the leading segments on a relative path?
    */
@@ -74,7 +77,7 @@
   /**
    * Make a path canonical by dropping segments that are '.', cancelling
    * segments that are '..' with preceding segments, if possible,
-   * and combining consecutive path separators.  Leading '..' segments
+   * and combining consecutive '/'s.  Leading '..' segments
    * are kept on relative paths, and dropped from absolute paths.
    */
   Path canonicalize();
@@ -83,7 +86,7 @@
    * Joins the relative path [further] to this path.  Canonicalizes the
    * resulting joined path using [canonicalize],
    * interpreting '.' and '..' as directory traversal commands, and removing
-   * consecutive path separators.
+   * consecutive '/'s.
    *
    * If [further] is an absolute path, an IllegalArgument exception is thrown.
    *
@@ -98,8 +101,9 @@
    *   containing `'a/b/e'`.
    *
    * Note that the join operation does not drop the last segment of the
-   * base path, the way URL joining does.  That would be accomplished with
-   * basepath.directoryPath.join(further).
+   * base path, the way URL joining does.  To join basepath to further using
+   * URL semantics, use
+   *    [:basepath.directoryPath.join(further):].
    *
    * If you want to avoid joins that traverse
    * parent directories in the base, you can check whether
@@ -114,16 +118,21 @@
    * Throws an exception if such a path is impossible.
    * For example, if [base] is '../../a/b' and [this] is '.'.
    * The computation is independent of the file system and current directory.
+   *
+   * To compute a relative path using URL semantics, where the final
+   * path component of the base is dropped unless it ends with a slash,
+   * call [: a.relativeTo(b.directoryPath) :] instead of [: a.relativeTo(b) :].
    */
   Path relativeTo(Path base);
 
   /**
    * Converts a path to a string using the native filesystem's conventions.
    *
-   * On Windows, converts path separators to backwards slashes, and removes
-   * the leading path separator if the path starts with a drive specification.
+   * On Windows, converts '/'s to backwards slashes, and removes
+   * the leading '/' if the path starts with a drive specification.
    * For most valid Windows paths, this should be the inverse of the
-   * constructor Path.fromNative.
+   * conversion that the constructor new Path() performs.  If the path is
+   * a Windows share, restores the '\\' at the start of the path.
    */
   String toNativePath();
 
@@ -135,10 +144,10 @@
   String toString();
 
   /**
-   * Gets the segments of a Path.  Paths beginning or ending with the
-   * path separator do not have leading or terminating empty segments.
-   * Other than that, the segments are just the result of splitting the
-   * path on the path separator.
+   * Gets the segments of a Path. The segments are just the result of
+   * splitting the path on any '/' characters, except that a '/' at the
+   * beginning does not create an empty segment before it, and a '/' at
+   * the end does not create an empty segment after it.
    *
    *     new Path('/a/b/c/d').segments() == ['a', 'b', 'c', d'];
    *     new Path(' foo bar //../') == [' foo bar ', '', '..'];
@@ -146,18 +155,18 @@
   List<String> segments();
 
   /**
-   * Appends [finalSegment] to a path as a new segment.  Adds a path separator
+   * Appends [finalSegment] to a path as a new segment.  Adds a '/'
    * between the path and [finalSegment] if the path does not already end in
-   * a path separator.  The path is not canonicalized, and [finalSegment] may
-   * contain path separators.
+   * a '/'.  The path is not canonicalized, and [finalSegment] may
+   * contain '/'s.
    */
   Path append(String finalSegment);
 
   /**
-   * Drops the final path separator and whatever follows it from this Path,
-   * and returns the resulting Path object.  If the only path separator in
+   * Drops the final '/' and whatever follows it from this Path,
+   * and returns the resulting Path object.  If the only '/' in
    * this Path is the first character, returns '/' instead of the empty string.
-   * If there is no path separator in the Path, returns the empty string.
+   * If there is no '/' in the Path, returns the empty string.
    *
    *     new Path('../images/dot.gif').directoryPath == '../images'
    *     new Path('/usr/geoffrey/www/').directoryPath == '/usr/geoffrey/www'
@@ -168,8 +177,8 @@
   Path get directoryPath;
 
   /**
-   * The part of the path after the last path separator, or the entire path if
-   * it contains no path separator.
+   * The part of the path after the last '/', or the entire path if
+   * it contains no '/'.
    *
    *     new Path('images/DSC_0027.jpg).filename == 'DSC_0027.jpg'
    *     new Path('users/fred/').filename == ''
diff --git a/sdk/lib/io/path_impl.dart b/sdk/lib/io/path_impl.dart
index a7623b0..2ea2fea 100644
--- a/sdk/lib/io/path_impl.dart
+++ b/sdk/lib/io/path_impl.dart
@@ -45,53 +45,68 @@
   String toString() => _path;
 
   Path relativeTo(Path base) {
-    // Throws exception if an unimplemented or impossible case is reached.
     // Returns a path "relative" such that
     //    base.join(relative) == this.canonicalize.
-    // Throws an exception if no such path exists, or the case is not
-    // implemented yet.
-    var basePath = base.toString();
-    if (base.isAbsolute && _path.startsWith(basePath) &&
-        base.isWindowsShare == isWindowsShare) {
-      if (_path == basePath) return new Path('.');
-      if (base.hasTrailingSeparator) {
-        return new Path(_path.substring(basePath.length));
-      }
-      if (_path[basePath.length] == '/') {
-        return new Path(_path.substring(basePath.length + 1));
-      }
-    } else if (base.isAbsolute && isAbsolute &&
-               base.isWindowsShare == isWindowsShare) {
-      List<String> baseSegments = base.canonicalize().segments();
-      List<String> pathSegments = canonicalize().segments();
-      int common = 0;
-      int length = min(pathSegments.length, baseSegments.length);
-      while (common < length && pathSegments[common] == baseSegments[common]) {
-        common++;
-      }
-      final sb = new StringBuffer();
-
-      for (int i = common + 1; i < baseSegments.length; i++) {
-        sb.add('../');
-      }
-      if (base.hasTrailingSeparator) {
-        sb.add('../');
-      }
-      for (int i = common; i < pathSegments.length - 1; i++) {
-        sb.add('${pathSegments[i]}/');
-      }
-      sb.add('${pathSegments.last}');
-      if (hasTrailingSeparator) {
-        sb.add('/');
-      }
-      return new Path(sb.toString());
+    // Throws exception if an impossible case is reached.
+    if (base.isAbsolute != isAbsolute ||
+        base.isWindowsShare != isWindowsShare) {
+      throw new ArgumentError(
+          "Invalid case of Path.relativeTo(base):\n"
+          "  Path and base must both be relative, or both absolute.\n"
+          "  Arguments: $_path.relativeTo($base)");
     }
-    throw new UnimplementedError(
-      "Unimplemented case of Path.relativeTo(base):\n"
-      "  Only absolute paths are handled at present.\n"
-      "  Arguments: $_path.relativeTo($base)");
+
+    var basePath = base.toString();
+    if (_path.startsWith(basePath)) {
+      if (_path == basePath) return new Path('.');
+      // There must be a '/' at the end of the match, or immediately after.
+      int matchEnd = basePath.length;
+      if (_path[matchEnd - 1] == '/' || _path[matchEnd] == '/') {
+        // Drop any extra '/' characters at matchEnd
+        while (matchEnd < _path.length && _path[matchEnd] == '/') {
+          matchEnd++;
+        }
+        return new Path(_path.substring(matchEnd)).canonicalize();
+      }
+    }
+
+    List<String> baseSegments = base.canonicalize().segments();
+    List<String> pathSegments = canonicalize().segments();
+    if (baseSegments.length == 1 && baseSegments[0] == '.') {
+      baseSegments = [];
+    }
+    if (pathSegments.length == 1 && pathSegments[0] == '.') {
+      pathSegments = [];
+    }
+    int common = 0;
+    int length = min(pathSegments.length, baseSegments.length);
+    while (common < length && pathSegments[common] == baseSegments[common]) {
+      common++;
+    }
+    final segments = new List<String>();
+
+    if (common < baseSegments.length && baseSegments[common] == '..') {
+      throw new ArgumentError(
+          "Invalid case of Path.relativeTo(base):\n"
+          "  Base path has more '..'s than path does."
+          "  Arguments: $_path.relativeTo($base)");
+    }
+    for (int i = common; i < baseSegments.length; i++) {
+      segments.add('..');
+    }
+    for (int i = common; i < pathSegments.length; i++) {
+      segments.add('${pathSegments[i]}');
+    }
+    if (segments.isEmpty) {
+      segments.add('.');
+    }
+    if (hasTrailingSeparator) {
+        segments.add('');
+    }
+    return new Path(Strings.join(segments, '/'));
   }
 
+
   Path join(Path further) {
     if (further.isAbsolute) {
       throw new ArgumentError(
diff --git a/sdk/lib/io/socket_stream_impl.dart b/sdk/lib/io/socket_stream_impl.dart
index ffa0cbf..7770932 100644
--- a/sdk/lib/io/socket_stream_impl.dart
+++ b/sdk/lib/io/socket_stream_impl.dart
@@ -129,13 +129,34 @@
   }
 
   bool _write(List<int> buffer, int offset, int len, bool copyBuffer) {
-    if (_closing || _closed) throw new StreamException("Stream closed");
+    if (_closing || _closed) {
+      if (_error) return false;
+      _error = true;
+      var e = new StreamException.streamClosed();
+      if (_onError != null) {
+        _onError(e);
+        return false;
+      } else {
+        throw e;
+      }
+    }
     int bytesWritten = 0;
     if (_pendingWrites.isEmpty) {
       // If nothing is buffered write as much as possible and buffer
       // the rest.
-      bytesWritten = _socket.writeList(buffer, offset, len);
-      if (bytesWritten == len) return true;
+      try {
+        bytesWritten = _socket.writeList(buffer, offset, len);
+        if (bytesWritten == len) return true;
+      } catch (e) {
+        if (_error) return false;
+        _error = true;
+        if (_onError != null) {
+          _onError(e);
+          return false;
+        } else {
+          throw e;
+        }
+      }
     }
 
     // Place remaining data on the pending writes queue.
@@ -163,7 +184,7 @@
         bytesWritten = _socket.writeList(buffer, offset, bytesToWrite);
       } catch (e) {
         _pendingWrites.clear();
-        _onSocketError(e);
+        if (_onError != null) _onError(e);
         return;
       }
       _pendingWrites.removeBytes(bytesWritten);
@@ -192,6 +213,7 @@
 
   bool _onSocketError(e) {
     destroy();
+    if (_error) return true;
     if (_onError != null) {
       _onError(e);
       return true;
@@ -206,4 +228,5 @@
   Function _onClosed;
   bool _closing = false;
   bool _closed = false;
+  bool _error = false;
 }
diff --git a/sdk/lib/io/websocket.dart b/sdk/lib/io/websocket.dart
index 0c1c476..9ded504 100644
--- a/sdk/lib/io/websocket.dart
+++ b/sdk/lib/io/websocket.dart
@@ -24,7 +24,7 @@
 }
 
 /**
- * The web socket protocol is implemented by a HTTP server handler
+ * The web socket protocol is implemented by a HTTP or HTTPS server handler
  * which can be instantiated like this:
  *
  *     WebSocketHandler wsHandler = new WebSocketHandler();
@@ -61,10 +61,12 @@
  */
 abstract class WebSocketConnection {
   /**
-   * Sets the callback to be called when a message have been
+   * Sets the callback to be called when a message has been
    * received. The type on [message] is either [:String:] or
    * [:List<int>:] depending on whether it is a text or binary
    * message. If the message is empty [message] will be [:null:].
+   * If [message] is a [:List<int>:] then it will contain byte values
+   * from 0 to 255.
    */
   void set onMessage(void callback(message));
 
@@ -72,7 +74,7 @@
    * Sets the callback to be called when the web socket connection is
    * closed. [status] indicate the reason for closing. For network
    * errors the value of [status] will be
-   * WebSocketStatus.ABNORMAL_CLOSURE]. In this callbach it is
+   * WebSocketStatus.ABNORMAL_CLOSURE]. In this callback it is
    * possible to call [close] if [close] has not already been called.
    * If [close] has still not been called after the close callback
    * returns the received close status will automatically be echoed
@@ -81,8 +83,8 @@
   void set onClosed(void callback(int status, String reason));
 
   /**
-   * Sends a message. The [message] must be a [:String:] a
-   * [:List<int>:] or [:null:].
+   * Sends a message. The [message] must be a [:String:], a
+   * [:List<int>:] containing bytes, or [:null:].
    */
   send(Object message);
 
@@ -91,11 +93,6 @@
    * and [reason] are [:null:].
    */
   close([int status, String reason]);
-
-  /**
-   * WebSocketConnection is hashable.
-   */
-  int get hashCode;
 }
 
 
@@ -104,8 +101,8 @@
  */
 abstract class WebSocketClientConnection {
   /**
-   * Creates a new web socket client connection based on a HTTP client
-   * connection. The HTTP client connection must be freshly opened.
+   * Creates a new web socket client connection based on a HTTP(S) client
+   * connection. The HTTP or HTTPS client connection must be freshly opened.
    */
   factory WebSocketClientConnection(HttpClientConnection conn,
                                     [List<String> protocols]) {
@@ -115,7 +112,7 @@
   /**
    * Sets the callback to be called when the request object for the
    * opening handshake request is ready. This callback can be used if
-   * one need to add additional headers to the opening handshake
+   * one needs to add additional headers to the opening handshake
    * request.
    */
   void set onRequest(void callback(HttpClientRequest request));
@@ -127,16 +124,18 @@
   void set onOpen(void callback());
 
   /**
-   * Sets the callback to be called when a message have been
+   * Sets the callback to be called when a message has been
    * received. The type of [message] is either [:String:] or
-   * [:List<int>:] depending on whether it is a text or binary
+   * [:List<int>:], depending on whether it is a text or binary
    * message. If the message is empty [message] will be [:null:].
+   * If the message is a [:List<int>:] then it will contain byte values
+   * from 0 to 255.
    */
   void set onMessage(void callback(message));
 
   /**
    * Sets the callback to be called when the web socket connection is
-   * closed. [status] indicate the reason for closing. For network
+   * closed. [status] indicates the reason for closing. For network
    * errors the value of [status] will be
    * WebSocketStatus.ABNORMAL_CLOSURE].
    */
@@ -146,16 +145,16 @@
    * Sets the callback to be called when the response object for the
    * opening handshake did not cause a web socket connection
    * upgrade. This will be called in case the response status code is
-   * not 101 (Switching Protocols). If this callback is not set the
-   * [:onError:] callback will be called if the server did not upgrade
-   * the connection.
+   * not 101 (Switching Protocols). If this callback is not set and the
+   * server does not upgrade the connection, the [:onError:] callback will
+   * be called.
    */
   void set onNoUpgrade(void callback(HttpClientResponse response));
 
   /**
    * Sends a message. The [message] must be a [:String:] or a
-   * [:List<int>:]. To send an empty message use either an empty
-   * [:String:] or an empty [:List<int>:]. [:null:] cannot be used.
+   * [:List<int>:] containing bytes. To send an empty message send either
+   * an empty [:String:] or an empty [:List<int>:]. [:null:] cannot be sent.
    */
   send(message);
 
@@ -164,11 +163,6 @@
    * and [reason] are [:null:].
    */
   close([int status, String reason]);
-
-  /**
-   * WebSocketClientConnection is hashable.
-   */
-  int get hashCode;
 }
 
 
@@ -186,6 +180,9 @@
    * The type of [message] is either [:String:] or [:List<int>:]
    * depending on whether it is a text or binary message. If the
    * message is empty [message] will be [:null:]
+   * If the message is a [:List<int>:] then it will contain byte values
+   * from 0 to 255.
+
    */
   get data;
 }
@@ -285,14 +282,14 @@
   void close(int code, String reason);
 
   /**
-   * Sets the callback to be called when a message have been
+   * Sets the callback to be called when a message has been
    * received.
    */
   void set onmessage(void callback(MessageEvent event));
 
   /**
    * Sends data on the web socket connection. The data in [data] must
-   * be either a [:String:] or [:List<int>:] holding bytes.
+   * be either a [:String:], or a [:List<int>:] holding bytes.
    */
   void send(data);
 }
diff --git a/sdk/lib/io/websocket_impl.dart b/sdk/lib/io/websocket_impl.dart
index 65c4ca4..20ea830 100644
--- a/sdk/lib/io/websocket_impl.dart
+++ b/sdk/lib/io/websocket_impl.dart
@@ -767,7 +767,7 @@
 class _WebSocket implements WebSocket {
   _WebSocket(String url, [protocols]) {
     Uri uri = new Uri.fromString(url);
-    if (uri.scheme != "ws") {
+    if (uri.scheme != "ws" && uri.scheme != "wss") {
       throw new WebSocketException("Unsupported URL scheme ${uri.scheme}");
     }
     if (uri.userInfo != "") {
@@ -785,7 +785,12 @@
     }
 
     HttpClient client = new HttpClient();
-    HttpClientConnection conn = client.open("GET", uri.domain, port, path);
+    bool secure = (uri.scheme == 'wss');
+    HttpClientConnection conn = client.openUrl("GET",
+        new Uri.fromComponents(scheme: secure ? "https" : "http",
+                               domain: uri.domain,
+                               port: port,
+                               path: path));
     if (protocols is String) protocols = [protocols];
     _wsconn = new WebSocketClientConnection(conn, protocols);
     _wsconn.onOpen = () {
diff --git a/sdk/lib/isolate/isolate_stream.dart b/sdk/lib/isolate/isolate_stream.dart
index 092db35..a0a30b0 100644
--- a/sdk/lib/isolate/isolate_stream.dart
+++ b/sdk/lib/isolate/isolate_stream.dart
@@ -52,7 +52,7 @@
 class IsolateStream extends Stream<dynamic> {
   bool _isClosed = false;
   final ReceivePort _port;
-  StreamController _controller = new StreamController();
+  StreamController _controller = new StreamController.multiSubscription();
 
   IsolateStream._fromOriginalReceivePort(this._port) {
     _port.receive((message, replyTo) {
diff --git a/sdk/lib/json/json.dart b/sdk/lib/json/json.dart
index 5de1b0e..e85d93f 100644
--- a/sdk/lib/json/json.dart
+++ b/sdk/lib/json/json.dart
@@ -41,6 +41,12 @@
  * [List]s of parsed JSON values or [Map]s from [String] to parsed
  * JSON values.
  *
+ * The optional [revivier] function, if provided, is called once for each
+ * object or list property parsed. The arguments are the property name
+ * ([String]) or list index ([int]), and the value is the parsed value.
+ * The return value of the revivier will be used as the value of that property
+ * instead the parsed value.
+ *
  * Throws [FormatException] if the input is not valid JSON text.
  */
 parse(String json, [reviver(var key, var value)]) {
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index 5241d91..28ec51b 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -56,84 +56,85 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAElement')
 class AElement extends SvgElement implements Transformable, Tests, UriReference, Stylable, ExternalResourcesRequired, LangSpace native "*SVGAElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory AElement() => _SvgElementFactoryProvider.createSvgElement_tag("a");
 
-  /// @domName SVGAElement.target; @docsEditable true
+  @DocsEditable @DomName('SVGAElement.target')
   final AnimatedString target;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGAElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGAElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGAElement.xmlspace')
   String xmlspace;
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGAElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGAElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGAElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGAElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGAElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGAElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGAElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGAElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGAElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGAElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGAElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /// @domName SVGTransformable.transform; @docsEditable true
+  @DocsEditable @DomName('SVGAElement.transform')
   final AnimatedTransformList transform;
 
   // From SVGURIReference
 
-  /// @domName SVGURIReference.href; @docsEditable true
+  @DocsEditable @DomName('SVGAElement.href')
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -141,7 +142,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAltGlyphDefElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAltGlyphDefElement')
 class AltGlyphDefElement extends SvgElement native "*SVGAltGlyphDefElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -149,18 +152,20 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAltGlyphElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAltGlyphElement')
 class AltGlyphElement extends TextPositioningElement implements UriReference native "*SVGAltGlyphElement" {
 
-  /// @domName SVGAltGlyphElement.format; @docsEditable true
+  @DocsEditable @DomName('SVGAltGlyphElement.format')
   String format;
 
-  /// @domName SVGAltGlyphElement.glyphRef; @docsEditable true
+  @DocsEditable @DomName('SVGAltGlyphElement.glyphRef')
   String glyphRef;
 
   // From SVGURIReference
 
-  /// @domName SVGURIReference.href; @docsEditable true
+  @DocsEditable @DomName('SVGAltGlyphElement.href')
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -168,7 +173,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAltGlyphItemElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAltGlyphItemElement')
 class AltGlyphItemElement extends SvgElement native "*SVGAltGlyphItemElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -176,7 +183,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAngle; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAngle')
 class Angle native "*SVGAngle" {
 
   static const int SVG_ANGLETYPE_DEG = 2;
@@ -189,22 +198,22 @@
 
   static const int SVG_ANGLETYPE_UNSPECIFIED = 1;
 
-  /// @domName SVGAngle.unitType; @docsEditable true
+  @DocsEditable @DomName('SVGAngle.unitType')
   final int unitType;
 
-  /// @domName SVGAngle.value; @docsEditable true
+  @DocsEditable @DomName('SVGAngle.value')
   num value;
 
-  /// @domName SVGAngle.valueAsString; @docsEditable true
+  @DocsEditable @DomName('SVGAngle.valueAsString')
   String valueAsString;
 
-  /// @domName SVGAngle.valueInSpecifiedUnits; @docsEditable true
+  @DocsEditable @DomName('SVGAngle.valueInSpecifiedUnits')
   num valueInSpecifiedUnits;
 
-  /// @domName SVGAngle.convertToSpecifiedUnits; @docsEditable true
+  @DocsEditable @DomName('SVGAngle.convertToSpecifiedUnits')
   void convertToSpecifiedUnits(int unitType) native;
 
-  /// @domName SVGAngle.newValueSpecifiedUnits; @docsEditable true
+  @DocsEditable @DomName('SVGAngle.newValueSpecifiedUnits')
   void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -212,10 +221,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimateColorElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimateColorElement')
 class AnimateColorElement extends AnimationElement native "*SVGAnimateColorElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory AnimateColorElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateColor");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -223,10 +234,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimateElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimateElement')
 class AnimateElement extends AnimationElement native "*SVGAnimateElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory AnimateElement() => _SvgElementFactoryProvider.createSvgElement_tag("animate");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -234,10 +247,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimateMotionElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimateMotionElement')
 class AnimateMotionElement extends AnimationElement native "*SVGAnimateMotionElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory AnimateMotionElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateMotion");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -245,10 +260,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimateTransformElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimateTransformElement')
 class AnimateTransformElement extends AnimationElement native "*SVGAnimateTransformElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory AnimateTransformElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateTransform");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -256,13 +273,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedAngle; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimatedAngle')
 class AnimatedAngle native "*SVGAnimatedAngle" {
 
-  /// @domName SVGAnimatedAngle.animVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedAngle.animVal')
   final Angle animVal;
 
-  /// @domName SVGAnimatedAngle.baseVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedAngle.baseVal')
   final Angle baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -270,13 +289,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedBoolean; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimatedBoolean')
 class AnimatedBoolean native "*SVGAnimatedBoolean" {
 
-  /// @domName SVGAnimatedBoolean.animVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedBoolean.animVal')
   final bool animVal;
 
-  /// @domName SVGAnimatedBoolean.baseVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedBoolean.baseVal')
   bool baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -284,13 +305,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedEnumeration; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimatedEnumeration')
 class AnimatedEnumeration native "*SVGAnimatedEnumeration" {
 
-  /// @domName SVGAnimatedEnumeration.animVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedEnumeration.animVal')
   final int animVal;
 
-  /// @domName SVGAnimatedEnumeration.baseVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedEnumeration.baseVal')
   int baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -298,13 +321,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedInteger; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimatedInteger')
 class AnimatedInteger native "*SVGAnimatedInteger" {
 
-  /// @domName SVGAnimatedInteger.animVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedInteger.animVal')
   final int animVal;
 
-  /// @domName SVGAnimatedInteger.baseVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedInteger.baseVal')
   int baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -312,13 +337,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedLength; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimatedLength')
 class AnimatedLength native "*SVGAnimatedLength" {
 
-  /// @domName SVGAnimatedLength.animVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedLength.animVal')
   final Length animVal;
 
-  /// @domName SVGAnimatedLength.baseVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedLength.baseVal')
   final Length baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -326,13 +353,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedLengthList; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimatedLengthList')
 class AnimatedLengthList native "*SVGAnimatedLengthList" {
 
-  /// @domName SVGAnimatedLengthList.animVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedLengthList.animVal')
   final LengthList animVal;
 
-  /// @domName SVGAnimatedLengthList.baseVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedLengthList.baseVal')
   final LengthList baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -340,13 +369,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedNumber; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimatedNumber')
 class AnimatedNumber native "*SVGAnimatedNumber" {
 
-  /// @domName SVGAnimatedNumber.animVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedNumber.animVal')
   final num animVal;
 
-  /// @domName SVGAnimatedNumber.baseVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedNumber.baseVal')
   num baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -354,13 +385,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedNumberList; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimatedNumberList')
 class AnimatedNumberList native "*SVGAnimatedNumberList" {
 
-  /// @domName SVGAnimatedNumberList.animVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedNumberList.animVal')
   final NumberList animVal;
 
-  /// @domName SVGAnimatedNumberList.baseVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedNumberList.baseVal')
   final NumberList baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -368,13 +401,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedPreserveAspectRatio; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimatedPreserveAspectRatio')
 class AnimatedPreserveAspectRatio native "*SVGAnimatedPreserveAspectRatio" {
 
-  /// @domName SVGAnimatedPreserveAspectRatio.animVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedPreserveAspectRatio.animVal')
   final PreserveAspectRatio animVal;
 
-  /// @domName SVGAnimatedPreserveAspectRatio.baseVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedPreserveAspectRatio.baseVal')
   final PreserveAspectRatio baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -382,13 +417,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedRect; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimatedRect')
 class AnimatedRect native "*SVGAnimatedRect" {
 
-  /// @domName SVGAnimatedRect.animVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedRect.animVal')
   final Rect animVal;
 
-  /// @domName SVGAnimatedRect.baseVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedRect.baseVal')
   final Rect baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -396,13 +433,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedString; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimatedString')
 class AnimatedString native "*SVGAnimatedString" {
 
-  /// @domName SVGAnimatedString.animVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedString.animVal')
   final String animVal;
 
-  /// @domName SVGAnimatedString.baseVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedString.baseVal')
   String baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -410,13 +449,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedTransformList; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimatedTransformList')
 class AnimatedTransformList native "*SVGAnimatedTransformList" {
 
-  /// @domName SVGAnimatedTransformList.animVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedTransformList.animVal')
   final TransformList animVal;
 
-  /// @domName SVGAnimatedTransformList.baseVal; @docsEditable true
+  @DocsEditable @DomName('SVGAnimatedTransformList.baseVal')
   final TransformList baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -424,55 +465,57 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimationElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGAnimationElement')
 class AnimationElement extends SvgElement implements Tests, ElementTimeControl, ExternalResourcesRequired native "*SVGAnimationElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory AnimationElement() => _SvgElementFactoryProvider.createSvgElement_tag("animation");
 
-  /// @domName SVGAnimationElement.targetElement; @docsEditable true
+  @DocsEditable @DomName('SVGAnimationElement.targetElement')
   final SvgElement targetElement;
 
-  /// @domName SVGAnimationElement.getCurrentTime; @docsEditable true
+  @DocsEditable @DomName('SVGAnimationElement.getCurrentTime')
   num getCurrentTime() native;
 
-  /// @domName SVGAnimationElement.getSimpleDuration; @docsEditable true
+  @DocsEditable @DomName('SVGAnimationElement.getSimpleDuration')
   num getSimpleDuration() native;
 
-  /// @domName SVGAnimationElement.getStartTime; @docsEditable true
+  @DocsEditable @DomName('SVGAnimationElement.getStartTime')
   num getStartTime() native;
 
   // From ElementTimeControl
 
-  /// @domName ElementTimeControl.beginElement; @docsEditable true
+  @DocsEditable @DomName('SVGAnimationElement.beginElement')
   void beginElement() native;
 
-  /// @domName ElementTimeControl.beginElementAt; @docsEditable true
+  @DocsEditable @DomName('SVGAnimationElement.beginElementAt')
   void beginElementAt(num offset) native;
 
-  /// @domName ElementTimeControl.endElement; @docsEditable true
+  @DocsEditable @DomName('SVGAnimationElement.endElement')
   void endElement() native;
 
-  /// @domName ElementTimeControl.endElementAt; @docsEditable true
+  @DocsEditable @DomName('SVGAnimationElement.endElementAt')
   void endElementAt(num offset) native;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGAnimationElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGAnimationElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGAnimationElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGAnimationElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGAnimationElement.hasExtension')
   bool hasExtension(String extension) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -480,85 +523,86 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGCircleElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGCircleElement')
 class CircleElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGCircleElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory CircleElement() => _SvgElementFactoryProvider.createSvgElement_tag("circle");
 
-  /// @domName SVGCircleElement.cx; @docsEditable true
+  @DocsEditable @DomName('SVGCircleElement.cx')
   final AnimatedLength cx;
 
-  /// @domName SVGCircleElement.cy; @docsEditable true
+  @DocsEditable @DomName('SVGCircleElement.cy')
   final AnimatedLength cy;
 
-  /// @domName SVGCircleElement.r; @docsEditable true
+  @DocsEditable @DomName('SVGCircleElement.r')
   final AnimatedLength r;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGCircleElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGCircleElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGCircleElement.xmlspace')
   String xmlspace;
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGCircleElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGCircleElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGCircleElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGCircleElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGCircleElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGCircleElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGCircleElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGCircleElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGCircleElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGCircleElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGCircleElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /// @domName SVGTransformable.transform; @docsEditable true
+  @DocsEditable @DomName('SVGCircleElement.transform')
   final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -566,79 +610,80 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGClipPathElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGClipPathElement')
 class ClipPathElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGClipPathElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory ClipPathElement() => _SvgElementFactoryProvider.createSvgElement_tag("clipPath");
 
-  /// @domName SVGClipPathElement.clipPathUnits; @docsEditable true
+  @DocsEditable @DomName('SVGClipPathElement.clipPathUnits')
   final AnimatedEnumeration clipPathUnits;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGClipPathElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGClipPathElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGClipPathElement.xmlspace')
   String xmlspace;
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGClipPathElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGClipPathElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGClipPathElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGClipPathElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGClipPathElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGClipPathElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGClipPathElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGClipPathElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGClipPathElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGClipPathElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGClipPathElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /// @domName SVGTransformable.transform; @docsEditable true
+  @DocsEditable @DomName('SVGClipPathElement.transform')
   final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -646,7 +691,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGColor; @docsEditable true
+
+@DocsEditable
+@DomName('SVGColor')
 class Color extends CssValue native "*SVGColor" {
 
   static const int SVG_COLORTYPE_CURRENTCOLOR = 3;
@@ -657,21 +704,21 @@
 
   static const int SVG_COLORTYPE_UNKNOWN = 0;
 
-  /// @domName SVGColor.colorType; @docsEditable true
+  @DocsEditable @DomName('SVGColor.colorType')
   final int colorType;
 
-  /// @domName SVGColor.rgbColor; @docsEditable true
+  @DocsEditable @DomName('SVGColor.rgbColor')
   final RgbColor rgbColor;
 
-  /// @domName SVGColor.setColor; @docsEditable true
+  @DocsEditable @DomName('SVGColor.setColor')
   void setColor(int colorType, String rgbColor, String iccColor) native;
 
-  /// @domName SVGColor.setRGBColor; @docsEditable true
   @JSName('setRGBColor')
+  @DocsEditable @DomName('SVGColor.setRGBColor')
   void setRgbColor(String rgbColor) native;
 
-  /// @domName SVGColor.setRGBColorICCColor; @docsEditable true
   @JSName('setRGBColorICCColor')
+  @DocsEditable @DomName('SVGColor.setRGBColorICCColor')
   void setRgbColorIccColor(String rgbColor, String iccColor) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -679,7 +726,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGComponentTransferFunctionElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGComponentTransferFunctionElement')
 class ComponentTransferFunctionElement extends SvgElement native "*SVGComponentTransferFunctionElement" {
 
   static const int SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3;
@@ -694,25 +743,25 @@
 
   static const int SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0;
 
-  /// @domName SVGComponentTransferFunctionElement.amplitude; @docsEditable true
+  @DocsEditable @DomName('SVGComponentTransferFunctionElement.amplitude')
   final AnimatedNumber amplitude;
 
-  /// @domName SVGComponentTransferFunctionElement.exponent; @docsEditable true
+  @DocsEditable @DomName('SVGComponentTransferFunctionElement.exponent')
   final AnimatedNumber exponent;
 
-  /// @domName SVGComponentTransferFunctionElement.intercept; @docsEditable true
+  @DocsEditable @DomName('SVGComponentTransferFunctionElement.intercept')
   final AnimatedNumber intercept;
 
-  /// @domName SVGComponentTransferFunctionElement.offset; @docsEditable true
+  @DocsEditable @DomName('SVGComponentTransferFunctionElement.offset')
   final AnimatedNumber offset;
 
-  /// @domName SVGComponentTransferFunctionElement.slope; @docsEditable true
+  @DocsEditable @DomName('SVGComponentTransferFunctionElement.slope')
   final AnimatedNumber slope;
 
-  /// @domName SVGComponentTransferFunctionElement.tableValues; @docsEditable true
+  @DocsEditable @DomName('SVGComponentTransferFunctionElement.tableValues')
   final AnimatedNumberList tableValues;
 
-  /// @domName SVGComponentTransferFunctionElement.type; @docsEditable true
+  @DocsEditable @DomName('SVGComponentTransferFunctionElement.type')
   final AnimatedEnumeration type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -720,40 +769,42 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGCursorElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGCursorElement')
 class CursorElement extends SvgElement implements UriReference, Tests, ExternalResourcesRequired native "*SVGCursorElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory CursorElement() => _SvgElementFactoryProvider.createSvgElement_tag("cursor");
 
-  /// @domName SVGCursorElement.x; @docsEditable true
+  @DocsEditable @DomName('SVGCursorElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGCursorElement.y; @docsEditable true
+  @DocsEditable @DomName('SVGCursorElement.y')
   final AnimatedLength y;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGCursorElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGCursorElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGCursorElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGCursorElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGCursorElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGURIReference
 
-  /// @domName SVGURIReference.href; @docsEditable true
+  @DocsEditable @DomName('SVGCursorElement.href')
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -761,76 +812,77 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGDefsElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGDefsElement')
 class DefsElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGDefsElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory DefsElement() => _SvgElementFactoryProvider.createSvgElement_tag("defs");
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGDefsElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGDefsElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGDefsElement.xmlspace')
   String xmlspace;
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGDefsElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGDefsElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGDefsElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGDefsElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGDefsElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGDefsElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGDefsElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGDefsElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGDefsElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGDefsElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGDefsElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /// @domName SVGTransformable.transform; @docsEditable true
+  @DocsEditable @DomName('SVGDefsElement.transform')
   final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -838,30 +890,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGDescElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGDescElement')
 class DescElement extends SvgElement implements Stylable, LangSpace native "*SVGDescElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory DescElement() => _SvgElementFactoryProvider.createSvgElement_tag("desc");
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGDescElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGDescElement.xmlspace')
   String xmlspace;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGDescElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -869,7 +922,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGElementInstance; @docsEditable true
+
+@DocsEditable
+@DomName('SVGElementInstance')
 class ElementInstance extends EventTarget native "*SVGElementInstance" {
 
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
@@ -952,33 +1007,34 @@
 
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   ElementInstanceEvents get on =>
     new ElementInstanceEvents(this);
 
-  /// @domName SVGElementInstance.childNodes; @docsEditable true
+  @DocsEditable @DomName('SVGElementInstance.childNodes')
   @Returns('_ElementInstanceList') @Creates('_ElementInstanceList')
   final List<ElementInstance> childNodes;
 
-  /// @domName SVGElementInstance.correspondingElement; @docsEditable true
+  @DocsEditable @DomName('SVGElementInstance.correspondingElement')
   final SvgElement correspondingElement;
 
-  /// @domName SVGElementInstance.correspondingUseElement; @docsEditable true
+  @DocsEditable @DomName('SVGElementInstance.correspondingUseElement')
   final UseElement correspondingUseElement;
 
-  /// @domName SVGElementInstance.firstChild; @docsEditable true
+  @DocsEditable @DomName('SVGElementInstance.firstChild')
   final ElementInstance firstChild;
 
-  /// @domName SVGElementInstance.lastChild; @docsEditable true
+  @DocsEditable @DomName('SVGElementInstance.lastChild')
   final ElementInstance lastChild;
 
-  /// @domName SVGElementInstance.nextSibling; @docsEditable true
+  @DocsEditable @DomName('SVGElementInstance.nextSibling')
   final ElementInstance nextSibling;
 
-  /// @domName SVGElementInstance.parentNode; @docsEditable true
+  @DocsEditable @DomName('SVGElementInstance.parentNode')
   final ElementInstance parentNode;
 
-  /// @domName SVGElementInstance.previousSibling; @docsEditable true
+  @DocsEditable @DomName('SVGElementInstance.previousSibling')
   final ElementInstance previousSibling;
 
   Stream<Event> get onAbort => abortEvent.forTarget(this);
@@ -1062,129 +1118,129 @@
   Stream<Event> get onUnload => unloadEvent.forTarget(this);
 }
 
-/// @docsEditable true
+@DocsEditable
 class ElementInstanceEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   ElementInstanceEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get beforeCopy => this['beforecopy'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get beforeCut => this['beforecut'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get beforePaste => this['beforepaste'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get blur => this['blur'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get change => this['change'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get click => this['click'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get contextMenu => this['contextmenu'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get copy => this['copy'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get cut => this['cut'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get doubleClick => this['dblclick'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get drag => this['drag'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragEnd => this['dragend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragEnter => this['dragenter'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragLeave => this['dragleave'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragOver => this['dragover'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragStart => this['dragstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get drop => this['drop'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get focus => this['focus'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get input => this['input'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyDown => this['keydown'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyPress => this['keypress'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyUp => this['keyup'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get load => this['load'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseDown => this['mousedown'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseMove => this['mousemove'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseOut => this['mouseout'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseOver => this['mouseover'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseUp => this['mouseup'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseWheel => this['mousewheel'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get paste => this['paste'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get reset => this['reset'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get resize => this['resize'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get scroll => this['scroll'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get search => this['search'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get select => this['select'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get selectStart => this['selectstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get submit => this['submit'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get unload => this['unload'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1192,19 +1248,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ElementTimeControl
+@DocsEditable
+@DomName('ElementTimeControl')
 abstract class ElementTimeControl {
 
-  /// @domName ElementTimeControl.beginElement; @docsEditable true
   void beginElement();
 
-  /// @domName ElementTimeControl.beginElementAt; @docsEditable true
   void beginElementAt(num offset);
 
-  /// @domName ElementTimeControl.endElement; @docsEditable true
   void endElement();
 
-  /// @domName ElementTimeControl.endElementAt; @docsEditable true
   void endElementAt(num offset);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1212,88 +1265,89 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGEllipseElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGEllipseElement')
 class EllipseElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGEllipseElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory EllipseElement() => _SvgElementFactoryProvider.createSvgElement_tag("ellipse");
 
-  /// @domName SVGEllipseElement.cx; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.cx')
   final AnimatedLength cx;
 
-  /// @domName SVGEllipseElement.cy; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.cy')
   final AnimatedLength cy;
 
-  /// @domName SVGEllipseElement.rx; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.rx')
   final AnimatedLength rx;
 
-  /// @domName SVGEllipseElement.ry; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.ry')
   final AnimatedLength ry;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.xmlspace')
   String xmlspace;
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGEllipseElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGEllipseElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /// @domName SVGTransformable.transform; @docsEditable true
+  @DocsEditable @DomName('SVGEllipseElement.transform')
   final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1301,7 +1355,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGExternalResourcesRequired
+@DocsEditable
+@DomName('SVGExternalResourcesRequired')
 abstract class ExternalResourcesRequired {
 
   AnimatedBoolean externalResourcesRequired;
@@ -1311,7 +1366,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEBlendElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEBlendElement')
 class FEBlendElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEBlendElement" {
 
   static const int SVG_FEBLEND_MODE_DARKEN = 4;
@@ -1326,42 +1383,41 @@
 
   static const int SVG_FEBLEND_MODE_UNKNOWN = 0;
 
-  /// @domName SVGFEBlendElement.in1; @docsEditable true
+  @DocsEditable @DomName('SVGFEBlendElement.in1')
   final AnimatedString in1;
 
-  /// @domName SVGFEBlendElement.in2; @docsEditable true
+  @DocsEditable @DomName('SVGFEBlendElement.in2')
   final AnimatedString in2;
 
-  /// @domName SVGFEBlendElement.mode; @docsEditable true
+  @DocsEditable @DomName('SVGFEBlendElement.mode')
   final AnimatedEnumeration mode;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFEBlendElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFEBlendElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFEBlendElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFEBlendElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFEBlendElement.y')
   final AnimatedLength y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFEBlendElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1369,7 +1425,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEColorMatrixElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEColorMatrixElement')
 class FEColorMatrixElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEColorMatrixElement" {
 
   static const int SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
@@ -1382,42 +1440,41 @@
 
   static const int SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
 
-  /// @domName SVGFEColorMatrixElement.in1; @docsEditable true
+  @DocsEditable @DomName('SVGFEColorMatrixElement.in1')
   final AnimatedString in1;
 
-  /// @domName SVGFEColorMatrixElement.type; @docsEditable true
+  @DocsEditable @DomName('SVGFEColorMatrixElement.type')
   final AnimatedEnumeration type;
 
-  /// @domName SVGFEColorMatrixElement.values; @docsEditable true
+  @DocsEditable @DomName('SVGFEColorMatrixElement.values')
   final AnimatedNumberList values;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFEColorMatrixElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFEColorMatrixElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFEColorMatrixElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFEColorMatrixElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFEColorMatrixElement.y')
   final AnimatedLength y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFEColorMatrixElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1425,39 +1482,40 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEComponentTransferElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEComponentTransferElement')
 class FEComponentTransferElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEComponentTransferElement" {
 
-  /// @domName SVGFEComponentTransferElement.in1; @docsEditable true
+  @DocsEditable @DomName('SVGFEComponentTransferElement.in1')
   final AnimatedString in1;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFEComponentTransferElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFEComponentTransferElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFEComponentTransferElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFEComponentTransferElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFEComponentTransferElement.y')
   final AnimatedLength y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFEComponentTransferElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1465,7 +1523,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFECompositeElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFECompositeElement')
 class FECompositeElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFECompositeElement" {
 
   static const int SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;
@@ -1482,54 +1542,53 @@
 
   static const int SVG_FECOMPOSITE_OPERATOR_XOR = 5;
 
-  /// @domName SVGFECompositeElement.in1; @docsEditable true
+  @DocsEditable @DomName('SVGFECompositeElement.in1')
   final AnimatedString in1;
 
-  /// @domName SVGFECompositeElement.in2; @docsEditable true
+  @DocsEditable @DomName('SVGFECompositeElement.in2')
   final AnimatedString in2;
 
-  /// @domName SVGFECompositeElement.k1; @docsEditable true
+  @DocsEditable @DomName('SVGFECompositeElement.k1')
   final AnimatedNumber k1;
 
-  /// @domName SVGFECompositeElement.k2; @docsEditable true
+  @DocsEditable @DomName('SVGFECompositeElement.k2')
   final AnimatedNumber k2;
 
-  /// @domName SVGFECompositeElement.k3; @docsEditable true
+  @DocsEditable @DomName('SVGFECompositeElement.k3')
   final AnimatedNumber k3;
 
-  /// @domName SVGFECompositeElement.k4; @docsEditable true
+  @DocsEditable @DomName('SVGFECompositeElement.k4')
   final AnimatedNumber k4;
 
-  /// @domName SVGFECompositeElement.operator; @docsEditable true
+  @DocsEditable @DomName('SVGFECompositeElement.operator')
   final AnimatedEnumeration operator;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFECompositeElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFECompositeElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFECompositeElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFECompositeElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFECompositeElement.y')
   final AnimatedLength y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFECompositeElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1537,7 +1596,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEConvolveMatrixElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEConvolveMatrixElement')
 class FEConvolveMatrixElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEConvolveMatrixElement" {
 
   static const int SVG_EDGEMODE_DUPLICATE = 1;
@@ -1548,69 +1609,68 @@
 
   static const int SVG_EDGEMODE_WRAP = 2;
 
-  /// @domName SVGFEConvolveMatrixElement.bias; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.bias')
   final AnimatedNumber bias;
 
-  /// @domName SVGFEConvolveMatrixElement.divisor; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.divisor')
   final AnimatedNumber divisor;
 
-  /// @domName SVGFEConvolveMatrixElement.edgeMode; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.edgeMode')
   final AnimatedEnumeration edgeMode;
 
-  /// @domName SVGFEConvolveMatrixElement.in1; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.in1')
   final AnimatedString in1;
 
-  /// @domName SVGFEConvolveMatrixElement.kernelMatrix; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.kernelMatrix')
   final AnimatedNumberList kernelMatrix;
 
-  /// @domName SVGFEConvolveMatrixElement.kernelUnitLengthX; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.kernelUnitLengthX')
   final AnimatedNumber kernelUnitLengthX;
 
-  /// @domName SVGFEConvolveMatrixElement.kernelUnitLengthY; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.kernelUnitLengthY')
   final AnimatedNumber kernelUnitLengthY;
 
-  /// @domName SVGFEConvolveMatrixElement.orderX; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.orderX')
   final AnimatedInteger orderX;
 
-  /// @domName SVGFEConvolveMatrixElement.orderY; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.orderY')
   final AnimatedInteger orderY;
 
-  /// @domName SVGFEConvolveMatrixElement.preserveAlpha; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.preserveAlpha')
   final AnimatedBoolean preserveAlpha;
 
-  /// @domName SVGFEConvolveMatrixElement.targetX; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.targetX')
   final AnimatedInteger targetX;
 
-  /// @domName SVGFEConvolveMatrixElement.targetY; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.targetY')
   final AnimatedInteger targetY;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.y')
   final AnimatedLength y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFEConvolveMatrixElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1618,51 +1678,52 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEDiffuseLightingElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEDiffuseLightingElement')
 class FEDiffuseLightingElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEDiffuseLightingElement" {
 
-  /// @domName SVGFEDiffuseLightingElement.diffuseConstant; @docsEditable true
+  @DocsEditable @DomName('SVGFEDiffuseLightingElement.diffuseConstant')
   final AnimatedNumber diffuseConstant;
 
-  /// @domName SVGFEDiffuseLightingElement.in1; @docsEditable true
+  @DocsEditable @DomName('SVGFEDiffuseLightingElement.in1')
   final AnimatedString in1;
 
-  /// @domName SVGFEDiffuseLightingElement.kernelUnitLengthX; @docsEditable true
+  @DocsEditable @DomName('SVGFEDiffuseLightingElement.kernelUnitLengthX')
   final AnimatedNumber kernelUnitLengthX;
 
-  /// @domName SVGFEDiffuseLightingElement.kernelUnitLengthY; @docsEditable true
+  @DocsEditable @DomName('SVGFEDiffuseLightingElement.kernelUnitLengthY')
   final AnimatedNumber kernelUnitLengthY;
 
-  /// @domName SVGFEDiffuseLightingElement.surfaceScale; @docsEditable true
+  @DocsEditable @DomName('SVGFEDiffuseLightingElement.surfaceScale')
   final AnimatedNumber surfaceScale;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFEDiffuseLightingElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFEDiffuseLightingElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFEDiffuseLightingElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFEDiffuseLightingElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFEDiffuseLightingElement.y')
   final AnimatedLength y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFEDiffuseLightingElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1670,7 +1731,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEDisplacementMapElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEDisplacementMapElement')
 class FEDisplacementMapElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEDisplacementMapElement" {
 
   static const int SVG_CHANNEL_A = 4;
@@ -1683,48 +1746,47 @@
 
   static const int SVG_CHANNEL_UNKNOWN = 0;
 
-  /// @domName SVGFEDisplacementMapElement.in1; @docsEditable true
+  @DocsEditable @DomName('SVGFEDisplacementMapElement.in1')
   final AnimatedString in1;
 
-  /// @domName SVGFEDisplacementMapElement.in2; @docsEditable true
+  @DocsEditable @DomName('SVGFEDisplacementMapElement.in2')
   final AnimatedString in2;
 
-  /// @domName SVGFEDisplacementMapElement.scale; @docsEditable true
+  @DocsEditable @DomName('SVGFEDisplacementMapElement.scale')
   final AnimatedNumber scale;
 
-  /// @domName SVGFEDisplacementMapElement.xChannelSelector; @docsEditable true
+  @DocsEditable @DomName('SVGFEDisplacementMapElement.xChannelSelector')
   final AnimatedEnumeration xChannelSelector;
 
-  /// @domName SVGFEDisplacementMapElement.yChannelSelector; @docsEditable true
+  @DocsEditable @DomName('SVGFEDisplacementMapElement.yChannelSelector')
   final AnimatedEnumeration yChannelSelector;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFEDisplacementMapElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFEDisplacementMapElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFEDisplacementMapElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFEDisplacementMapElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFEDisplacementMapElement.y')
   final AnimatedLength y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFEDisplacementMapElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1732,13 +1794,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEDistantLightElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEDistantLightElement')
 class FEDistantLightElement extends SvgElement native "*SVGFEDistantLightElement" {
 
-  /// @domName SVGFEDistantLightElement.azimuth; @docsEditable true
+  @DocsEditable @DomName('SVGFEDistantLightElement.azimuth')
   final AnimatedNumber azimuth;
 
-  /// @domName SVGFEDistantLightElement.elevation; @docsEditable true
+  @DocsEditable @DomName('SVGFEDistantLightElement.elevation')
   final AnimatedNumber elevation;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1746,54 +1810,55 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEDropShadowElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEDropShadowElement')
 class FEDropShadowElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEDropShadowElement" {
 
-  /// @domName SVGFEDropShadowElement.dx; @docsEditable true
+  @DocsEditable @DomName('SVGFEDropShadowElement.dx')
   final AnimatedNumber dx;
 
-  /// @domName SVGFEDropShadowElement.dy; @docsEditable true
+  @DocsEditable @DomName('SVGFEDropShadowElement.dy')
   final AnimatedNumber dy;
 
-  /// @domName SVGFEDropShadowElement.in1; @docsEditable true
+  @DocsEditable @DomName('SVGFEDropShadowElement.in1')
   final AnimatedString in1;
 
-  /// @domName SVGFEDropShadowElement.stdDeviationX; @docsEditable true
+  @DocsEditable @DomName('SVGFEDropShadowElement.stdDeviationX')
   final AnimatedNumber stdDeviationX;
 
-  /// @domName SVGFEDropShadowElement.stdDeviationY; @docsEditable true
+  @DocsEditable @DomName('SVGFEDropShadowElement.stdDeviationY')
   final AnimatedNumber stdDeviationY;
 
-  /// @domName SVGFEDropShadowElement.setStdDeviation; @docsEditable true
+  @DocsEditable @DomName('SVGFEDropShadowElement.setStdDeviation')
   void setStdDeviation(num stdDeviationX, num stdDeviationY) native;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFEDropShadowElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFEDropShadowElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFEDropShadowElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFEDropShadowElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFEDropShadowElement.y')
   final AnimatedLength y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFEDropShadowElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1801,36 +1866,37 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEFloodElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEFloodElement')
 class FEFloodElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEFloodElement" {
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFEFloodElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFEFloodElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFEFloodElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFEFloodElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFEFloodElement.y')
   final AnimatedLength y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFEFloodElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1838,7 +1904,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEFuncAElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEFuncAElement')
 class FEFuncAElement extends ComponentTransferFunctionElement native "*SVGFEFuncAElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1846,7 +1914,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEFuncBElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEFuncBElement')
 class FEFuncBElement extends ComponentTransferFunctionElement native "*SVGFEFuncBElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1854,7 +1924,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEFuncGElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEFuncGElement')
 class FEFuncGElement extends ComponentTransferFunctionElement native "*SVGFEFuncGElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1862,7 +1934,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEFuncRElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEFuncRElement')
 class FEFuncRElement extends ComponentTransferFunctionElement native "*SVGFEFuncRElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1870,48 +1944,49 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEGaussianBlurElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEGaussianBlurElement')
 class FEGaussianBlurElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEGaussianBlurElement" {
 
-  /// @domName SVGFEGaussianBlurElement.in1; @docsEditable true
+  @DocsEditable @DomName('SVGFEGaussianBlurElement.in1')
   final AnimatedString in1;
 
-  /// @domName SVGFEGaussianBlurElement.stdDeviationX; @docsEditable true
+  @DocsEditable @DomName('SVGFEGaussianBlurElement.stdDeviationX')
   final AnimatedNumber stdDeviationX;
 
-  /// @domName SVGFEGaussianBlurElement.stdDeviationY; @docsEditable true
+  @DocsEditable @DomName('SVGFEGaussianBlurElement.stdDeviationY')
   final AnimatedNumber stdDeviationY;
 
-  /// @domName SVGFEGaussianBlurElement.setStdDeviation; @docsEditable true
+  @DocsEditable @DomName('SVGFEGaussianBlurElement.setStdDeviation')
   void setStdDeviation(num stdDeviationX, num stdDeviationY) native;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFEGaussianBlurElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFEGaussianBlurElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFEGaussianBlurElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFEGaussianBlurElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFEGaussianBlurElement.y')
   final AnimatedLength y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFEGaussianBlurElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1919,57 +1994,58 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEImageElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEImageElement')
 class FEImageElement extends SvgElement implements FilterPrimitiveStandardAttributes, UriReference, ExternalResourcesRequired, LangSpace native "*SVGFEImageElement" {
 
-  /// @domName SVGFEImageElement.preserveAspectRatio; @docsEditable true
+  @DocsEditable @DomName('SVGFEImageElement.preserveAspectRatio')
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGFEImageElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFEImageElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFEImageElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFEImageElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFEImageElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFEImageElement.y')
   final AnimatedLength y;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGFEImageElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGFEImageElement.xmlspace')
   String xmlspace;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFEImageElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGURIReference
 
-  /// @domName SVGURIReference.href; @docsEditable true
+  @DocsEditable @DomName('SVGFEImageElement.href')
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1977,36 +2053,37 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEMergeElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEMergeElement')
 class FEMergeElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEMergeElement" {
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFEMergeElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFEMergeElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFEMergeElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFEMergeElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFEMergeElement.y')
   final AnimatedLength y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFEMergeElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2014,10 +2091,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEMergeNodeElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEMergeNodeElement')
 class FEMergeNodeElement extends SvgElement native "*SVGFEMergeNodeElement" {
 
-  /// @domName SVGFEMergeNodeElement.in1; @docsEditable true
+  @DocsEditable @DomName('SVGFEMergeNodeElement.in1')
   final AnimatedString in1;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2025,7 +2104,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEMorphologyElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEMorphologyElement')
 class FEMorphologyElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEMorphologyElement" {
 
   static const int SVG_MORPHOLOGY_OPERATOR_DILATE = 2;
@@ -2034,48 +2115,47 @@
 
   static const int SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
 
-  /// @domName SVGFEMorphologyElement.in1; @docsEditable true
+  @DocsEditable @DomName('SVGFEMorphologyElement.in1')
   final AnimatedString in1;
 
-  /// @domName SVGFEMorphologyElement.operator; @docsEditable true
+  @DocsEditable @DomName('SVGFEMorphologyElement.operator')
   final AnimatedEnumeration operator;
 
-  /// @domName SVGFEMorphologyElement.radiusX; @docsEditable true
+  @DocsEditable @DomName('SVGFEMorphologyElement.radiusX')
   final AnimatedNumber radiusX;
 
-  /// @domName SVGFEMorphologyElement.radiusY; @docsEditable true
+  @DocsEditable @DomName('SVGFEMorphologyElement.radiusY')
   final AnimatedNumber radiusY;
 
-  /// @domName SVGFEMorphologyElement.setRadius; @docsEditable true
+  @DocsEditable @DomName('SVGFEMorphologyElement.setRadius')
   void setRadius(num radiusX, num radiusY) native;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFEMorphologyElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFEMorphologyElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFEMorphologyElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFEMorphologyElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFEMorphologyElement.y')
   final AnimatedLength y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFEMorphologyElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2083,45 +2163,46 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEOffsetElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEOffsetElement')
 class FEOffsetElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEOffsetElement" {
 
-  /// @domName SVGFEOffsetElement.dx; @docsEditable true
+  @DocsEditable @DomName('SVGFEOffsetElement.dx')
   final AnimatedNumber dx;
 
-  /// @domName SVGFEOffsetElement.dy; @docsEditable true
+  @DocsEditable @DomName('SVGFEOffsetElement.dy')
   final AnimatedNumber dy;
 
-  /// @domName SVGFEOffsetElement.in1; @docsEditable true
+  @DocsEditable @DomName('SVGFEOffsetElement.in1')
   final AnimatedString in1;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFEOffsetElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFEOffsetElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFEOffsetElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFEOffsetElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFEOffsetElement.y')
   final AnimatedLength y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFEOffsetElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2129,16 +2210,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEPointLightElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFEPointLightElement')
 class FEPointLightElement extends SvgElement native "*SVGFEPointLightElement" {
 
-  /// @domName SVGFEPointLightElement.x; @docsEditable true
+  @DocsEditable @DomName('SVGFEPointLightElement.x')
   final AnimatedNumber x;
 
-  /// @domName SVGFEPointLightElement.y; @docsEditable true
+  @DocsEditable @DomName('SVGFEPointLightElement.y')
   final AnimatedNumber y;
 
-  /// @domName SVGFEPointLightElement.z; @docsEditable true
+  @DocsEditable @DomName('SVGFEPointLightElement.z')
   final AnimatedNumber z;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2146,48 +2229,49 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFESpecularLightingElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFESpecularLightingElement')
 class FESpecularLightingElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFESpecularLightingElement" {
 
-  /// @domName SVGFESpecularLightingElement.in1; @docsEditable true
+  @DocsEditable @DomName('SVGFESpecularLightingElement.in1')
   final AnimatedString in1;
 
-  /// @domName SVGFESpecularLightingElement.specularConstant; @docsEditable true
+  @DocsEditable @DomName('SVGFESpecularLightingElement.specularConstant')
   final AnimatedNumber specularConstant;
 
-  /// @domName SVGFESpecularLightingElement.specularExponent; @docsEditable true
+  @DocsEditable @DomName('SVGFESpecularLightingElement.specularExponent')
   final AnimatedNumber specularExponent;
 
-  /// @domName SVGFESpecularLightingElement.surfaceScale; @docsEditable true
+  @DocsEditable @DomName('SVGFESpecularLightingElement.surfaceScale')
   final AnimatedNumber surfaceScale;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFESpecularLightingElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFESpecularLightingElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFESpecularLightingElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFESpecularLightingElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFESpecularLightingElement.y')
   final AnimatedLength y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFESpecularLightingElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2195,31 +2279,33 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFESpotLightElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFESpotLightElement')
 class FESpotLightElement extends SvgElement native "*SVGFESpotLightElement" {
 
-  /// @domName SVGFESpotLightElement.limitingConeAngle; @docsEditable true
+  @DocsEditable @DomName('SVGFESpotLightElement.limitingConeAngle')
   final AnimatedNumber limitingConeAngle;
 
-  /// @domName SVGFESpotLightElement.pointsAtX; @docsEditable true
+  @DocsEditable @DomName('SVGFESpotLightElement.pointsAtX')
   final AnimatedNumber pointsAtX;
 
-  /// @domName SVGFESpotLightElement.pointsAtY; @docsEditable true
+  @DocsEditable @DomName('SVGFESpotLightElement.pointsAtY')
   final AnimatedNumber pointsAtY;
 
-  /// @domName SVGFESpotLightElement.pointsAtZ; @docsEditable true
+  @DocsEditable @DomName('SVGFESpotLightElement.pointsAtZ')
   final AnimatedNumber pointsAtZ;
 
-  /// @domName SVGFESpotLightElement.specularExponent; @docsEditable true
+  @DocsEditable @DomName('SVGFESpotLightElement.specularExponent')
   final AnimatedNumber specularExponent;
 
-  /// @domName SVGFESpotLightElement.x; @docsEditable true
+  @DocsEditable @DomName('SVGFESpotLightElement.x')
   final AnimatedNumber x;
 
-  /// @domName SVGFESpotLightElement.y; @docsEditable true
+  @DocsEditable @DomName('SVGFESpotLightElement.y')
   final AnimatedNumber y;
 
-  /// @domName SVGFESpotLightElement.z; @docsEditable true
+  @DocsEditable @DomName('SVGFESpotLightElement.z')
   final AnimatedNumber z;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2227,39 +2313,40 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFETileElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFETileElement')
 class FETileElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFETileElement" {
 
-  /// @domName SVGFETileElement.in1; @docsEditable true
+  @DocsEditable @DomName('SVGFETileElement.in1')
   final AnimatedString in1;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFETileElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFETileElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFETileElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFETileElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFETileElement.y')
   final AnimatedLength y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFETileElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2267,7 +2354,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFETurbulenceElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFETurbulenceElement')
 class FETurbulenceElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFETurbulenceElement" {
 
   static const int SVG_STITCHTYPE_NOSTITCH = 2;
@@ -2282,51 +2371,50 @@
 
   static const int SVG_TURBULENCE_TYPE_UNKNOWN = 0;
 
-  /// @domName SVGFETurbulenceElement.baseFrequencyX; @docsEditable true
+  @DocsEditable @DomName('SVGFETurbulenceElement.baseFrequencyX')
   final AnimatedNumber baseFrequencyX;
 
-  /// @domName SVGFETurbulenceElement.baseFrequencyY; @docsEditable true
+  @DocsEditable @DomName('SVGFETurbulenceElement.baseFrequencyY')
   final AnimatedNumber baseFrequencyY;
 
-  /// @domName SVGFETurbulenceElement.numOctaves; @docsEditable true
+  @DocsEditable @DomName('SVGFETurbulenceElement.numOctaves')
   final AnimatedInteger numOctaves;
 
-  /// @domName SVGFETurbulenceElement.seed; @docsEditable true
+  @DocsEditable @DomName('SVGFETurbulenceElement.seed')
   final AnimatedNumber seed;
 
-  /// @domName SVGFETurbulenceElement.stitchTiles; @docsEditable true
+  @DocsEditable @DomName('SVGFETurbulenceElement.stitchTiles')
   final AnimatedEnumeration stitchTiles;
 
-  /// @domName SVGFETurbulenceElement.type; @docsEditable true
+  @DocsEditable @DomName('SVGFETurbulenceElement.type')
   final AnimatedEnumeration type;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  @DocsEditable @DomName('SVGFETurbulenceElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  @DocsEditable @DomName('SVGFETurbulenceElement.result')
   final AnimatedString result;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  @DocsEditable @DomName('SVGFETurbulenceElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  @DocsEditable @DomName('SVGFETurbulenceElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  @DocsEditable @DomName('SVGFETurbulenceElement.y')
   final AnimatedLength y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFETurbulenceElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2334,67 +2422,68 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFilterElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFilterElement')
 class FilterElement extends SvgElement implements UriReference, ExternalResourcesRequired, Stylable, LangSpace native "*SVGFilterElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory FilterElement() => _SvgElementFactoryProvider.createSvgElement_tag("filter");
 
-  /// @domName SVGFilterElement.filterResX; @docsEditable true
+  @DocsEditable @DomName('SVGFilterElement.filterResX')
   final AnimatedInteger filterResX;
 
-  /// @domName SVGFilterElement.filterResY; @docsEditable true
+  @DocsEditable @DomName('SVGFilterElement.filterResY')
   final AnimatedInteger filterResY;
 
-  /// @domName SVGFilterElement.filterUnits; @docsEditable true
+  @DocsEditable @DomName('SVGFilterElement.filterUnits')
   final AnimatedEnumeration filterUnits;
 
-  /// @domName SVGFilterElement.height; @docsEditable true
+  @DocsEditable @DomName('SVGFilterElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGFilterElement.primitiveUnits; @docsEditable true
+  @DocsEditable @DomName('SVGFilterElement.primitiveUnits')
   final AnimatedEnumeration primitiveUnits;
 
-  /// @domName SVGFilterElement.width; @docsEditable true
+  @DocsEditable @DomName('SVGFilterElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGFilterElement.x; @docsEditable true
+  @DocsEditable @DomName('SVGFilterElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGFilterElement.y; @docsEditable true
+  @DocsEditable @DomName('SVGFilterElement.y')
   final AnimatedLength y;
 
-  /// @domName SVGFilterElement.setFilterRes; @docsEditable true
+  @DocsEditable @DomName('SVGFilterElement.setFilterRes')
   void setFilterRes(int filterResX, int filterResY) native;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGFilterElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGFilterElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGFilterElement.xmlspace')
   String xmlspace;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGFilterElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGURIReference
 
-  /// @domName SVGURIReference.href; @docsEditable true
+  @DocsEditable @DomName('SVGFilterElement.href')
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2402,7 +2491,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFilterPrimitiveStandardAttributes
+@DocsEditable
+@DomName('SVGFilterPrimitiveStandardAttributes')
 abstract class FilterPrimitiveStandardAttributes implements Stylable {
 
   AnimatedLength height;
@@ -2421,7 +2511,6 @@
 
   CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CssValue getPresentationAttribute(String name);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2429,7 +2518,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFitToViewBox
+@DocsEditable
+@DomName('SVGFitToViewBox')
 abstract class FitToViewBox {
 
   AnimatedPreserveAspectRatio preserveAspectRatio;
@@ -2441,10 +2531,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFontElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFontElement')
 class FontElement extends SvgElement native "*SVGFontElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory FontElement() => _SvgElementFactoryProvider.createSvgElement_tag("font");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2452,10 +2544,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFontFaceElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFontFaceElement')
 class FontFaceElement extends SvgElement native "*SVGFontFaceElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory FontFaceElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2463,10 +2557,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFontFaceFormatElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFontFaceFormatElement')
 class FontFaceFormatElement extends SvgElement native "*SVGFontFaceFormatElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory FontFaceFormatElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face-format");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2474,10 +2570,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFontFaceNameElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFontFaceNameElement')
 class FontFaceNameElement extends SvgElement native "*SVGFontFaceNameElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory FontFaceNameElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face-name");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2485,10 +2583,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFontFaceSrcElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFontFaceSrcElement')
 class FontFaceSrcElement extends SvgElement native "*SVGFontFaceSrcElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory FontFaceSrcElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face-src");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2496,10 +2596,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFontFaceUriElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGFontFaceUriElement')
 class FontFaceUriElement extends SvgElement native "*SVGFontFaceUriElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory FontFaceUriElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face-uri");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2507,88 +2609,89 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGForeignObjectElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGForeignObjectElement')
 class ForeignObjectElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGForeignObjectElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory ForeignObjectElement() => _SvgElementFactoryProvider.createSvgElement_tag("foreignObject");
 
-  /// @domName SVGForeignObjectElement.height; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGForeignObjectElement.width; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGForeignObjectElement.x; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGForeignObjectElement.y; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.y')
   final AnimatedLength y;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.xmlspace')
   String xmlspace;
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGForeignObjectElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGForeignObjectElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /// @domName SVGTransformable.transform; @docsEditable true
+  @DocsEditable @DomName('SVGForeignObjectElement.transform')
   final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2596,76 +2699,77 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGGElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGGElement')
 class GElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGGElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory GElement() => _SvgElementFactoryProvider.createSvgElement_tag("g");
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGGElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGGElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGGElement.xmlspace')
   String xmlspace;
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGGElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGGElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGGElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGGElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGGElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGGElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGGElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGGElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGGElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGGElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGGElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /// @domName SVGTransformable.transform; @docsEditable true
+  @DocsEditable @DomName('SVGGElement.transform')
   final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2673,10 +2777,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGGlyphElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGGlyphElement')
 class GlyphElement extends SvgElement native "*SVGGlyphElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory GlyphElement() => _SvgElementFactoryProvider.createSvgElement_tag("glyph");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2684,42 +2790,43 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGGlyphRefElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGGlyphRefElement')
 class GlyphRefElement extends SvgElement implements UriReference, Stylable native "*SVGGlyphRefElement" {
 
-  /// @domName SVGGlyphRefElement.dx; @docsEditable true
+  @DocsEditable @DomName('SVGGlyphRefElement.dx')
   num dx;
 
-  /// @domName SVGGlyphRefElement.dy; @docsEditable true
+  @DocsEditable @DomName('SVGGlyphRefElement.dy')
   num dy;
 
-  /// @domName SVGGlyphRefElement.format; @docsEditable true
+  @DocsEditable @DomName('SVGGlyphRefElement.format')
   String format;
 
-  /// @domName SVGGlyphRefElement.glyphRef; @docsEditable true
+  @DocsEditable @DomName('SVGGlyphRefElement.glyphRef')
   String glyphRef;
 
-  /// @domName SVGGlyphRefElement.x; @docsEditable true
+  @DocsEditable @DomName('SVGGlyphRefElement.x')
   num x;
 
-  /// @domName SVGGlyphRefElement.y; @docsEditable true
+  @DocsEditable @DomName('SVGGlyphRefElement.y')
   num y;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGGlyphRefElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGURIReference
 
-  /// @domName SVGURIReference.href; @docsEditable true
+  @DocsEditable @DomName('SVGGlyphRefElement.href')
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2727,7 +2834,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGGradientElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGGradientElement')
 class GradientElement extends SvgElement implements UriReference, ExternalResourcesRequired, Stylable native "*SVGGradientElement" {
 
   static const int SVG_SPREADMETHOD_PAD = 1;
@@ -2738,35 +2847,34 @@
 
   static const int SVG_SPREADMETHOD_UNKNOWN = 0;
 
-  /// @domName SVGGradientElement.gradientTransform; @docsEditable true
+  @DocsEditable @DomName('SVGGradientElement.gradientTransform')
   final AnimatedTransformList gradientTransform;
 
-  /// @domName SVGGradientElement.gradientUnits; @docsEditable true
+  @DocsEditable @DomName('SVGGradientElement.gradientUnits')
   final AnimatedEnumeration gradientUnits;
 
-  /// @domName SVGGradientElement.spreadMethod; @docsEditable true
+  @DocsEditable @DomName('SVGGradientElement.spreadMethod')
   final AnimatedEnumeration spreadMethod;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGGradientElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGGradientElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGURIReference
 
-  /// @domName SVGURIReference.href; @docsEditable true
+  @DocsEditable @DomName('SVGGradientElement.href')
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2774,10 +2882,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGHKernElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGHKernElement')
 class HKernElement extends SvgElement native "*SVGHKernElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory HKernElement() => _SvgElementFactoryProvider.createSvgElement_tag("hkern");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2785,96 +2895,97 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGImageElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGImageElement')
 class ImageElement extends SvgElement implements Transformable, Tests, UriReference, Stylable, ExternalResourcesRequired, LangSpace native "*SVGImageElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory ImageElement() => _SvgElementFactoryProvider.createSvgElement_tag("image");
 
-  /// @domName SVGImageElement.height; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGImageElement.preserveAspectRatio; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.preserveAspectRatio')
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  /// @domName SVGImageElement.width; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGImageElement.x; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGImageElement.y; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.y')
   final AnimatedLength y;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.xmlspace')
   String xmlspace;
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGImageElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGImageElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /// @domName SVGTransformable.transform; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.transform')
   final AnimatedTransformList transform;
 
   // From SVGURIReference
 
-  /// @domName SVGURIReference.href; @docsEditable true
+  @DocsEditable @DomName('SVGImageElement.href')
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2882,7 +2993,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGLangSpace
+@DocsEditable
+@DomName('SVGLangSpace')
 abstract class LangSpace {
 
   String xmllang;
@@ -2894,7 +3006,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGLength; @docsEditable true
+
+@DocsEditable
+@DomName('SVGLength')
 class Length native "*SVGLength" {
 
   static const int SVG_LENGTHTYPE_CM = 6;
@@ -2919,22 +3033,22 @@
 
   static const int SVG_LENGTHTYPE_UNKNOWN = 0;
 
-  /// @domName SVGLength.unitType; @docsEditable true
+  @DocsEditable @DomName('SVGLength.unitType')
   final int unitType;
 
-  /// @domName SVGLength.value; @docsEditable true
+  @DocsEditable @DomName('SVGLength.value')
   num value;
 
-  /// @domName SVGLength.valueAsString; @docsEditable true
+  @DocsEditable @DomName('SVGLength.valueAsString')
   String valueAsString;
 
-  /// @domName SVGLength.valueInSpecifiedUnits; @docsEditable true
+  @DocsEditable @DomName('SVGLength.valueInSpecifiedUnits')
   num valueInSpecifiedUnits;
 
-  /// @domName SVGLength.convertToSpecifiedUnits; @docsEditable true
+  @DocsEditable @DomName('SVGLength.convertToSpecifiedUnits')
   void convertToSpecifiedUnits(int unitType) native;
 
-  /// @domName SVGLength.newValueSpecifiedUnits; @docsEditable true
+  @DocsEditable @DomName('SVGLength.newValueSpecifiedUnits')
   void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2942,10 +3056,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGLengthList; @docsEditable true
+
+@DocsEditable
+@DomName('SVGLengthList')
 class LengthList implements JavaScriptIndexingBehavior, List<Length> native "*SVGLengthList" {
 
-  /// @domName SVGLengthList.numberOfItems; @docsEditable true
+  @DocsEditable @DomName('SVGLengthList.numberOfItems')
   final int numberOfItems;
 
   Length operator[](int index) => JS("Length", "#[#]", this, index);
@@ -2968,50 +3084,50 @@
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Length)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Length element) => Collections.contains(this, element);
+  bool contains(Length element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Length element)) => Collections.forEach(this, f);
+  void forEach(void f(Length element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Length element)) => new MappedList<Length, dynamic>(this, f);
+  List mappedBy(f(Length element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Length> where(bool f(Length element)) => new WhereIterable<Length>(this, f);
+  Iterable<Length> where(bool f(Length element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Length element)) => Collections.every(this, f);
+  bool every(bool f(Length element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Length element)) => Collections.any(this, f);
+  bool any(bool f(Length element)) => IterableMixinWorkaround.any(this, f);
 
   List<Length> toList() => new List<Length>.from(this);
   Set<Length> toSet() => new Set<Length>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Length> take(int n) => new ListView<Length>(this, 0, n);
+  List<Length> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Length> takeWhile(bool test(Length value)) {
-    return new TakeWhileIterable<Length>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Length> skip(int n) => new ListView<Length>(this, n, null);
+  List<Length> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Length> skipWhile(bool test(Length value)) {
-    return new SkipWhileIterable<Length>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Length firstMatching(bool test(Length value), { Length orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Length lastMatching(bool test(Length value), {Length orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Length singleMatching(bool test(Length value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Length elementAt(int index) {
@@ -3037,7 +3153,7 @@
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
-  // contains() defined by IDL.
+  // clear() defined by IDL.
 
   void sort([int compare(Length a, Length b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
@@ -3067,16 +3183,36 @@
     throw new StateError("More than one element");
   }
 
-  Length min([int compare(Length a, Length b)]) => Collections.min(this, compare);
+  Length min([int compare(Length a, Length b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Length max([int compare(Length a, Length b)]) => Collections.max(this, compare);
+  Length max([int compare(Length a, Length b)]) => IterableMixinWorkaround.max(this, compare);
 
   Length removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Length removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Length element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Length element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Length> from, [int startFrom]) {
@@ -3096,25 +3232,25 @@
 
   // -- end List<Length> mixins.
 
-  /// @domName SVGLengthList.appendItem; @docsEditable true
+  @DocsEditable @DomName('SVGLengthList.appendItem')
   Length appendItem(Length item) native;
 
-  /// @domName SVGLengthList.clear; @docsEditable true
+  @DocsEditable @DomName('SVGLengthList.clear')
   void clear() native;
 
-  /// @domName SVGLengthList.getItem; @docsEditable true
+  @DocsEditable @DomName('SVGLengthList.getItem')
   Length getItem(int index) native;
 
-  /// @domName SVGLengthList.initialize; @docsEditable true
+  @DocsEditable @DomName('SVGLengthList.initialize')
   Length initialize(Length item) native;
 
-  /// @domName SVGLengthList.insertItemBefore; @docsEditable true
+  @DocsEditable @DomName('SVGLengthList.insertItemBefore')
   Length insertItemBefore(Length item, int index) native;
 
-  /// @domName SVGLengthList.removeItem; @docsEditable true
+  @DocsEditable @DomName('SVGLengthList.removeItem')
   Length removeItem(int index) native;
 
-  /// @domName SVGLengthList.replaceItem; @docsEditable true
+  @DocsEditable @DomName('SVGLengthList.replaceItem')
   Length replaceItem(Length item, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3122,88 +3258,89 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGLineElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGLineElement')
 class LineElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGLineElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory LineElement() => _SvgElementFactoryProvider.createSvgElement_tag("line");
 
-  /// @domName SVGLineElement.x1; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.x1')
   final AnimatedLength x1;
 
-  /// @domName SVGLineElement.x2; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.x2')
   final AnimatedLength x2;
 
-  /// @domName SVGLineElement.y1; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.y1')
   final AnimatedLength y1;
 
-  /// @domName SVGLineElement.y2; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.y2')
   final AnimatedLength y2;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.xmlspace')
   String xmlspace;
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGLineElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGLineElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /// @domName SVGTransformable.transform; @docsEditable true
+  @DocsEditable @DomName('SVGLineElement.transform')
   final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3211,22 +3348,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGLinearGradientElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGLinearGradientElement')
 class LinearGradientElement extends GradientElement native "*SVGLinearGradientElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory LinearGradientElement() => _SvgElementFactoryProvider.createSvgElement_tag("linearGradient");
 
-  /// @domName SVGLinearGradientElement.x1; @docsEditable true
+  @DocsEditable @DomName('SVGLinearGradientElement.x1')
   final AnimatedLength x1;
 
-  /// @domName SVGLinearGradientElement.x2; @docsEditable true
+  @DocsEditable @DomName('SVGLinearGradientElement.x2')
   final AnimatedLength x2;
 
-  /// @domName SVGLinearGradientElement.y1; @docsEditable true
+  @DocsEditable @DomName('SVGLinearGradientElement.y1')
   final AnimatedLength y1;
 
-  /// @domName SVGLinearGradientElement.y2; @docsEditable true
+  @DocsEditable @DomName('SVGLinearGradientElement.y2')
   final AnimatedLength y2;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3234,23 +3373,20 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGLocatable
+@DocsEditable
+@DomName('SVGLocatable')
 abstract class Locatable {
 
   SvgElement farthestViewportElement;
 
   SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
   Rect getBBox();
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   Matrix getCTM();
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   Matrix getScreenCTM();
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3258,20 +3394,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGMPathElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGMPathElement')
 class MPathElement extends SvgElement implements UriReference, ExternalResourcesRequired native "*SVGMPathElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory MPathElement() => _SvgElementFactoryProvider.createSvgElement_tag("mpath");
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGMPathElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGURIReference
 
-  /// @domName SVGURIReference.href; @docsEditable true
+  @DocsEditable @DomName('SVGMPathElement.href')
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3279,10 +3417,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGMarkerElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGMarkerElement')
 class MarkerElement extends SvgElement implements FitToViewBox, ExternalResourcesRequired, Stylable, LangSpace native "*SVGMarkerElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory MarkerElement() => _SvgElementFactoryProvider.createSvgElement_tag("marker");
 
   static const int SVG_MARKERUNITS_STROKEWIDTH = 2;
@@ -3297,64 +3437,63 @@
 
   static const int SVG_MARKER_ORIENT_UNKNOWN = 0;
 
-  /// @domName SVGMarkerElement.markerHeight; @docsEditable true
+  @DocsEditable @DomName('SVGMarkerElement.markerHeight')
   final AnimatedLength markerHeight;
 
-  /// @domName SVGMarkerElement.markerUnits; @docsEditable true
+  @DocsEditable @DomName('SVGMarkerElement.markerUnits')
   final AnimatedEnumeration markerUnits;
 
-  /// @domName SVGMarkerElement.markerWidth; @docsEditable true
+  @DocsEditable @DomName('SVGMarkerElement.markerWidth')
   final AnimatedLength markerWidth;
 
-  /// @domName SVGMarkerElement.orientAngle; @docsEditable true
+  @DocsEditable @DomName('SVGMarkerElement.orientAngle')
   final AnimatedAngle orientAngle;
 
-  /// @domName SVGMarkerElement.orientType; @docsEditable true
+  @DocsEditable @DomName('SVGMarkerElement.orientType')
   final AnimatedEnumeration orientType;
 
-  /// @domName SVGMarkerElement.refX; @docsEditable true
+  @DocsEditable @DomName('SVGMarkerElement.refX')
   final AnimatedLength refX;
 
-  /// @domName SVGMarkerElement.refY; @docsEditable true
+  @DocsEditable @DomName('SVGMarkerElement.refY')
   final AnimatedLength refY;
 
-  /// @domName SVGMarkerElement.setOrientToAngle; @docsEditable true
+  @DocsEditable @DomName('SVGMarkerElement.setOrientToAngle')
   void setOrientToAngle(Angle angle) native;
 
-  /// @domName SVGMarkerElement.setOrientToAuto; @docsEditable true
+  @DocsEditable @DomName('SVGMarkerElement.setOrientToAuto')
   void setOrientToAuto() native;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGMarkerElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGFitToViewBox
 
-  /// @domName SVGFitToViewBox.preserveAspectRatio; @docsEditable true
+  @DocsEditable @DomName('SVGMarkerElement.preserveAspectRatio')
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  /// @domName SVGFitToViewBox.viewBox; @docsEditable true
+  @DocsEditable @DomName('SVGMarkerElement.viewBox')
   final AnimatedRect viewBox;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGMarkerElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGMarkerElement.xmlspace')
   String xmlspace;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGMarkerElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3362,67 +3501,68 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGMaskElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGMaskElement')
 class MaskElement extends SvgElement implements Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGMaskElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory MaskElement() => _SvgElementFactoryProvider.createSvgElement_tag("mask");
 
-  /// @domName SVGMaskElement.height; @docsEditable true
+  @DocsEditable @DomName('SVGMaskElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGMaskElement.maskContentUnits; @docsEditable true
+  @DocsEditable @DomName('SVGMaskElement.maskContentUnits')
   final AnimatedEnumeration maskContentUnits;
 
-  /// @domName SVGMaskElement.maskUnits; @docsEditable true
+  @DocsEditable @DomName('SVGMaskElement.maskUnits')
   final AnimatedEnumeration maskUnits;
 
-  /// @domName SVGMaskElement.width; @docsEditable true
+  @DocsEditable @DomName('SVGMaskElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGMaskElement.x; @docsEditable true
+  @DocsEditable @DomName('SVGMaskElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGMaskElement.y; @docsEditable true
+  @DocsEditable @DomName('SVGMaskElement.y')
   final AnimatedLength y;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGMaskElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGMaskElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGMaskElement.xmlspace')
   String xmlspace;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGMaskElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGMaskElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGMaskElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGMaskElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGMaskElement.hasExtension')
   bool hasExtension(String extension) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3430,58 +3570,60 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGMatrix; @docsEditable true
+
+@DocsEditable
+@DomName('SVGMatrix')
 class Matrix native "*SVGMatrix" {
 
-  /// @domName SVGMatrix.a; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.a')
   num a;
 
-  /// @domName SVGMatrix.b; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.b')
   num b;
 
-  /// @domName SVGMatrix.c; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.c')
   num c;
 
-  /// @domName SVGMatrix.d; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.d')
   num d;
 
-  /// @domName SVGMatrix.e; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.e')
   num e;
 
-  /// @domName SVGMatrix.f; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.f')
   num f;
 
-  /// @domName SVGMatrix.flipX; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.flipX')
   Matrix flipX() native;
 
-  /// @domName SVGMatrix.flipY; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.flipY')
   Matrix flipY() native;
 
-  /// @domName SVGMatrix.inverse; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.inverse')
   Matrix inverse() native;
 
-  /// @domName SVGMatrix.multiply; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.multiply')
   Matrix multiply(Matrix secondMatrix) native;
 
-  /// @domName SVGMatrix.rotate; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.rotate')
   Matrix rotate(num angle) native;
 
-  /// @domName SVGMatrix.rotateFromVector; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.rotateFromVector')
   Matrix rotateFromVector(num x, num y) native;
 
-  /// @domName SVGMatrix.scale; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.scale')
   Matrix scale(num scaleFactor) native;
 
-  /// @domName SVGMatrix.scaleNonUniform; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.scaleNonUniform')
   Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) native;
 
-  /// @domName SVGMatrix.skewX; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.skewX')
   Matrix skewX(num angle) native;
 
-  /// @domName SVGMatrix.skewY; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.skewY')
   Matrix skewY(num angle) native;
 
-  /// @domName SVGMatrix.translate; @docsEditable true
+  @DocsEditable @DomName('SVGMatrix.translate')
   Matrix translate(num x, num y) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3489,7 +3631,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGMetadataElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGMetadataElement')
 class MetadataElement extends SvgElement native "*SVGMetadataElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3497,7 +3641,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGMissingGlyphElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGMissingGlyphElement')
 class MissingGlyphElement extends SvgElement native "*SVGMissingGlyphElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3505,10 +3651,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGNumber; @docsEditable true
+
+@DocsEditable
+@DomName('SVGNumber')
 class Number native "*SVGNumber" {
 
-  /// @domName SVGNumber.value; @docsEditable true
+  @DocsEditable @DomName('SVGNumber.value')
   num value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3516,10 +3664,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGNumberList; @docsEditable true
+
+@DocsEditable
+@DomName('SVGNumberList')
 class NumberList implements JavaScriptIndexingBehavior, List<Number> native "*SVGNumberList" {
 
-  /// @domName SVGNumberList.numberOfItems; @docsEditable true
+  @DocsEditable @DomName('SVGNumberList.numberOfItems')
   final int numberOfItems;
 
   Number operator[](int index) => JS("Number", "#[#]", this, index);
@@ -3542,50 +3692,50 @@
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Number)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Number element) => Collections.contains(this, element);
+  bool contains(Number element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Number element)) => Collections.forEach(this, f);
+  void forEach(void f(Number element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Number element)) => new MappedList<Number, dynamic>(this, f);
+  List mappedBy(f(Number element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Number> where(bool f(Number element)) => new WhereIterable<Number>(this, f);
+  Iterable<Number> where(bool f(Number element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Number element)) => Collections.every(this, f);
+  bool every(bool f(Number element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Number element)) => Collections.any(this, f);
+  bool any(bool f(Number element)) => IterableMixinWorkaround.any(this, f);
 
   List<Number> toList() => new List<Number>.from(this);
   Set<Number> toSet() => new Set<Number>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Number> take(int n) => new ListView<Number>(this, 0, n);
+  List<Number> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Number> takeWhile(bool test(Number value)) {
-    return new TakeWhileIterable<Number>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Number> skip(int n) => new ListView<Number>(this, n, null);
+  List<Number> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Number> skipWhile(bool test(Number value)) {
-    return new SkipWhileIterable<Number>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Number firstMatching(bool test(Number value), { Number orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Number lastMatching(bool test(Number value), {Number orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Number singleMatching(bool test(Number value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Number elementAt(int index) {
@@ -3611,7 +3761,7 @@
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
-  // contains() defined by IDL.
+  // clear() defined by IDL.
 
   void sort([int compare(Number a, Number b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
@@ -3641,16 +3791,36 @@
     throw new StateError("More than one element");
   }
 
-  Number min([int compare(Number a, Number b)]) => Collections.min(this, compare);
+  Number min([int compare(Number a, Number b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Number max([int compare(Number a, Number b)]) => Collections.max(this, compare);
+  Number max([int compare(Number a, Number b)]) => IterableMixinWorkaround.max(this, compare);
 
   Number removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Number removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Number element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Number element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Number> from, [int startFrom]) {
@@ -3670,25 +3840,25 @@
 
   // -- end List<Number> mixins.
 
-  /// @domName SVGNumberList.appendItem; @docsEditable true
+  @DocsEditable @DomName('SVGNumberList.appendItem')
   Number appendItem(Number item) native;
 
-  /// @domName SVGNumberList.clear; @docsEditable true
+  @DocsEditable @DomName('SVGNumberList.clear')
   void clear() native;
 
-  /// @domName SVGNumberList.getItem; @docsEditable true
+  @DocsEditable @DomName('SVGNumberList.getItem')
   Number getItem(int index) native;
 
-  /// @domName SVGNumberList.initialize; @docsEditable true
+  @DocsEditable @DomName('SVGNumberList.initialize')
   Number initialize(Number item) native;
 
-  /// @domName SVGNumberList.insertItemBefore; @docsEditable true
+  @DocsEditable @DomName('SVGNumberList.insertItemBefore')
   Number insertItemBefore(Number item, int index) native;
 
-  /// @domName SVGNumberList.removeItem; @docsEditable true
+  @DocsEditable @DomName('SVGNumberList.removeItem')
   Number removeItem(int index) native;
 
-  /// @domName SVGNumberList.replaceItem; @docsEditable true
+  @DocsEditable @DomName('SVGNumberList.replaceItem')
   Number replaceItem(Number item, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3696,7 +3866,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPaint; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPaint')
 class Paint extends Color native "*SVGPaint" {
 
   static const int SVG_PAINTTYPE_CURRENTCOLOR = 102;
@@ -3719,16 +3891,16 @@
 
   static const int SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR = 106;
 
-  /// @domName SVGPaint.paintType; @docsEditable true
+  @DocsEditable @DomName('SVGPaint.paintType')
   final int paintType;
 
-  /// @domName SVGPaint.uri; @docsEditable true
+  @DocsEditable @DomName('SVGPaint.uri')
   final String uri;
 
-  /// @domName SVGPaint.setPaint; @docsEditable true
+  @DocsEditable @DomName('SVGPaint.setPaint')
   void setPaint(int paintType, String uri, String rgbColor, String iccColor) native;
 
-  /// @domName SVGPaint.setUri; @docsEditable true
+  @DocsEditable @DomName('SVGPaint.setUri')
   void setUri(String uri) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3736,176 +3908,177 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathElement')
 class PathElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGPathElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory PathElement() => _SvgElementFactoryProvider.createSvgElement_tag("path");
 
-  /// @domName SVGPathElement.animatedNormalizedPathSegList; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.animatedNormalizedPathSegList')
   final PathSegList animatedNormalizedPathSegList;
 
-  /// @domName SVGPathElement.animatedPathSegList; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.animatedPathSegList')
   final PathSegList animatedPathSegList;
 
-  /// @domName SVGPathElement.normalizedPathSegList; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.normalizedPathSegList')
   final PathSegList normalizedPathSegList;
 
-  /// @domName SVGPathElement.pathLength; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.pathLength')
   final AnimatedNumber pathLength;
 
-  /// @domName SVGPathElement.pathSegList; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.pathSegList')
   final PathSegList pathSegList;
 
-  /// @domName SVGPathElement.createSVGPathSegArcAbs; @docsEditable true
   @JSName('createSVGPathSegArcAbs')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegArcAbs')
   PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native;
 
-  /// @domName SVGPathElement.createSVGPathSegArcRel; @docsEditable true
   @JSName('createSVGPathSegArcRel')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegArcRel')
   PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native;
 
-  /// @domName SVGPathElement.createSVGPathSegClosePath; @docsEditable true
   @JSName('createSVGPathSegClosePath')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegClosePath')
   PathSegClosePath createSvgPathSegClosePath() native;
 
-  /// @domName SVGPathElement.createSVGPathSegCurvetoCubicAbs; @docsEditable true
   @JSName('createSVGPathSegCurvetoCubicAbs')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegCurvetoCubicAbs')
   PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) native;
 
-  /// @domName SVGPathElement.createSVGPathSegCurvetoCubicRel; @docsEditable true
   @JSName('createSVGPathSegCurvetoCubicRel')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegCurvetoCubicRel')
   PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) native;
 
-  /// @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs; @docsEditable true
   @JSName('createSVGPathSegCurvetoCubicSmoothAbs')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs')
   PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) native;
 
-  /// @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel; @docsEditable true
   @JSName('createSVGPathSegCurvetoCubicSmoothRel')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel')
   PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) native;
 
-  /// @domName SVGPathElement.createSVGPathSegCurvetoQuadraticAbs; @docsEditable true
   @JSName('createSVGPathSegCurvetoQuadraticAbs')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticAbs')
   PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) native;
 
-  /// @domName SVGPathElement.createSVGPathSegCurvetoQuadraticRel; @docsEditable true
   @JSName('createSVGPathSegCurvetoQuadraticRel')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticRel')
   PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) native;
 
-  /// @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs; @docsEditable true
   @JSName('createSVGPathSegCurvetoQuadraticSmoothAbs')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs')
   PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) native;
 
-  /// @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel; @docsEditable true
   @JSName('createSVGPathSegCurvetoQuadraticSmoothRel')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel')
   PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) native;
 
-  /// @domName SVGPathElement.createSVGPathSegLinetoAbs; @docsEditable true
   @JSName('createSVGPathSegLinetoAbs')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegLinetoAbs')
   PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) native;
 
-  /// @domName SVGPathElement.createSVGPathSegLinetoHorizontalAbs; @docsEditable true
   @JSName('createSVGPathSegLinetoHorizontalAbs')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalAbs')
   PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) native;
 
-  /// @domName SVGPathElement.createSVGPathSegLinetoHorizontalRel; @docsEditable true
   @JSName('createSVGPathSegLinetoHorizontalRel')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalRel')
   PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) native;
 
-  /// @domName SVGPathElement.createSVGPathSegLinetoRel; @docsEditable true
   @JSName('createSVGPathSegLinetoRel')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegLinetoRel')
   PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) native;
 
-  /// @domName SVGPathElement.createSVGPathSegLinetoVerticalAbs; @docsEditable true
   @JSName('createSVGPathSegLinetoVerticalAbs')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegLinetoVerticalAbs')
   PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) native;
 
-  /// @domName SVGPathElement.createSVGPathSegLinetoVerticalRel; @docsEditable true
   @JSName('createSVGPathSegLinetoVerticalRel')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegLinetoVerticalRel')
   PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) native;
 
-  /// @domName SVGPathElement.createSVGPathSegMovetoAbs; @docsEditable true
   @JSName('createSVGPathSegMovetoAbs')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegMovetoAbs')
   PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) native;
 
-  /// @domName SVGPathElement.createSVGPathSegMovetoRel; @docsEditable true
   @JSName('createSVGPathSegMovetoRel')
+  @DocsEditable @DomName('SVGPathElement.createSVGPathSegMovetoRel')
   PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) native;
 
-  /// @domName SVGPathElement.getPathSegAtLength; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.getPathSegAtLength')
   int getPathSegAtLength(num distance) native;
 
-  /// @domName SVGPathElement.getPointAtLength; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.getPointAtLength')
   Point getPointAtLength(num distance) native;
 
-  /// @domName SVGPathElement.getTotalLength; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.getTotalLength')
   num getTotalLength() native;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.xmlspace')
   String xmlspace;
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGPathElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGPathElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /// @domName SVGTransformable.transform; @docsEditable true
+  @DocsEditable @DomName('SVGPathElement.transform')
   final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3913,7 +4086,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSeg; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSeg')
 class PathSeg native "*SVGPathSeg" {
 
   static const int PATHSEG_ARC_ABS = 10;
@@ -3956,10 +4131,10 @@
 
   static const int PATHSEG_UNKNOWN = 0;
 
-  /// @domName SVGPathSeg.pathSegType; @docsEditable true
+  @DocsEditable @DomName('SVGPathSeg.pathSegType')
   final int pathSegType;
 
-  /// @domName SVGPathSeg.pathSegTypeAsLetter; @docsEditable true
+  @DocsEditable @DomName('SVGPathSeg.pathSegTypeAsLetter')
   final String pathSegTypeAsLetter;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3967,28 +4142,30 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegArcAbs; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegArcAbs')
 class PathSegArcAbs extends PathSeg native "*SVGPathSegArcAbs" {
 
-  /// @domName SVGPathSegArcAbs.angle; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegArcAbs.angle')
   num angle;
 
-  /// @domName SVGPathSegArcAbs.largeArcFlag; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegArcAbs.largeArcFlag')
   bool largeArcFlag;
 
-  /// @domName SVGPathSegArcAbs.r1; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegArcAbs.r1')
   num r1;
 
-  /// @domName SVGPathSegArcAbs.r2; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegArcAbs.r2')
   num r2;
 
-  /// @domName SVGPathSegArcAbs.sweepFlag; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegArcAbs.sweepFlag')
   bool sweepFlag;
 
-  /// @domName SVGPathSegArcAbs.x; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegArcAbs.x')
   num x;
 
-  /// @domName SVGPathSegArcAbs.y; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegArcAbs.y')
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3996,28 +4173,30 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegArcRel; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegArcRel')
 class PathSegArcRel extends PathSeg native "*SVGPathSegArcRel" {
 
-  /// @domName SVGPathSegArcRel.angle; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegArcRel.angle')
   num angle;
 
-  /// @domName SVGPathSegArcRel.largeArcFlag; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegArcRel.largeArcFlag')
   bool largeArcFlag;
 
-  /// @domName SVGPathSegArcRel.r1; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegArcRel.r1')
   num r1;
 
-  /// @domName SVGPathSegArcRel.r2; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegArcRel.r2')
   num r2;
 
-  /// @domName SVGPathSegArcRel.sweepFlag; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegArcRel.sweepFlag')
   bool sweepFlag;
 
-  /// @domName SVGPathSegArcRel.x; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegArcRel.x')
   num x;
 
-  /// @domName SVGPathSegArcRel.y; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegArcRel.y')
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4025,7 +4204,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegClosePath; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegClosePath')
 class PathSegClosePath extends PathSeg native "*SVGPathSegClosePath" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4033,25 +4214,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegCurvetoCubicAbs; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegCurvetoCubicAbs')
 class PathSegCurvetoCubicAbs extends PathSeg native "*SVGPathSegCurvetoCubicAbs" {
 
-  /// @domName SVGPathSegCurvetoCubicAbs.x; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicAbs.x')
   num x;
 
-  /// @domName SVGPathSegCurvetoCubicAbs.x1; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicAbs.x1')
   num x1;
 
-  /// @domName SVGPathSegCurvetoCubicAbs.x2; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicAbs.x2')
   num x2;
 
-  /// @domName SVGPathSegCurvetoCubicAbs.y; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicAbs.y')
   num y;
 
-  /// @domName SVGPathSegCurvetoCubicAbs.y1; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicAbs.y1')
   num y1;
 
-  /// @domName SVGPathSegCurvetoCubicAbs.y2; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicAbs.y2')
   num y2;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4059,25 +4242,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegCurvetoCubicRel; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegCurvetoCubicRel')
 class PathSegCurvetoCubicRel extends PathSeg native "*SVGPathSegCurvetoCubicRel" {
 
-  /// @domName SVGPathSegCurvetoCubicRel.x; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicRel.x')
   num x;
 
-  /// @domName SVGPathSegCurvetoCubicRel.x1; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicRel.x1')
   num x1;
 
-  /// @domName SVGPathSegCurvetoCubicRel.x2; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicRel.x2')
   num x2;
 
-  /// @domName SVGPathSegCurvetoCubicRel.y; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicRel.y')
   num y;
 
-  /// @domName SVGPathSegCurvetoCubicRel.y1; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicRel.y1')
   num y1;
 
-  /// @domName SVGPathSegCurvetoCubicRel.y2; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicRel.y2')
   num y2;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4085,19 +4270,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegCurvetoCubicSmoothAbs; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegCurvetoCubicSmoothAbs')
 class PathSegCurvetoCubicSmoothAbs extends PathSeg native "*SVGPathSegCurvetoCubicSmoothAbs" {
 
-  /// @domName SVGPathSegCurvetoCubicSmoothAbs.x; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
   num x;
 
-  /// @domName SVGPathSegCurvetoCubicSmoothAbs.x2; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicSmoothAbs.x2')
   num x2;
 
-  /// @domName SVGPathSegCurvetoCubicSmoothAbs.y; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicSmoothAbs.y')
   num y;
 
-  /// @domName SVGPathSegCurvetoCubicSmoothAbs.y2; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicSmoothAbs.y2')
   num y2;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4105,19 +4292,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegCurvetoCubicSmoothRel; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegCurvetoCubicSmoothRel')
 class PathSegCurvetoCubicSmoothRel extends PathSeg native "*SVGPathSegCurvetoCubicSmoothRel" {
 
-  /// @domName SVGPathSegCurvetoCubicSmoothRel.x; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
   num x;
 
-  /// @domName SVGPathSegCurvetoCubicSmoothRel.x2; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicSmoothRel.x2')
   num x2;
 
-  /// @domName SVGPathSegCurvetoCubicSmoothRel.y; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicSmoothRel.y')
   num y;
 
-  /// @domName SVGPathSegCurvetoCubicSmoothRel.y2; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoCubicSmoothRel.y2')
   num y2;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4125,19 +4314,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegCurvetoQuadraticAbs; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegCurvetoQuadraticAbs')
 class PathSegCurvetoQuadraticAbs extends PathSeg native "*SVGPathSegCurvetoQuadraticAbs" {
 
-  /// @domName SVGPathSegCurvetoQuadraticAbs.x; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoQuadraticAbs.x')
   num x;
 
-  /// @domName SVGPathSegCurvetoQuadraticAbs.x1; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoQuadraticAbs.x1')
   num x1;
 
-  /// @domName SVGPathSegCurvetoQuadraticAbs.y; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoQuadraticAbs.y')
   num y;
 
-  /// @domName SVGPathSegCurvetoQuadraticAbs.y1; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoQuadraticAbs.y1')
   num y1;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4145,19 +4336,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegCurvetoQuadraticRel; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegCurvetoQuadraticRel')
 class PathSegCurvetoQuadraticRel extends PathSeg native "*SVGPathSegCurvetoQuadraticRel" {
 
-  /// @domName SVGPathSegCurvetoQuadraticRel.x; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoQuadraticRel.x')
   num x;
 
-  /// @domName SVGPathSegCurvetoQuadraticRel.x1; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoQuadraticRel.x1')
   num x1;
 
-  /// @domName SVGPathSegCurvetoQuadraticRel.y; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoQuadraticRel.y')
   num y;
 
-  /// @domName SVGPathSegCurvetoQuadraticRel.y1; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoQuadraticRel.y1')
   num y1;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4165,13 +4358,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegCurvetoQuadraticSmoothAbs; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegCurvetoQuadraticSmoothAbs')
 class PathSegCurvetoQuadraticSmoothAbs extends PathSeg native "*SVGPathSegCurvetoQuadraticSmoothAbs" {
 
-  /// @domName SVGPathSegCurvetoQuadraticSmoothAbs.x; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
   num x;
 
-  /// @domName SVGPathSegCurvetoQuadraticSmoothAbs.y; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.y')
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4179,13 +4374,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegCurvetoQuadraticSmoothRel; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegCurvetoQuadraticSmoothRel')
 class PathSegCurvetoQuadraticSmoothRel extends PathSeg native "*SVGPathSegCurvetoQuadraticSmoothRel" {
 
-  /// @domName SVGPathSegCurvetoQuadraticSmoothRel.x; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
   num x;
 
-  /// @domName SVGPathSegCurvetoQuadraticSmoothRel.y; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegCurvetoQuadraticSmoothRel.y')
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4193,13 +4390,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegLinetoAbs; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegLinetoAbs')
 class PathSegLinetoAbs extends PathSeg native "*SVGPathSegLinetoAbs" {
 
-  /// @domName SVGPathSegLinetoAbs.x; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegLinetoAbs.x')
   num x;
 
-  /// @domName SVGPathSegLinetoAbs.y; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegLinetoAbs.y')
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4207,10 +4406,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegLinetoHorizontalAbs; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegLinetoHorizontalAbs')
 class PathSegLinetoHorizontalAbs extends PathSeg native "*SVGPathSegLinetoHorizontalAbs" {
 
-  /// @domName SVGPathSegLinetoHorizontalAbs.x; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegLinetoHorizontalAbs.x')
   num x;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4218,10 +4419,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegLinetoHorizontalRel; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegLinetoHorizontalRel')
 class PathSegLinetoHorizontalRel extends PathSeg native "*SVGPathSegLinetoHorizontalRel" {
 
-  /// @domName SVGPathSegLinetoHorizontalRel.x; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegLinetoHorizontalRel.x')
   num x;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4229,13 +4432,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegLinetoRel; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegLinetoRel')
 class PathSegLinetoRel extends PathSeg native "*SVGPathSegLinetoRel" {
 
-  /// @domName SVGPathSegLinetoRel.x; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegLinetoRel.x')
   num x;
 
-  /// @domName SVGPathSegLinetoRel.y; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegLinetoRel.y')
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4243,10 +4448,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegLinetoVerticalAbs; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegLinetoVerticalAbs')
 class PathSegLinetoVerticalAbs extends PathSeg native "*SVGPathSegLinetoVerticalAbs" {
 
-  /// @domName SVGPathSegLinetoVerticalAbs.y; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegLinetoVerticalAbs.y')
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4254,10 +4461,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegLinetoVerticalRel; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegLinetoVerticalRel')
 class PathSegLinetoVerticalRel extends PathSeg native "*SVGPathSegLinetoVerticalRel" {
 
-  /// @domName SVGPathSegLinetoVerticalRel.y; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegLinetoVerticalRel.y')
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4265,10 +4474,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegList; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegList')
 class PathSegList implements JavaScriptIndexingBehavior, List<PathSeg> native "*SVGPathSegList" {
 
-  /// @domName SVGPathSegList.numberOfItems; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegList.numberOfItems')
   final int numberOfItems;
 
   PathSeg operator[](int index) => JS("PathSeg", "#[#]", this, index);
@@ -4291,50 +4502,50 @@
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, PathSeg)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(PathSeg element) => Collections.contains(this, element);
+  bool contains(PathSeg element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(PathSeg element)) => Collections.forEach(this, f);
+  void forEach(void f(PathSeg element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(PathSeg element)) => new MappedList<PathSeg, dynamic>(this, f);
+  List mappedBy(f(PathSeg element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<PathSeg> where(bool f(PathSeg element)) => new WhereIterable<PathSeg>(this, f);
+  Iterable<PathSeg> where(bool f(PathSeg element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(PathSeg element)) => Collections.every(this, f);
+  bool every(bool f(PathSeg element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(PathSeg element)) => Collections.any(this, f);
+  bool any(bool f(PathSeg element)) => IterableMixinWorkaround.any(this, f);
 
   List<PathSeg> toList() => new List<PathSeg>.from(this);
   Set<PathSeg> toSet() => new Set<PathSeg>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<PathSeg> take(int n) => new ListView<PathSeg>(this, 0, n);
+  List<PathSeg> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<PathSeg> takeWhile(bool test(PathSeg value)) {
-    return new TakeWhileIterable<PathSeg>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<PathSeg> skip(int n) => new ListView<PathSeg>(this, n, null);
+  List<PathSeg> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<PathSeg> skipWhile(bool test(PathSeg value)) {
-    return new SkipWhileIterable<PathSeg>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   PathSeg firstMatching(bool test(PathSeg value), { PathSeg orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   PathSeg lastMatching(bool test(PathSeg value), {PathSeg orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   PathSeg singleMatching(bool test(PathSeg value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   PathSeg elementAt(int index) {
@@ -4360,7 +4571,7 @@
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
-  // contains() defined by IDL.
+  // clear() defined by IDL.
 
   void sort([int compare(PathSeg a, PathSeg b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
@@ -4390,16 +4601,36 @@
     throw new StateError("More than one element");
   }
 
-  PathSeg min([int compare(PathSeg a, PathSeg b)]) => Collections.min(this, compare);
+  PathSeg min([int compare(PathSeg a, PathSeg b)]) => IterableMixinWorkaround.min(this, compare);
 
-  PathSeg max([int compare(PathSeg a, PathSeg b)]) => Collections.max(this, compare);
+  PathSeg max([int compare(PathSeg a, PathSeg b)]) => IterableMixinWorkaround.max(this, compare);
 
   PathSeg removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   PathSeg removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(PathSeg element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(PathSeg element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<PathSeg> from, [int startFrom]) {
@@ -4419,25 +4650,25 @@
 
   // -- end List<PathSeg> mixins.
 
-  /// @domName SVGPathSegList.appendItem; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegList.appendItem')
   PathSeg appendItem(PathSeg newItem) native;
 
-  /// @domName SVGPathSegList.clear; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegList.clear')
   void clear() native;
 
-  /// @domName SVGPathSegList.getItem; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegList.getItem')
   PathSeg getItem(int index) native;
 
-  /// @domName SVGPathSegList.initialize; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegList.initialize')
   PathSeg initialize(PathSeg newItem) native;
 
-  /// @domName SVGPathSegList.insertItemBefore; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegList.insertItemBefore')
   PathSeg insertItemBefore(PathSeg newItem, int index) native;
 
-  /// @domName SVGPathSegList.removeItem; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegList.removeItem')
   PathSeg removeItem(int index) native;
 
-  /// @domName SVGPathSegList.replaceItem; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegList.replaceItem')
   PathSeg replaceItem(PathSeg newItem, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4445,13 +4676,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegMovetoAbs; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegMovetoAbs')
 class PathSegMovetoAbs extends PathSeg native "*SVGPathSegMovetoAbs" {
 
-  /// @domName SVGPathSegMovetoAbs.x; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegMovetoAbs.x')
   num x;
 
-  /// @domName SVGPathSegMovetoAbs.y; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegMovetoAbs.y')
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4459,13 +4692,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegMovetoRel; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPathSegMovetoRel')
 class PathSegMovetoRel extends PathSeg native "*SVGPathSegMovetoRel" {
 
-  /// @domName SVGPathSegMovetoRel.x; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegMovetoRel.x')
   num x;
 
-  /// @domName SVGPathSegMovetoRel.y; @docsEditable true
+  @DocsEditable @DomName('SVGPathSegMovetoRel.y')
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4473,83 +4708,84 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPatternElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPatternElement')
 class PatternElement extends SvgElement implements FitToViewBox, Tests, UriReference, Stylable, ExternalResourcesRequired, LangSpace native "*SVGPatternElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory PatternElement() => _SvgElementFactoryProvider.createSvgElement_tag("pattern");
 
-  /// @domName SVGPatternElement.height; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGPatternElement.patternContentUnits; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.patternContentUnits')
   final AnimatedEnumeration patternContentUnits;
 
-  /// @domName SVGPatternElement.patternTransform; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.patternTransform')
   final AnimatedTransformList patternTransform;
 
-  /// @domName SVGPatternElement.patternUnits; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.patternUnits')
   final AnimatedEnumeration patternUnits;
 
-  /// @domName SVGPatternElement.width; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGPatternElement.x; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGPatternElement.y; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.y')
   final AnimatedLength y;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGFitToViewBox
 
-  /// @domName SVGFitToViewBox.preserveAspectRatio; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.preserveAspectRatio')
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  /// @domName SVGFitToViewBox.viewBox; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.viewBox')
   final AnimatedRect viewBox;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.xmlspace')
   String xmlspace;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGURIReference
 
-  /// @domName SVGURIReference.href; @docsEditable true
+  @DocsEditable @DomName('SVGPatternElement.href')
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4557,16 +4793,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPoint; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPoint')
 class Point native "*SVGPoint" {
 
-  /// @domName SVGPoint.x; @docsEditable true
+  @DocsEditable @DomName('SVGPoint.x')
   num x;
 
-  /// @domName SVGPoint.y; @docsEditable true
+  @DocsEditable @DomName('SVGPoint.y')
   num y;
 
-  /// @domName SVGPoint.matrixTransform; @docsEditable true
+  @DocsEditable @DomName('SVGPoint.matrixTransform')
   Point matrixTransform(Matrix matrix) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4574,31 +4812,33 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPointList; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPointList')
 class PointList native "*SVGPointList" {
 
-  /// @domName SVGPointList.numberOfItems; @docsEditable true
+  @DocsEditable @DomName('SVGPointList.numberOfItems')
   final int numberOfItems;
 
-  /// @domName SVGPointList.appendItem; @docsEditable true
+  @DocsEditable @DomName('SVGPointList.appendItem')
   Point appendItem(Point item) native;
 
-  /// @domName SVGPointList.clear; @docsEditable true
+  @DocsEditable @DomName('SVGPointList.clear')
   void clear() native;
 
-  /// @domName SVGPointList.getItem; @docsEditable true
+  @DocsEditable @DomName('SVGPointList.getItem')
   Point getItem(int index) native;
 
-  /// @domName SVGPointList.initialize; @docsEditable true
+  @DocsEditable @DomName('SVGPointList.initialize')
   Point initialize(Point item) native;
 
-  /// @domName SVGPointList.insertItemBefore; @docsEditable true
+  @DocsEditable @DomName('SVGPointList.insertItemBefore')
   Point insertItemBefore(Point item, int index) native;
 
-  /// @domName SVGPointList.removeItem; @docsEditable true
+  @DocsEditable @DomName('SVGPointList.removeItem')
   Point removeItem(int index) native;
 
-  /// @domName SVGPointList.replaceItem; @docsEditable true
+  @DocsEditable @DomName('SVGPointList.replaceItem')
   Point replaceItem(Point item, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4606,82 +4846,83 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPolygonElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPolygonElement')
 class PolygonElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGPolygonElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory PolygonElement() => _SvgElementFactoryProvider.createSvgElement_tag("polygon");
 
-  /// @domName SVGPolygonElement.animatedPoints; @docsEditable true
+  @DocsEditable @DomName('SVGPolygonElement.animatedPoints')
   final PointList animatedPoints;
 
-  /// @domName SVGPolygonElement.points; @docsEditable true
+  @DocsEditable @DomName('SVGPolygonElement.points')
   final PointList points;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGPolygonElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGPolygonElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGPolygonElement.xmlspace')
   String xmlspace;
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGPolygonElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGPolygonElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGPolygonElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGPolygonElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGPolygonElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGPolygonElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGPolygonElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGPolygonElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGPolygonElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGPolygonElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGPolygonElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /// @domName SVGTransformable.transform; @docsEditable true
+  @DocsEditable @DomName('SVGPolygonElement.transform')
   final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4689,82 +4930,83 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPolylineElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPolylineElement')
 class PolylineElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGPolylineElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory PolylineElement() => _SvgElementFactoryProvider.createSvgElement_tag("polyline");
 
-  /// @domName SVGPolylineElement.animatedPoints; @docsEditable true
+  @DocsEditable @DomName('SVGPolylineElement.animatedPoints')
   final PointList animatedPoints;
 
-  /// @domName SVGPolylineElement.points; @docsEditable true
+  @DocsEditable @DomName('SVGPolylineElement.points')
   final PointList points;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGPolylineElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGPolylineElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGPolylineElement.xmlspace')
   String xmlspace;
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGPolylineElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGPolylineElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGPolylineElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGPolylineElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGPolylineElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGPolylineElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGPolylineElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGPolylineElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGPolylineElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGPolylineElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGPolylineElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /// @domName SVGTransformable.transform; @docsEditable true
+  @DocsEditable @DomName('SVGPolylineElement.transform')
   final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4772,7 +5014,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPreserveAspectRatio; @docsEditable true
+
+@DocsEditable
+@DomName('SVGPreserveAspectRatio')
 class PreserveAspectRatio native "*SVGPreserveAspectRatio" {
 
   static const int SVG_MEETORSLICE_MEET = 1;
@@ -4803,10 +5047,10 @@
 
   static const int SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
 
-  /// @domName SVGPreserveAspectRatio.align; @docsEditable true
+  @DocsEditable @DomName('SVGPreserveAspectRatio.align')
   int align;
 
-  /// @domName SVGPreserveAspectRatio.meetOrSlice; @docsEditable true
+  @DocsEditable @DomName('SVGPreserveAspectRatio.meetOrSlice')
   int meetOrSlice;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4814,28 +5058,30 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGRadialGradientElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGRadialGradientElement')
 class RadialGradientElement extends GradientElement native "*SVGRadialGradientElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory RadialGradientElement() => _SvgElementFactoryProvider.createSvgElement_tag("radialGradient");
 
-  /// @domName SVGRadialGradientElement.cx; @docsEditable true
+  @DocsEditable @DomName('SVGRadialGradientElement.cx')
   final AnimatedLength cx;
 
-  /// @domName SVGRadialGradientElement.cy; @docsEditable true
+  @DocsEditable @DomName('SVGRadialGradientElement.cy')
   final AnimatedLength cy;
 
-  /// @domName SVGRadialGradientElement.fr; @docsEditable true
+  @DocsEditable @DomName('SVGRadialGradientElement.fr')
   final AnimatedLength fr;
 
-  /// @domName SVGRadialGradientElement.fx; @docsEditable true
+  @DocsEditable @DomName('SVGRadialGradientElement.fx')
   final AnimatedLength fx;
 
-  /// @domName SVGRadialGradientElement.fy; @docsEditable true
+  @DocsEditable @DomName('SVGRadialGradientElement.fy')
   final AnimatedLength fy;
 
-  /// @domName SVGRadialGradientElement.r; @docsEditable true
+  @DocsEditable @DomName('SVGRadialGradientElement.r')
   final AnimatedLength r;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4843,19 +5089,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGRect; @docsEditable true
+
+@DocsEditable
+@DomName('SVGRect')
 class Rect native "*SVGRect" {
 
-  /// @domName SVGRect.height; @docsEditable true
+  @DocsEditable @DomName('SVGRect.height')
   num height;
 
-  /// @domName SVGRect.width; @docsEditable true
+  @DocsEditable @DomName('SVGRect.width')
   num width;
 
-  /// @domName SVGRect.x; @docsEditable true
+  @DocsEditable @DomName('SVGRect.x')
   num x;
 
-  /// @domName SVGRect.y; @docsEditable true
+  @DocsEditable @DomName('SVGRect.y')
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4863,94 +5111,95 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGRectElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGRectElement')
 class RectElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGRectElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory RectElement() => _SvgElementFactoryProvider.createSvgElement_tag("rect");
 
-  /// @domName SVGRectElement.height; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGRectElement.rx; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.rx')
   final AnimatedLength rx;
 
-  /// @domName SVGRectElement.ry; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.ry')
   final AnimatedLength ry;
 
-  /// @domName SVGRectElement.width; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGRectElement.x; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGRectElement.y; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.y')
   final AnimatedLength y;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.xmlspace')
   String xmlspace;
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGRectElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGRectElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /// @domName SVGTransformable.transform; @docsEditable true
+  @DocsEditable @DomName('SVGRectElement.transform')
   final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4958,7 +5207,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGRenderingIntent; @docsEditable true
+
+@DocsEditable
+@DomName('SVGRenderingIntent')
 class RenderingIntent native "*SVGRenderingIntent" {
 
   static const int RENDERING_INTENT_ABSOLUTE_COLORIMETRIC = 5;
@@ -4978,23 +5229,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGScriptElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGScriptElement')
 class ScriptElement extends SvgElement implements UriReference, ExternalResourcesRequired native "*SVGScriptElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory ScriptElement() => _SvgElementFactoryProvider.createSvgElement_tag("script");
 
-  /// @domName SVGScriptElement.type; @docsEditable true
+  @DocsEditable @DomName('SVGScriptElement.type')
   String type;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGScriptElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGURIReference
 
-  /// @domName SVGURIReference.href; @docsEditable true
+  @DocsEditable @DomName('SVGScriptElement.href')
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5002,10 +5255,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGSetElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGSetElement')
 class SetElement extends AnimationElement native "*SVGSetElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory SetElement() => _SvgElementFactoryProvider.createSvgElement_tag("set");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5013,25 +5268,26 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGStopElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGStopElement')
 class StopElement extends SvgElement implements Stylable native "*SVGStopElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory StopElement() => _SvgElementFactoryProvider.createSvgElement_tag("stop");
 
-  /// @domName SVGStopElement.offset; @docsEditable true
+  @DocsEditable @DomName('SVGStopElement.offset')
   final AnimatedNumber offset;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGStopElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5039,10 +5295,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGStringList; @docsEditable true
+
+@DocsEditable
+@DomName('SVGStringList')
 class StringList implements JavaScriptIndexingBehavior, List<String> native "*SVGStringList" {
 
-  /// @domName SVGStringList.numberOfItems; @docsEditable true
+  @DocsEditable @DomName('SVGStringList.numberOfItems')
   final int numberOfItems;
 
   String operator[](int index) => JS("String", "#[#]", this, index);
@@ -5065,50 +5323,50 @@
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, String)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(String element) => Collections.contains(this, element);
+  bool contains(String element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(String element)) => Collections.forEach(this, f);
+  void forEach(void f(String element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(String element)) => new MappedList<String, dynamic>(this, f);
+  List mappedBy(f(String element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<String> where(bool f(String element)) => new WhereIterable<String>(this, f);
+  Iterable<String> where(bool f(String element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(String element)) => Collections.every(this, f);
+  bool every(bool f(String element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(String element)) => Collections.any(this, f);
+  bool any(bool f(String element)) => IterableMixinWorkaround.any(this, f);
 
   List<String> toList() => new List<String>.from(this);
   Set<String> toSet() => new Set<String>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<String> take(int n) => new ListView<String>(this, 0, n);
+  List<String> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<String> takeWhile(bool test(String value)) {
-    return new TakeWhileIterable<String>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<String> skip(int n) => new ListView<String>(this, n, null);
+  List<String> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<String> skipWhile(bool test(String value)) {
-    return new SkipWhileIterable<String>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   String firstMatching(bool test(String value), { String orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   String lastMatching(bool test(String value), {String orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   String singleMatching(bool test(String value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   String elementAt(int index) {
@@ -5134,7 +5392,7 @@
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
-  // contains() defined by IDL.
+  // clear() defined by IDL.
 
   void sort([int compare(String a, String b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
@@ -5164,16 +5422,36 @@
     throw new StateError("More than one element");
   }
 
-  String min([int compare(String a, String b)]) => Collections.min(this, compare);
+  String min([int compare(String a, String b)]) => IterableMixinWorkaround.min(this, compare);
 
-  String max([int compare(String a, String b)]) => Collections.max(this, compare);
+  String max([int compare(String a, String b)]) => IterableMixinWorkaround.max(this, compare);
 
   String removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   String removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(String element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(String element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<String> from, [int startFrom]) {
@@ -5193,25 +5471,25 @@
 
   // -- end List<String> mixins.
 
-  /// @domName SVGStringList.appendItem; @docsEditable true
+  @DocsEditable @DomName('SVGStringList.appendItem')
   String appendItem(String item) native;
 
-  /// @domName SVGStringList.clear; @docsEditable true
+  @DocsEditable @DomName('SVGStringList.clear')
   void clear() native;
 
-  /// @domName SVGStringList.getItem; @docsEditable true
+  @DocsEditable @DomName('SVGStringList.getItem')
   String getItem(int index) native;
 
-  /// @domName SVGStringList.initialize; @docsEditable true
+  @DocsEditable @DomName('SVGStringList.initialize')
   String initialize(String item) native;
 
-  /// @domName SVGStringList.insertItemBefore; @docsEditable true
+  @DocsEditable @DomName('SVGStringList.insertItemBefore')
   String insertItemBefore(String item, int index) native;
 
-  /// @domName SVGStringList.removeItem; @docsEditable true
+  @DocsEditable @DomName('SVGStringList.removeItem')
   String removeItem(int index) native;
 
-  /// @domName SVGStringList.replaceItem; @docsEditable true
+  @DocsEditable @DomName('SVGStringList.replaceItem')
   String replaceItem(String item, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5219,14 +5497,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGStylable
+@DocsEditable
+@DomName('SVGStylable')
 abstract class Stylable {
 
   AnimatedString $dom_svgClassName;
 
   CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CssValue getPresentationAttribute(String name);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5234,36 +5512,36 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGStyleElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGStyleElement')
 class StyleElement extends SvgElement implements LangSpace native "*SVGStyleElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory StyleElement() => _SvgElementFactoryProvider.createSvgElement_tag("style");
 
-  /// @domName SVGStyleElement.disabled; @docsEditable true
+  @DocsEditable @DomName('SVGStyleElement.disabled')
   bool disabled;
 
-  /// @domName SVGStyleElement.media; @docsEditable true
+  @DocsEditable @DomName('SVGStyleElement.media')
   String media;
 
   // Shadowing definition.
-  /// @domName SVGStyleElement.title; @docsEditable true
   String get title => JS("String", "#.title", this);
 
-  /// @domName SVGStyleElement.title; @docsEditable true
   void set title(String value) {
     JS("void", "#.title = #", this, value);
   }
 
-  /// @domName SVGStyleElement.type; @docsEditable true
+  @DocsEditable @DomName('SVGStyleElement.type')
   String type;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGStyleElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGStyleElement.xmlspace')
   String xmlspace;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5271,14 +5549,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGDocument; @docsEditable true
+
+@DocsEditable
+@DomName('SVGDocument')
 class SvgDocument extends Document native "*SVGDocument" {
 
-  /// @domName SVGDocument.rootElement; @docsEditable true
+  @DocsEditable @DomName('SVGDocument.rootElement')
   final SvgSvgElement rootElement;
 
-  /// @domName SVGDocument.createEvent; @docsEditable true
   @JSName('createEvent')
+  @DocsEditable @DomName('SVGDocument.createEvent')
   Event $dom_createEvent(String eventType) native;
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
@@ -5313,7 +5593,8 @@
   }
 }
 
-/// @domName SVGElement
+@DocsEditable
+@DomName('SVGElement')
 class SvgElement extends Element native "*SVGElement" {
   factory SvgElement.tag(String tag) =>
       _SvgElementFactoryProvider.createSvgElement_tag(tag);
@@ -5370,17 +5651,17 @@
 
   // Unsupported methods inherited from Element.
 
-  /** @domName Element.insertAdjacentText */
+  @DomName('Element.insertAdjacentText')
   void insertAdjacentText(String where, String text) {
     throw new UnsupportedError("Cannot invoke insertAdjacentText on SVG.");
   }
 
-  /** @domName Element.insertAdjacentHTML */
+  @DomName('Element.insertAdjacentHTML')
   void insertAdjacentHtml(String where, String text) {
     throw new UnsupportedError("Cannot invoke insertAdjacentHtml on SVG.");
   }
 
-  /** @domName Element.insertAdjacentHTML */
+  @DomName('Element.insertAdjacentHTML')
   Element insertAdjacentElement(String where, Element element) {
     throw new UnsupportedError("Cannot invoke insertAdjacentElement on SVG.");
   }
@@ -5396,22 +5677,20 @@
 
 
   // Shadowing definition.
-  /// @domName SVGElement.id; @docsEditable true
   String get id => JS("String", "#.id", this);
 
-  /// @domName SVGElement.id; @docsEditable true
   void set id(String value) {
     JS("void", "#.id = #", this, value);
   }
 
-  /// @domName SVGElement.ownerSVGElement; @docsEditable true
   @JSName('ownerSVGElement')
+  @DocsEditable @DomName('SVGElement.ownerSVGElement')
   final SvgSvgElement ownerSvgElement;
 
-  /// @domName SVGElement.viewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGElement.viewportElement')
   final SvgElement viewportElement;
 
-  /// @domName SVGElement.xmlbase; @docsEditable true
+  @DocsEditable @DomName('SVGElement.xmlbase')
   String xmlbase;
 
 }
@@ -5420,7 +5699,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGException; @docsEditable true
+
+@DocsEditable
+@DomName('SVGException')
 class SvgException native "*SVGException" {
 
   static const int SVG_INVALID_VALUE_ERR = 1;
@@ -5429,16 +5710,16 @@
 
   static const int SVG_WRONG_TYPE_ERR = 0;
 
-  /// @domName SVGException.code; @docsEditable true
+  @DocsEditable @DomName('SVGException.code')
   final int code;
 
-  /// @domName SVGException.message; @docsEditable true
+  @DocsEditable @DomName('SVGException.message')
   final String message;
 
-  /// @domName SVGException.name; @docsEditable true
+  @DocsEditable @DomName('SVGException.name')
   final String name;
 
-  /// @domName SVGException.toString; @docsEditable true
+  @DocsEditable @DomName('SVGException.toString')
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5446,207 +5727,207 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGSVGElement
+@DocsEditable
+@DomName('SVGSVGElement')
 class SvgSvgElement extends SvgElement implements FitToViewBox, Tests, Stylable, Locatable, ExternalResourcesRequired, ZoomAndPan, LangSpace native "*SVGSVGElement" {
   factory SvgSvgElement() => _SvgSvgElementFactoryProvider.createSvgSvgElement();
 
 
-  /// @domName SVGSVGElement.contentScriptType; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.contentScriptType')
   String contentScriptType;
 
-  /// @domName SVGSVGElement.contentStyleType; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.contentStyleType')
   String contentStyleType;
 
-  /// @domName SVGSVGElement.currentScale; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.currentScale')
   num currentScale;
 
-  /// @domName SVGSVGElement.currentTranslate; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.currentTranslate')
   final Point currentTranslate;
 
-  /// @domName SVGSVGElement.currentView; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.currentView')
   final ViewSpec currentView;
 
-  /// @domName SVGSVGElement.height; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGSVGElement.pixelUnitToMillimeterX; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.pixelUnitToMillimeterX')
   final num pixelUnitToMillimeterX;
 
-  /// @domName SVGSVGElement.pixelUnitToMillimeterY; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.pixelUnitToMillimeterY')
   final num pixelUnitToMillimeterY;
 
-  /// @domName SVGSVGElement.screenPixelToMillimeterX; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.screenPixelToMillimeterX')
   final num screenPixelToMillimeterX;
 
-  /// @domName SVGSVGElement.screenPixelToMillimeterY; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.screenPixelToMillimeterY')
   final num screenPixelToMillimeterY;
 
-  /// @domName SVGSVGElement.useCurrentView; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.useCurrentView')
   final bool useCurrentView;
 
-  /// @domName SVGSVGElement.viewport; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.viewport')
   final Rect viewport;
 
-  /// @domName SVGSVGElement.width; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGSVGElement.x; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGSVGElement.y; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.y')
   final AnimatedLength y;
 
-  /// @domName SVGSVGElement.animationsPaused; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.animationsPaused')
   bool animationsPaused() native;
 
-  /// @domName SVGSVGElement.checkEnclosure; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.checkEnclosure')
   bool checkEnclosure(SvgElement element, Rect rect) native;
 
-  /// @domName SVGSVGElement.checkIntersection; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.checkIntersection')
   bool checkIntersection(SvgElement element, Rect rect) native;
 
-  /// @domName SVGSVGElement.createSVGAngle; @docsEditable true
   @JSName('createSVGAngle')
+  @DocsEditable @DomName('SVGSVGElement.createSVGAngle')
   Angle createSvgAngle() native;
 
-  /// @domName SVGSVGElement.createSVGLength; @docsEditable true
   @JSName('createSVGLength')
+  @DocsEditable @DomName('SVGSVGElement.createSVGLength')
   Length createSvgLength() native;
 
-  /// @domName SVGSVGElement.createSVGMatrix; @docsEditable true
   @JSName('createSVGMatrix')
+  @DocsEditable @DomName('SVGSVGElement.createSVGMatrix')
   Matrix createSvgMatrix() native;
 
-  /// @domName SVGSVGElement.createSVGNumber; @docsEditable true
   @JSName('createSVGNumber')
+  @DocsEditable @DomName('SVGSVGElement.createSVGNumber')
   Number createSvgNumber() native;
 
-  /// @domName SVGSVGElement.createSVGPoint; @docsEditable true
   @JSName('createSVGPoint')
+  @DocsEditable @DomName('SVGSVGElement.createSVGPoint')
   Point createSvgPoint() native;
 
-  /// @domName SVGSVGElement.createSVGRect; @docsEditable true
   @JSName('createSVGRect')
+  @DocsEditable @DomName('SVGSVGElement.createSVGRect')
   Rect createSvgRect() native;
 
-  /// @domName SVGSVGElement.createSVGTransform; @docsEditable true
   @JSName('createSVGTransform')
+  @DocsEditable @DomName('SVGSVGElement.createSVGTransform')
   Transform createSvgTransform() native;
 
-  /// @domName SVGSVGElement.createSVGTransformFromMatrix; @docsEditable true
   @JSName('createSVGTransformFromMatrix')
+  @DocsEditable @DomName('SVGSVGElement.createSVGTransformFromMatrix')
   Transform createSvgTransformFromMatrix(Matrix matrix) native;
 
-  /// @domName SVGSVGElement.deselectAll; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.deselectAll')
   void deselectAll() native;
 
-  /// @domName SVGSVGElement.forceRedraw; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.forceRedraw')
   void forceRedraw() native;
 
-  /// @domName SVGSVGElement.getCurrentTime; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.getCurrentTime')
   num getCurrentTime() native;
 
-  /// @domName SVGSVGElement.getElementById; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.getElementById')
   Element getElementById(String elementId) native;
 
-  /// @domName SVGSVGElement.getEnclosureList; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.getEnclosureList')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) native;
 
-  /// @domName SVGSVGElement.getIntersectionList; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.getIntersectionList')
   @Returns('NodeList') @Creates('NodeList')
   List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) native;
 
-  /// @domName SVGSVGElement.pauseAnimations; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.pauseAnimations')
   void pauseAnimations() native;
 
-  /// @domName SVGSVGElement.setCurrentTime; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.setCurrentTime')
   void setCurrentTime(num seconds) native;
 
-  /// @domName SVGSVGElement.suspendRedraw; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.suspendRedraw')
   int suspendRedraw(int maxWaitMilliseconds) native;
 
-  /// @domName SVGSVGElement.unpauseAnimations; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.unpauseAnimations')
   void unpauseAnimations() native;
 
-  /// @domName SVGSVGElement.unsuspendRedraw; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.unsuspendRedraw')
   void unsuspendRedraw(int suspendHandleId) native;
 
-  /// @domName SVGSVGElement.unsuspendRedrawAll; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.unsuspendRedrawAll')
   void unsuspendRedrawAll() native;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGFitToViewBox
 
-  /// @domName SVGFitToViewBox.preserveAspectRatio; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.preserveAspectRatio')
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  /// @domName SVGFitToViewBox.viewBox; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.viewBox')
   final AnimatedRect viewBox;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.xmlspace')
   String xmlspace;
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGSVGElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGSVGElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGZoomAndPan
 
-  /// @domName SVGZoomAndPan.zoomAndPan; @docsEditable true
+  @DocsEditable @DomName('SVGSVGElement.zoomAndPan')
   int zoomAndPan;
 
 }
@@ -5655,76 +5936,77 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGSwitchElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGSwitchElement')
 class SwitchElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGSwitchElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory SwitchElement() => _SvgElementFactoryProvider.createSvgElement_tag("switch");
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGSwitchElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGSwitchElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGSwitchElement.xmlspace')
   String xmlspace;
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGSwitchElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGSwitchElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGSwitchElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGSwitchElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGSwitchElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGSwitchElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGSwitchElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGSwitchElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGSwitchElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGSwitchElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGSwitchElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /// @domName SVGTransformable.transform; @docsEditable true
+  @DocsEditable @DomName('SVGSwitchElement.transform')
   final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5732,43 +6014,44 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGSymbolElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGSymbolElement')
 class SymbolElement extends SvgElement implements FitToViewBox, ExternalResourcesRequired, Stylable, LangSpace native "*SVGSymbolElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory SymbolElement() => _SvgElementFactoryProvider.createSvgElement_tag("symbol");
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGSymbolElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGFitToViewBox
 
-  /// @domName SVGFitToViewBox.preserveAspectRatio; @docsEditable true
+  @DocsEditable @DomName('SVGSymbolElement.preserveAspectRatio')
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  /// @domName SVGFitToViewBox.viewBox; @docsEditable true
+  @DocsEditable @DomName('SVGSymbolElement.viewBox')
   final AnimatedRect viewBox;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGSymbolElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGSymbolElement.xmlspace')
   String xmlspace;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGSymbolElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5776,15 +6059,17 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTRefElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGTRefElement')
 class TRefElement extends TextPositioningElement implements UriReference native "*SVGTRefElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory TRefElement() => _SvgElementFactoryProvider.createSvgElement_tag("tref");
 
   // From SVGURIReference
 
-  /// @domName SVGURIReference.href; @docsEditable true
+  @DocsEditable @DomName('SVGTRefElement.href')
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5792,10 +6077,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTSpanElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGTSpanElement')
 class TSpanElement extends TextPositioningElement native "*SVGTSpanElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory TSpanElement() => _SvgElementFactoryProvider.createSvgElement_tag("tspan");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5803,7 +6090,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTests
+@DocsEditable
+@DomName('SVGTests')
 abstract class Tests {
 
   StringList requiredExtensions;
@@ -5812,7 +6100,6 @@
 
   StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5820,7 +6107,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTextContentElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGTextContentElement')
 class TextContentElement extends SvgElement implements Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGTextContentElement" {
 
   static const int LENGTHADJUST_SPACING = 1;
@@ -5829,76 +6118,75 @@
 
   static const int LENGTHADJUST_UNKNOWN = 0;
 
-  /// @domName SVGTextContentElement.lengthAdjust; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.lengthAdjust')
   final AnimatedEnumeration lengthAdjust;
 
-  /// @domName SVGTextContentElement.textLength; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.textLength')
   final AnimatedLength textLength;
 
-  /// @domName SVGTextContentElement.getCharNumAtPosition; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.getCharNumAtPosition')
   int getCharNumAtPosition(Point point) native;
 
-  /// @domName SVGTextContentElement.getComputedTextLength; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.getComputedTextLength')
   num getComputedTextLength() native;
 
-  /// @domName SVGTextContentElement.getEndPositionOfChar; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.getEndPositionOfChar')
   Point getEndPositionOfChar(int offset) native;
 
-  /// @domName SVGTextContentElement.getExtentOfChar; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.getExtentOfChar')
   Rect getExtentOfChar(int offset) native;
 
-  /// @domName SVGTextContentElement.getNumberOfChars; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.getNumberOfChars')
   int getNumberOfChars() native;
 
-  /// @domName SVGTextContentElement.getRotationOfChar; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.getRotationOfChar')
   num getRotationOfChar(int offset) native;
 
-  /// @domName SVGTextContentElement.getStartPositionOfChar; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.getStartPositionOfChar')
   Point getStartPositionOfChar(int offset) native;
 
-  /// @domName SVGTextContentElement.getSubStringLength; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.getSubStringLength')
   num getSubStringLength(int offset, int length) native;
 
-  /// @domName SVGTextContentElement.selectSubString; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.selectSubString')
   void selectSubString(int offset, int length) native;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.xmlspace')
   String xmlspace;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGTextContentElement.hasExtension')
   bool hasExtension(String extension) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5906,37 +6194,39 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTextElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGTextElement')
 class TextElement extends TextPositioningElement implements Transformable native "*SVGTextElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory TextElement() => _SvgElementFactoryProvider.createSvgElement_tag("text");
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGTextElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGTextElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGTextElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGTextElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGTextElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGTextElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGTransformable
 
-  /// @domName SVGTransformable.transform; @docsEditable true
+  @DocsEditable @DomName('SVGTextElement.transform')
   final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5944,7 +6234,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTextPathElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGTextPathElement')
 class TextPathElement extends TextContentElement implements UriReference native "*SVGTextPathElement" {
 
   static const int TEXTPATH_METHODTYPE_ALIGN = 1;
@@ -5959,18 +6251,18 @@
 
   static const int TEXTPATH_SPACINGTYPE_UNKNOWN = 0;
 
-  /// @domName SVGTextPathElement.method; @docsEditable true
+  @DocsEditable @DomName('SVGTextPathElement.method')
   final AnimatedEnumeration method;
 
-  /// @domName SVGTextPathElement.spacing; @docsEditable true
+  @DocsEditable @DomName('SVGTextPathElement.spacing')
   final AnimatedEnumeration spacing;
 
-  /// @domName SVGTextPathElement.startOffset; @docsEditable true
+  @DocsEditable @DomName('SVGTextPathElement.startOffset')
   final AnimatedLength startOffset;
 
   // From SVGURIReference
 
-  /// @domName SVGURIReference.href; @docsEditable true
+  @DocsEditable @DomName('SVGTextPathElement.href')
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5978,22 +6270,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTextPositioningElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGTextPositioningElement')
 class TextPositioningElement extends TextContentElement native "*SVGTextPositioningElement" {
 
-  /// @domName SVGTextPositioningElement.dx; @docsEditable true
+  @DocsEditable @DomName('SVGTextPositioningElement.dx')
   final AnimatedLengthList dx;
 
-  /// @domName SVGTextPositioningElement.dy; @docsEditable true
+  @DocsEditable @DomName('SVGTextPositioningElement.dy')
   final AnimatedLengthList dy;
 
-  /// @domName SVGTextPositioningElement.rotate; @docsEditable true
+  @DocsEditable @DomName('SVGTextPositioningElement.rotate')
   final AnimatedNumberList rotate;
 
-  /// @domName SVGTextPositioningElement.x; @docsEditable true
+  @DocsEditable @DomName('SVGTextPositioningElement.x')
   final AnimatedLengthList x;
 
-  /// @domName SVGTextPositioningElement.y; @docsEditable true
+  @DocsEditable @DomName('SVGTextPositioningElement.y')
   final AnimatedLengthList y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6001,30 +6295,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTitleElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGTitleElement')
 class TitleElement extends SvgElement implements Stylable, LangSpace native "*SVGTitleElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory TitleElement() => _SvgElementFactoryProvider.createSvgElement_tag("title");
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGTitleElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGTitleElement.xmlspace')
   String xmlspace;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGTitleElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6032,7 +6327,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTransform; @docsEditable true
+
+@DocsEditable
+@DomName('SVGTransform')
 class Transform native "*SVGTransform" {
 
   static const int SVG_TRANSFORM_MATRIX = 1;
@@ -6049,31 +6346,31 @@
 
   static const int SVG_TRANSFORM_UNKNOWN = 0;
 
-  /// @domName SVGTransform.angle; @docsEditable true
+  @DocsEditable @DomName('SVGTransform.angle')
   final num angle;
 
-  /// @domName SVGTransform.matrix; @docsEditable true
+  @DocsEditable @DomName('SVGTransform.matrix')
   final Matrix matrix;
 
-  /// @domName SVGTransform.type; @docsEditable true
+  @DocsEditable @DomName('SVGTransform.type')
   final int type;
 
-  /// @domName SVGTransform.setMatrix; @docsEditable true
+  @DocsEditable @DomName('SVGTransform.setMatrix')
   void setMatrix(Matrix matrix) native;
 
-  /// @domName SVGTransform.setRotate; @docsEditable true
+  @DocsEditable @DomName('SVGTransform.setRotate')
   void setRotate(num angle, num cx, num cy) native;
 
-  /// @domName SVGTransform.setScale; @docsEditable true
+  @DocsEditable @DomName('SVGTransform.setScale')
   void setScale(num sx, num sy) native;
 
-  /// @domName SVGTransform.setSkewX; @docsEditable true
+  @DocsEditable @DomName('SVGTransform.setSkewX')
   void setSkewX(num angle) native;
 
-  /// @domName SVGTransform.setSkewY; @docsEditable true
+  @DocsEditable @DomName('SVGTransform.setSkewY')
   void setSkewY(num angle) native;
 
-  /// @domName SVGTransform.setTranslate; @docsEditable true
+  @DocsEditable @DomName('SVGTransform.setTranslate')
   void setTranslate(num tx, num ty) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6081,10 +6378,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTransformList; @docsEditable true
+
+@DocsEditable
+@DomName('SVGTransformList')
 class TransformList implements List<Transform>, JavaScriptIndexingBehavior native "*SVGTransformList" {
 
-  /// @domName SVGTransformList.numberOfItems; @docsEditable true
+  @DocsEditable @DomName('SVGTransformList.numberOfItems')
   final int numberOfItems;
 
   Transform operator[](int index) => JS("Transform", "#[#]", this, index);
@@ -6107,50 +6406,50 @@
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Transform)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Transform element) => Collections.contains(this, element);
+  bool contains(Transform element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Transform element)) => Collections.forEach(this, f);
+  void forEach(void f(Transform element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Transform element)) => new MappedList<Transform, dynamic>(this, f);
+  List mappedBy(f(Transform element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Transform> where(bool f(Transform element)) => new WhereIterable<Transform>(this, f);
+  Iterable<Transform> where(bool f(Transform element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Transform element)) => Collections.every(this, f);
+  bool every(bool f(Transform element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Transform element)) => Collections.any(this, f);
+  bool any(bool f(Transform element)) => IterableMixinWorkaround.any(this, f);
 
   List<Transform> toList() => new List<Transform>.from(this);
   Set<Transform> toSet() => new Set<Transform>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Transform> take(int n) => new ListView<Transform>(this, 0, n);
+  List<Transform> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Transform> takeWhile(bool test(Transform value)) {
-    return new TakeWhileIterable<Transform>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Transform> skip(int n) => new ListView<Transform>(this, n, null);
+  List<Transform> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Transform> skipWhile(bool test(Transform value)) {
-    return new SkipWhileIterable<Transform>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Transform firstMatching(bool test(Transform value), { Transform orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Transform lastMatching(bool test(Transform value), {Transform orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Transform singleMatching(bool test(Transform value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Transform elementAt(int index) {
@@ -6176,7 +6475,7 @@
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
-  // contains() defined by IDL.
+  // clear() defined by IDL.
 
   void sort([int compare(Transform a, Transform b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
@@ -6206,16 +6505,36 @@
     throw new StateError("More than one element");
   }
 
-  Transform min([int compare(Transform a, Transform b)]) => Collections.min(this, compare);
+  Transform min([int compare(Transform a, Transform b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Transform max([int compare(Transform a, Transform b)]) => Collections.max(this, compare);
+  Transform max([int compare(Transform a, Transform b)]) => IterableMixinWorkaround.max(this, compare);
 
   Transform removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Transform removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Transform element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Transform element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Transform> from, [int startFrom]) {
@@ -6235,32 +6554,32 @@
 
   // -- end List<Transform> mixins.
 
-  /// @domName SVGTransformList.appendItem; @docsEditable true
+  @DocsEditable @DomName('SVGTransformList.appendItem')
   Transform appendItem(Transform item) native;
 
-  /// @domName SVGTransformList.clear; @docsEditable true
+  @DocsEditable @DomName('SVGTransformList.clear')
   void clear() native;
 
-  /// @domName SVGTransformList.consolidate; @docsEditable true
+  @DocsEditable @DomName('SVGTransformList.consolidate')
   Transform consolidate() native;
 
-  /// @domName SVGTransformList.createSVGTransformFromMatrix; @docsEditable true
   @JSName('createSVGTransformFromMatrix')
+  @DocsEditable @DomName('SVGTransformList.createSVGTransformFromMatrix')
   Transform createSvgTransformFromMatrix(Matrix matrix) native;
 
-  /// @domName SVGTransformList.getItem; @docsEditable true
+  @DocsEditable @DomName('SVGTransformList.getItem')
   Transform getItem(int index) native;
 
-  /// @domName SVGTransformList.initialize; @docsEditable true
+  @DocsEditable @DomName('SVGTransformList.initialize')
   Transform initialize(Transform item) native;
 
-  /// @domName SVGTransformList.insertItemBefore; @docsEditable true
+  @DocsEditable @DomName('SVGTransformList.insertItemBefore')
   Transform insertItemBefore(Transform item, int index) native;
 
-  /// @domName SVGTransformList.removeItem; @docsEditable true
+  @DocsEditable @DomName('SVGTransformList.removeItem')
   Transform removeItem(int index) native;
 
-  /// @domName SVGTransformList.replaceItem; @docsEditable true
+  @DocsEditable @DomName('SVGTransformList.replaceItem')
   Transform replaceItem(Transform item, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6268,7 +6587,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTransformable
+@DocsEditable
+@DomName('SVGTransformable')
 abstract class Transformable implements Locatable {
 
   AnimatedTransformList transform;
@@ -6279,16 +6599,12 @@
 
   SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
   Rect getBBox();
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   Matrix getCTM();
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   Matrix getScreenCTM();
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6296,7 +6612,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGUnitTypes; @docsEditable true
+
+@DocsEditable
+@DomName('SVGUnitTypes')
 class UnitTypes native "*SVGUnitTypes" {
 
   static const int SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
@@ -6310,7 +6628,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGURIReference
+@DocsEditable
+@DomName('SVGURIReference')
 abstract class UriReference {
 
   AnimatedString href;
@@ -6320,99 +6639,100 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGUseElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGUseElement')
 class UseElement extends SvgElement implements Transformable, Tests, UriReference, Stylable, ExternalResourcesRequired, LangSpace native "*SVGUseElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory UseElement() => _SvgElementFactoryProvider.createSvgElement_tag("use");
 
-  /// @domName SVGUseElement.animatedInstanceRoot; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.animatedInstanceRoot')
   final ElementInstance animatedInstanceRoot;
 
-  /// @domName SVGUseElement.height; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.height')
   final AnimatedLength height;
 
-  /// @domName SVGUseElement.instanceRoot; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.instanceRoot')
   final ElementInstance instanceRoot;
 
-  /// @domName SVGUseElement.width; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.width')
   final AnimatedLength width;
 
-  /// @domName SVGUseElement.x; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.x')
   final AnimatedLength x;
 
-  /// @domName SVGUseElement.y; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.y')
   final AnimatedLength y;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.xmllang')
   String xmllang;
 
-  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.xmlspace')
   String xmlspace;
 
   // From SVGLocatable
 
-  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.farthestViewportElement')
   final SvgElement farthestViewportElement;
 
-  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.nearestViewportElement')
   final SvgElement nearestViewportElement;
 
-  /// @domName SVGLocatable.getBBox; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.getBBox')
   Rect getBBox() native;
 
-  /// @domName SVGLocatable.getCTM; @docsEditable true
   @JSName('getCTM')
+  @DocsEditable @DomName('SVGUseElement.getCTM')
   Matrix getCtm() native;
 
-  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
   @JSName('getScreenCTM')
+  @DocsEditable @DomName('SVGUseElement.getScreenCTM')
   Matrix getScreenCtm() native;
 
-  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
   // Shadowing definition.
-  /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
-  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.requiredExtensions')
   final StringList requiredExtensions;
 
-  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.requiredFeatures')
   final StringList requiredFeatures;
 
-  /// @domName SVGTests.systemLanguage; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.systemLanguage')
   final StringList systemLanguage;
 
-  /// @domName SVGTests.hasExtension; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.hasExtension')
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /// @domName SVGTransformable.transform; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.transform')
   final AnimatedTransformList transform;
 
   // From SVGURIReference
 
-  /// @domName SVGURIReference.href; @docsEditable true
+  @DocsEditable @DomName('SVGUseElement.href')
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6420,10 +6740,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGVKernElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGVKernElement')
 class VKernElement extends SvgElement native "*SVGVKernElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory VKernElement() => _SvgElementFactoryProvider.createSvgElement_tag("vkern");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6431,31 +6753,33 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGViewElement; @docsEditable true
+
+@DocsEditable
+@DomName('SVGViewElement')
 class ViewElement extends SvgElement implements FitToViewBox, ExternalResourcesRequired, ZoomAndPan native "*SVGViewElement" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory ViewElement() => _SvgElementFactoryProvider.createSvgElement_tag("view");
 
-  /// @domName SVGViewElement.viewTarget; @docsEditable true
+  @DocsEditable @DomName('SVGViewElement.viewTarget')
   final StringList viewTarget;
 
   // From SVGExternalResourcesRequired
 
-  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  @DocsEditable @DomName('SVGViewElement.externalResourcesRequired')
   final AnimatedBoolean externalResourcesRequired;
 
   // From SVGFitToViewBox
 
-  /// @domName SVGFitToViewBox.preserveAspectRatio; @docsEditable true
+  @DocsEditable @DomName('SVGViewElement.preserveAspectRatio')
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  /// @domName SVGFitToViewBox.viewBox; @docsEditable true
+  @DocsEditable @DomName('SVGViewElement.viewBox')
   final AnimatedRect viewBox;
 
   // From SVGZoomAndPan
 
-  /// @domName SVGZoomAndPan.zoomAndPan; @docsEditable true
+  @DocsEditable @DomName('SVGViewElement.zoomAndPan')
   int zoomAndPan;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6463,34 +6787,36 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGViewSpec; @docsEditable true
+
+@DocsEditable
+@DomName('SVGViewSpec')
 class ViewSpec native "*SVGViewSpec" {
 
-  /// @domName SVGViewSpec.preserveAspectRatio; @docsEditable true
+  @DocsEditable @DomName('SVGViewSpec.preserveAspectRatio')
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  /// @domName SVGViewSpec.preserveAspectRatioString; @docsEditable true
+  @DocsEditable @DomName('SVGViewSpec.preserveAspectRatioString')
   final String preserveAspectRatioString;
 
-  /// @domName SVGViewSpec.transform; @docsEditable true
+  @DocsEditable @DomName('SVGViewSpec.transform')
   final TransformList transform;
 
-  /// @domName SVGViewSpec.transformString; @docsEditable true
+  @DocsEditable @DomName('SVGViewSpec.transformString')
   final String transformString;
 
-  /// @domName SVGViewSpec.viewBox; @docsEditable true
+  @DocsEditable @DomName('SVGViewSpec.viewBox')
   final AnimatedRect viewBox;
 
-  /// @domName SVGViewSpec.viewBoxString; @docsEditable true
+  @DocsEditable @DomName('SVGViewSpec.viewBoxString')
   final String viewBoxString;
 
-  /// @domName SVGViewSpec.viewTarget; @docsEditable true
+  @DocsEditable @DomName('SVGViewSpec.viewTarget')
   final SvgElement viewTarget;
 
-  /// @domName SVGViewSpec.viewTargetString; @docsEditable true
+  @DocsEditable @DomName('SVGViewSpec.viewTargetString')
   final String viewTargetString;
 
-  /// @domName SVGViewSpec.zoomAndPan; @docsEditable true
+  @DocsEditable @DomName('SVGViewSpec.zoomAndPan')
   int zoomAndPan;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6498,7 +6824,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGZoomAndPan
+@DocsEditable
+@DomName('SVGZoomAndPan')
 abstract class ZoomAndPan {
 
   static const int SVG_ZOOMANDPAN_DISABLE = 1;
@@ -6514,22 +6841,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGZoomEvent; @docsEditable true
+
+@DocsEditable
+@DomName('SVGZoomEvent')
 class ZoomEvent extends UIEvent native "*SVGZoomEvent" {
 
-  /// @domName SVGZoomEvent.newScale; @docsEditable true
+  @DocsEditable @DomName('SVGZoomEvent.newScale')
   final num newScale;
 
-  /// @domName SVGZoomEvent.newTranslate; @docsEditable true
+  @DocsEditable @DomName('SVGZoomEvent.newTranslate')
   final Point newTranslate;
 
-  /// @domName SVGZoomEvent.previousScale; @docsEditable true
+  @DocsEditable @DomName('SVGZoomEvent.previousScale')
   final num previousScale;
 
-  /// @domName SVGZoomEvent.previousTranslate; @docsEditable true
+  @DocsEditable @DomName('SVGZoomEvent.previousTranslate')
   final Point previousTranslate;
 
-  /// @domName SVGZoomEvent.zoomRectScreen; @docsEditable true
+  @DocsEditable @DomName('SVGZoomEvent.zoomRectScreen')
   final Rect zoomRectScreen;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6537,10 +6866,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGElementInstanceList; @docsEditable true
+
+@DocsEditable
+@DomName('SVGElementInstanceList')
 class _ElementInstanceList implements JavaScriptIndexingBehavior, List<ElementInstance> native "*SVGElementInstanceList" {
 
-  /// @domName SVGElementInstanceList.length; @docsEditable true
+  @DocsEditable @DomName('SVGElementInstanceList.length')
   int get length => JS("int", "#.length", this);
 
   ElementInstance operator[](int index) => JS("ElementInstance", "#[#]", this, index);
@@ -6561,50 +6892,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, ElementInstance)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(ElementInstance element) => Collections.contains(this, element);
+  bool contains(ElementInstance element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(ElementInstance element)) => Collections.forEach(this, f);
+  void forEach(void f(ElementInstance element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(ElementInstance element)) => new MappedList<ElementInstance, dynamic>(this, f);
+  List mappedBy(f(ElementInstance element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<ElementInstance> where(bool f(ElementInstance element)) => new WhereIterable<ElementInstance>(this, f);
+  Iterable<ElementInstance> where(bool f(ElementInstance element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(ElementInstance element)) => Collections.every(this, f);
+  bool every(bool f(ElementInstance element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(ElementInstance element)) => Collections.any(this, f);
+  bool any(bool f(ElementInstance element)) => IterableMixinWorkaround.any(this, f);
 
   List<ElementInstance> toList() => new List<ElementInstance>.from(this);
   Set<ElementInstance> toSet() => new Set<ElementInstance>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<ElementInstance> take(int n) => new ListView<ElementInstance>(this, 0, n);
+  List<ElementInstance> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<ElementInstance> takeWhile(bool test(ElementInstance value)) {
-    return new TakeWhileIterable<ElementInstance>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<ElementInstance> skip(int n) => new ListView<ElementInstance>(this, n, null);
+  List<ElementInstance> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<ElementInstance> skipWhile(bool test(ElementInstance value)) {
-    return new SkipWhileIterable<ElementInstance>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   ElementInstance firstMatching(bool test(ElementInstance value), { ElementInstance orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   ElementInstance lastMatching(bool test(ElementInstance value), {ElementInstance orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   ElementInstance singleMatching(bool test(ElementInstance value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   ElementInstance elementAt(int index) {
@@ -6662,16 +6993,36 @@
     throw new StateError("More than one element");
   }
 
-  ElementInstance min([int compare(ElementInstance a, ElementInstance b)]) => Collections.min(this, compare);
+  ElementInstance min([int compare(ElementInstance a, ElementInstance b)]) => IterableMixinWorkaround.min(this, compare);
 
-  ElementInstance max([int compare(ElementInstance a, ElementInstance b)]) => Collections.max(this, compare);
+  ElementInstance max([int compare(ElementInstance a, ElementInstance b)]) => IterableMixinWorkaround.max(this, compare);
 
   ElementInstance removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   ElementInstance removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(ElementInstance element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(ElementInstance element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<ElementInstance> from, [int startFrom]) {
@@ -6691,6 +7042,6 @@
 
   // -- end List<ElementInstance> mixins.
 
-  /// @domName SVGElementInstanceList.item; @docsEditable true
+  @DocsEditable @DomName('SVGElementInstanceList.item')
   ElementInstance item(int index) native;
 }
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index e9f7cb8..ee8eb12 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -59,95 +59,96 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAElement
+@DocsEditable
+@DomName('SVGAElement')
 class AElement extends SvgElement implements Transformable, Tests, UriReference, Stylable, ExternalResourcesRequired, LangSpace {
   AElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory AElement() => _SvgElementFactoryProvider.createSvgElement_tag("a");
 
-
-  /** @domName SVGAElement.target */
+  @DocsEditable
+  @DomName('SVGAElement.target')
   AnimatedString get target native "SVGAElement_target_Getter";
 
-
-  /** @domName SVGAElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGAElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGAElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGAElement.xmllang */
+  @DocsEditable
+  @DomName('SVGAElement.xmllang')
   String get xmllang native "SVGAElement_xmllang_Getter";
 
-
-  /** @domName SVGAElement.xmllang */
+  @DocsEditable
+  @DomName('SVGAElement.xmllang')
   void set xmllang(String value) native "SVGAElement_xmllang_Setter";
 
-
-  /** @domName SVGAElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGAElement.xmlspace')
   String get xmlspace native "SVGAElement_xmlspace_Getter";
 
-
-  /** @domName SVGAElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGAElement.xmlspace')
   void set xmlspace(String value) native "SVGAElement_xmlspace_Setter";
 
-
-  /** @domName SVGAElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGAElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGAElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGAElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGAElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGAElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGAElement.getBBox */
+  @DocsEditable
+  @DomName('SVGAElement.getBBox')
   Rect getBBox() native "SVGAElement_getBBox_Callback";
 
-
-  /** @domName SVGAElement.getCTM */
+  @DocsEditable
+  @DomName('SVGAElement.getCTM')
   Matrix getCtm() native "SVGAElement_getCTM_Callback";
 
-
-  /** @domName SVGAElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGAElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGAElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGAElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGAElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGAElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGAElement.className */
+  @DocsEditable
+  @DomName('SVGAElement.className')
   AnimatedString get $dom_svgClassName native "SVGAElement_className_Getter";
 
-
-  /** @domName SVGAElement.style */
+  @DocsEditable
+  @DomName('SVGAElement.style')
   CssStyleDeclaration get style native "SVGAElement_style_Getter";
 
-
-  /** @domName SVGAElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGAElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGAElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGAElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGAElement.requiredExtensions')
   StringList get requiredExtensions native "SVGAElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGAElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGAElement.requiredFeatures')
   StringList get requiredFeatures native "SVGAElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGAElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGAElement.systemLanguage')
   StringList get systemLanguage native "SVGAElement_systemLanguage_Getter";
 
-
-  /** @domName SVGAElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGAElement.hasExtension')
   bool hasExtension(String extension) native "SVGAElement_hasExtension_Callback";
 
-
-  /** @domName SVGAElement.transform */
+  @DocsEditable
+  @DomName('SVGAElement.transform')
   AnimatedTransformList get transform native "SVGAElement_transform_Getter";
 
-
-  /** @domName SVGAElement.href */
+  @DocsEditable
+  @DomName('SVGAElement.href')
   AnimatedString get href native "SVGAElement_href_Getter";
 
 }
@@ -158,7 +159,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAltGlyphDefElement
+@DocsEditable
+@DomName('SVGAltGlyphDefElement')
 class AltGlyphDefElement extends SvgElement {
   AltGlyphDefElement.internal() : super.internal();
 
@@ -170,28 +172,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAltGlyphElement
+@DocsEditable
+@DomName('SVGAltGlyphElement')
 class AltGlyphElement extends TextPositioningElement implements UriReference {
   AltGlyphElement.internal() : super.internal();
 
-
-  /** @domName SVGAltGlyphElement.format */
+  @DocsEditable
+  @DomName('SVGAltGlyphElement.format')
   String get format native "SVGAltGlyphElement_format_Getter";
 
-
-  /** @domName SVGAltGlyphElement.format */
+  @DocsEditable
+  @DomName('SVGAltGlyphElement.format')
   void set format(String value) native "SVGAltGlyphElement_format_Setter";
 
-
-  /** @domName SVGAltGlyphElement.glyphRef */
+  @DocsEditable
+  @DomName('SVGAltGlyphElement.glyphRef')
   String get glyphRef native "SVGAltGlyphElement_glyphRef_Getter";
 
-
-  /** @domName SVGAltGlyphElement.glyphRef */
+  @DocsEditable
+  @DomName('SVGAltGlyphElement.glyphRef')
   void set glyphRef(String value) native "SVGAltGlyphElement_glyphRef_Setter";
 
-
-  /** @domName SVGAltGlyphElement.href */
+  @DocsEditable
+  @DomName('SVGAltGlyphElement.href')
   AnimatedString get href native "SVGAltGlyphElement_href_Getter";
 
 }
@@ -202,7 +205,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAltGlyphItemElement
+@DocsEditable
+@DomName('SVGAltGlyphItemElement')
 class AltGlyphItemElement extends SvgElement {
   AltGlyphItemElement.internal() : super.internal();
 
@@ -214,7 +218,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAngle
+@DocsEditable
+@DomName('SVGAngle')
 class Angle extends NativeFieldWrapperClass1 {
   Angle.internal();
 
@@ -228,40 +233,40 @@
 
   static const int SVG_ANGLETYPE_UNSPECIFIED = 1;
 
-
-  /** @domName SVGAngle.unitType */
+  @DocsEditable
+  @DomName('SVGAngle.unitType')
   int get unitType native "SVGAngle_unitType_Getter";
 
-
-  /** @domName SVGAngle.value */
+  @DocsEditable
+  @DomName('SVGAngle.value')
   num get value native "SVGAngle_value_Getter";
 
-
-  /** @domName SVGAngle.value */
+  @DocsEditable
+  @DomName('SVGAngle.value')
   void set value(num value) native "SVGAngle_value_Setter";
 
-
-  /** @domName SVGAngle.valueAsString */
+  @DocsEditable
+  @DomName('SVGAngle.valueAsString')
   String get valueAsString native "SVGAngle_valueAsString_Getter";
 
-
-  /** @domName SVGAngle.valueAsString */
+  @DocsEditable
+  @DomName('SVGAngle.valueAsString')
   void set valueAsString(String value) native "SVGAngle_valueAsString_Setter";
 
-
-  /** @domName SVGAngle.valueInSpecifiedUnits */
+  @DocsEditable
+  @DomName('SVGAngle.valueInSpecifiedUnits')
   num get valueInSpecifiedUnits native "SVGAngle_valueInSpecifiedUnits_Getter";
 
-
-  /** @domName SVGAngle.valueInSpecifiedUnits */
+  @DocsEditable
+  @DomName('SVGAngle.valueInSpecifiedUnits')
   void set valueInSpecifiedUnits(num value) native "SVGAngle_valueInSpecifiedUnits_Setter";
 
-
-  /** @domName SVGAngle.convertToSpecifiedUnits */
+  @DocsEditable
+  @DomName('SVGAngle.convertToSpecifiedUnits')
   void convertToSpecifiedUnits(int unitType) native "SVGAngle_convertToSpecifiedUnits_Callback";
 
-
-  /** @domName SVGAngle.newValueSpecifiedUnits */
+  @DocsEditable
+  @DomName('SVGAngle.newValueSpecifiedUnits')
   void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native "SVGAngle_newValueSpecifiedUnits_Callback";
 
 }
@@ -272,11 +277,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimateColorElement
+@DocsEditable
+@DomName('SVGAnimateColorElement')
 class AnimateColorElement extends AnimationElement {
   AnimateColorElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory AnimateColorElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateColor");
 
 }
@@ -287,11 +293,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimateElement
+@DocsEditable
+@DomName('SVGAnimateElement')
 class AnimateElement extends AnimationElement {
   AnimateElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory AnimateElement() => _SvgElementFactoryProvider.createSvgElement_tag("animate");
 
 }
@@ -302,11 +309,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimateMotionElement
+@DocsEditable
+@DomName('SVGAnimateMotionElement')
 class AnimateMotionElement extends AnimationElement {
   AnimateMotionElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory AnimateMotionElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateMotion");
 
 }
@@ -317,11 +325,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimateTransformElement
+@DocsEditable
+@DomName('SVGAnimateTransformElement')
 class AnimateTransformElement extends AnimationElement {
   AnimateTransformElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory AnimateTransformElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateTransform");
 
 }
@@ -332,16 +341,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimatedAngle
+@DocsEditable
+@DomName('SVGAnimatedAngle')
 class AnimatedAngle extends NativeFieldWrapperClass1 {
   AnimatedAngle.internal();
 
-
-  /** @domName SVGAnimatedAngle.animVal */
+  @DocsEditable
+  @DomName('SVGAnimatedAngle.animVal')
   Angle get animVal native "SVGAnimatedAngle_animVal_Getter";
 
-
-  /** @domName SVGAnimatedAngle.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedAngle.baseVal')
   Angle get baseVal native "SVGAnimatedAngle_baseVal_Getter";
 
 }
@@ -352,20 +362,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimatedBoolean
+@DocsEditable
+@DomName('SVGAnimatedBoolean')
 class AnimatedBoolean extends NativeFieldWrapperClass1 {
   AnimatedBoolean.internal();
 
-
-  /** @domName SVGAnimatedBoolean.animVal */
+  @DocsEditable
+  @DomName('SVGAnimatedBoolean.animVal')
   bool get animVal native "SVGAnimatedBoolean_animVal_Getter";
 
-
-  /** @domName SVGAnimatedBoolean.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedBoolean.baseVal')
   bool get baseVal native "SVGAnimatedBoolean_baseVal_Getter";
 
-
-  /** @domName SVGAnimatedBoolean.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedBoolean.baseVal')
   void set baseVal(bool value) native "SVGAnimatedBoolean_baseVal_Setter";
 
 }
@@ -376,20 +387,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimatedEnumeration
+@DocsEditable
+@DomName('SVGAnimatedEnumeration')
 class AnimatedEnumeration extends NativeFieldWrapperClass1 {
   AnimatedEnumeration.internal();
 
-
-  /** @domName SVGAnimatedEnumeration.animVal */
+  @DocsEditable
+  @DomName('SVGAnimatedEnumeration.animVal')
   int get animVal native "SVGAnimatedEnumeration_animVal_Getter";
 
-
-  /** @domName SVGAnimatedEnumeration.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedEnumeration.baseVal')
   int get baseVal native "SVGAnimatedEnumeration_baseVal_Getter";
 
-
-  /** @domName SVGAnimatedEnumeration.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedEnumeration.baseVal')
   void set baseVal(int value) native "SVGAnimatedEnumeration_baseVal_Setter";
 
 }
@@ -400,20 +412,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimatedInteger
+@DocsEditable
+@DomName('SVGAnimatedInteger')
 class AnimatedInteger extends NativeFieldWrapperClass1 {
   AnimatedInteger.internal();
 
-
-  /** @domName SVGAnimatedInteger.animVal */
+  @DocsEditable
+  @DomName('SVGAnimatedInteger.animVal')
   int get animVal native "SVGAnimatedInteger_animVal_Getter";
 
-
-  /** @domName SVGAnimatedInteger.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedInteger.baseVal')
   int get baseVal native "SVGAnimatedInteger_baseVal_Getter";
 
-
-  /** @domName SVGAnimatedInteger.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedInteger.baseVal')
   void set baseVal(int value) native "SVGAnimatedInteger_baseVal_Setter";
 
 }
@@ -424,16 +437,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimatedLength
+@DocsEditable
+@DomName('SVGAnimatedLength')
 class AnimatedLength extends NativeFieldWrapperClass1 {
   AnimatedLength.internal();
 
-
-  /** @domName SVGAnimatedLength.animVal */
+  @DocsEditable
+  @DomName('SVGAnimatedLength.animVal')
   Length get animVal native "SVGAnimatedLength_animVal_Getter";
 
-
-  /** @domName SVGAnimatedLength.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedLength.baseVal')
   Length get baseVal native "SVGAnimatedLength_baseVal_Getter";
 
 }
@@ -444,16 +458,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimatedLengthList
+@DocsEditable
+@DomName('SVGAnimatedLengthList')
 class AnimatedLengthList extends NativeFieldWrapperClass1 {
   AnimatedLengthList.internal();
 
-
-  /** @domName SVGAnimatedLengthList.animVal */
+  @DocsEditable
+  @DomName('SVGAnimatedLengthList.animVal')
   LengthList get animVal native "SVGAnimatedLengthList_animVal_Getter";
 
-
-  /** @domName SVGAnimatedLengthList.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedLengthList.baseVal')
   LengthList get baseVal native "SVGAnimatedLengthList_baseVal_Getter";
 
 }
@@ -464,20 +479,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimatedNumber
+@DocsEditable
+@DomName('SVGAnimatedNumber')
 class AnimatedNumber extends NativeFieldWrapperClass1 {
   AnimatedNumber.internal();
 
-
-  /** @domName SVGAnimatedNumber.animVal */
+  @DocsEditable
+  @DomName('SVGAnimatedNumber.animVal')
   num get animVal native "SVGAnimatedNumber_animVal_Getter";
 
-
-  /** @domName SVGAnimatedNumber.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedNumber.baseVal')
   num get baseVal native "SVGAnimatedNumber_baseVal_Getter";
 
-
-  /** @domName SVGAnimatedNumber.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedNumber.baseVal')
   void set baseVal(num value) native "SVGAnimatedNumber_baseVal_Setter";
 
 }
@@ -488,16 +504,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimatedNumberList
+@DocsEditable
+@DomName('SVGAnimatedNumberList')
 class AnimatedNumberList extends NativeFieldWrapperClass1 {
   AnimatedNumberList.internal();
 
-
-  /** @domName SVGAnimatedNumberList.animVal */
+  @DocsEditable
+  @DomName('SVGAnimatedNumberList.animVal')
   NumberList get animVal native "SVGAnimatedNumberList_animVal_Getter";
 
-
-  /** @domName SVGAnimatedNumberList.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedNumberList.baseVal')
   NumberList get baseVal native "SVGAnimatedNumberList_baseVal_Getter";
 
 }
@@ -508,16 +525,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimatedPreserveAspectRatio
+@DocsEditable
+@DomName('SVGAnimatedPreserveAspectRatio')
 class AnimatedPreserveAspectRatio extends NativeFieldWrapperClass1 {
   AnimatedPreserveAspectRatio.internal();
 
-
-  /** @domName SVGAnimatedPreserveAspectRatio.animVal */
+  @DocsEditable
+  @DomName('SVGAnimatedPreserveAspectRatio.animVal')
   PreserveAspectRatio get animVal native "SVGAnimatedPreserveAspectRatio_animVal_Getter";
 
-
-  /** @domName SVGAnimatedPreserveAspectRatio.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedPreserveAspectRatio.baseVal')
   PreserveAspectRatio get baseVal native "SVGAnimatedPreserveAspectRatio_baseVal_Getter";
 
 }
@@ -528,16 +546,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimatedRect
+@DocsEditable
+@DomName('SVGAnimatedRect')
 class AnimatedRect extends NativeFieldWrapperClass1 {
   AnimatedRect.internal();
 
-
-  /** @domName SVGAnimatedRect.animVal */
+  @DocsEditable
+  @DomName('SVGAnimatedRect.animVal')
   Rect get animVal native "SVGAnimatedRect_animVal_Getter";
 
-
-  /** @domName SVGAnimatedRect.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedRect.baseVal')
   Rect get baseVal native "SVGAnimatedRect_baseVal_Getter";
 
 }
@@ -548,20 +567,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimatedString
+@DocsEditable
+@DomName('SVGAnimatedString')
 class AnimatedString extends NativeFieldWrapperClass1 {
   AnimatedString.internal();
 
-
-  /** @domName SVGAnimatedString.animVal */
+  @DocsEditable
+  @DomName('SVGAnimatedString.animVal')
   String get animVal native "SVGAnimatedString_animVal_Getter";
 
-
-  /** @domName SVGAnimatedString.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedString.baseVal')
   String get baseVal native "SVGAnimatedString_baseVal_Getter";
 
-
-  /** @domName SVGAnimatedString.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedString.baseVal')
   void set baseVal(String value) native "SVGAnimatedString_baseVal_Setter";
 
 }
@@ -572,16 +592,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimatedTransformList
+@DocsEditable
+@DomName('SVGAnimatedTransformList')
 class AnimatedTransformList extends NativeFieldWrapperClass1 {
   AnimatedTransformList.internal();
 
-
-  /** @domName SVGAnimatedTransformList.animVal */
+  @DocsEditable
+  @DomName('SVGAnimatedTransformList.animVal')
   TransformList get animVal native "SVGAnimatedTransformList_animVal_Getter";
 
-
-  /** @domName SVGAnimatedTransformList.baseVal */
+  @DocsEditable
+  @DomName('SVGAnimatedTransformList.baseVal')
   TransformList get baseVal native "SVGAnimatedTransformList_baseVal_Getter";
 
 }
@@ -592,63 +613,64 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGAnimationElement
+@DocsEditable
+@DomName('SVGAnimationElement')
 class AnimationElement extends SvgElement implements Tests, ElementTimeControl, ExternalResourcesRequired {
   AnimationElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory AnimationElement() => _SvgElementFactoryProvider.createSvgElement_tag("animation");
 
-
-  /** @domName SVGAnimationElement.targetElement */
+  @DocsEditable
+  @DomName('SVGAnimationElement.targetElement')
   SvgElement get targetElement native "SVGAnimationElement_targetElement_Getter";
 
-
-  /** @domName SVGAnimationElement.getCurrentTime */
+  @DocsEditable
+  @DomName('SVGAnimationElement.getCurrentTime')
   num getCurrentTime() native "SVGAnimationElement_getCurrentTime_Callback";
 
-
-  /** @domName SVGAnimationElement.getSimpleDuration */
+  @DocsEditable
+  @DomName('SVGAnimationElement.getSimpleDuration')
   num getSimpleDuration() native "SVGAnimationElement_getSimpleDuration_Callback";
 
-
-  /** @domName SVGAnimationElement.getStartTime */
+  @DocsEditable
+  @DomName('SVGAnimationElement.getStartTime')
   num getStartTime() native "SVGAnimationElement_getStartTime_Callback";
 
-
-  /** @domName SVGAnimationElement.beginElement */
+  @DocsEditable
+  @DomName('SVGAnimationElement.beginElement')
   void beginElement() native "SVGAnimationElement_beginElement_Callback";
 
-
-  /** @domName SVGAnimationElement.beginElementAt */
+  @DocsEditable
+  @DomName('SVGAnimationElement.beginElementAt')
   void beginElementAt(num offset) native "SVGAnimationElement_beginElementAt_Callback";
 
-
-  /** @domName SVGAnimationElement.endElement */
+  @DocsEditable
+  @DomName('SVGAnimationElement.endElement')
   void endElement() native "SVGAnimationElement_endElement_Callback";
 
-
-  /** @domName SVGAnimationElement.endElementAt */
+  @DocsEditable
+  @DomName('SVGAnimationElement.endElementAt')
   void endElementAt(num offset) native "SVGAnimationElement_endElementAt_Callback";
 
-
-  /** @domName SVGAnimationElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGAnimationElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGAnimationElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGAnimationElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGAnimationElement.requiredExtensions')
   StringList get requiredExtensions native "SVGAnimationElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGAnimationElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGAnimationElement.requiredFeatures')
   StringList get requiredFeatures native "SVGAnimationElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGAnimationElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGAnimationElement.systemLanguage')
   StringList get systemLanguage native "SVGAnimationElement_systemLanguage_Getter";
 
-
-  /** @domName SVGAnimationElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGAnimationElement.hasExtension')
   bool hasExtension(String extension) native "SVGAnimationElement_hasExtension_Callback";
 
 }
@@ -659,99 +681,100 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGCircleElement
+@DocsEditable
+@DomName('SVGCircleElement')
 class CircleElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
   CircleElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory CircleElement() => _SvgElementFactoryProvider.createSvgElement_tag("circle");
 
-
-  /** @domName SVGCircleElement.cx */
+  @DocsEditable
+  @DomName('SVGCircleElement.cx')
   AnimatedLength get cx native "SVGCircleElement_cx_Getter";
 
-
-  /** @domName SVGCircleElement.cy */
+  @DocsEditable
+  @DomName('SVGCircleElement.cy')
   AnimatedLength get cy native "SVGCircleElement_cy_Getter";
 
-
-  /** @domName SVGCircleElement.r */
+  @DocsEditable
+  @DomName('SVGCircleElement.r')
   AnimatedLength get r native "SVGCircleElement_r_Getter";
 
-
-  /** @domName SVGCircleElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGCircleElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGCircleElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGCircleElement.xmllang */
+  @DocsEditable
+  @DomName('SVGCircleElement.xmllang')
   String get xmllang native "SVGCircleElement_xmllang_Getter";
 
-
-  /** @domName SVGCircleElement.xmllang */
+  @DocsEditable
+  @DomName('SVGCircleElement.xmllang')
   void set xmllang(String value) native "SVGCircleElement_xmllang_Setter";
 
-
-  /** @domName SVGCircleElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGCircleElement.xmlspace')
   String get xmlspace native "SVGCircleElement_xmlspace_Getter";
 
-
-  /** @domName SVGCircleElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGCircleElement.xmlspace')
   void set xmlspace(String value) native "SVGCircleElement_xmlspace_Setter";
 
-
-  /** @domName SVGCircleElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGCircleElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGCircleElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGCircleElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGCircleElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGCircleElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGCircleElement.getBBox */
+  @DocsEditable
+  @DomName('SVGCircleElement.getBBox')
   Rect getBBox() native "SVGCircleElement_getBBox_Callback";
 
-
-  /** @domName SVGCircleElement.getCTM */
+  @DocsEditable
+  @DomName('SVGCircleElement.getCTM')
   Matrix getCtm() native "SVGCircleElement_getCTM_Callback";
 
-
-  /** @domName SVGCircleElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGCircleElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGCircleElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGCircleElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGCircleElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGCircleElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGCircleElement.className */
+  @DocsEditable
+  @DomName('SVGCircleElement.className')
   AnimatedString get $dom_svgClassName native "SVGCircleElement_className_Getter";
 
-
-  /** @domName SVGCircleElement.style */
+  @DocsEditable
+  @DomName('SVGCircleElement.style')
   CssStyleDeclaration get style native "SVGCircleElement_style_Getter";
 
-
-  /** @domName SVGCircleElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGCircleElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGCircleElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGCircleElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGCircleElement.requiredExtensions')
   StringList get requiredExtensions native "SVGCircleElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGCircleElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGCircleElement.requiredFeatures')
   StringList get requiredFeatures native "SVGCircleElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGCircleElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGCircleElement.systemLanguage')
   StringList get systemLanguage native "SVGCircleElement_systemLanguage_Getter";
 
-
-  /** @domName SVGCircleElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGCircleElement.hasExtension')
   bool hasExtension(String extension) native "SVGCircleElement_hasExtension_Callback";
 
-
-  /** @domName SVGCircleElement.transform */
+  @DocsEditable
+  @DomName('SVGCircleElement.transform')
   AnimatedTransformList get transform native "SVGCircleElement_transform_Getter";
 
 }
@@ -762,91 +785,92 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGClipPathElement
+@DocsEditable
+@DomName('SVGClipPathElement')
 class ClipPathElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
   ClipPathElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory ClipPathElement() => _SvgElementFactoryProvider.createSvgElement_tag("clipPath");
 
-
-  /** @domName SVGClipPathElement.clipPathUnits */
+  @DocsEditable
+  @DomName('SVGClipPathElement.clipPathUnits')
   AnimatedEnumeration get clipPathUnits native "SVGClipPathElement_clipPathUnits_Getter";
 
-
-  /** @domName SVGClipPathElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGClipPathElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGClipPathElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGClipPathElement.xmllang */
+  @DocsEditable
+  @DomName('SVGClipPathElement.xmllang')
   String get xmllang native "SVGClipPathElement_xmllang_Getter";
 
-
-  /** @domName SVGClipPathElement.xmllang */
+  @DocsEditable
+  @DomName('SVGClipPathElement.xmllang')
   void set xmllang(String value) native "SVGClipPathElement_xmllang_Setter";
 
-
-  /** @domName SVGClipPathElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGClipPathElement.xmlspace')
   String get xmlspace native "SVGClipPathElement_xmlspace_Getter";
 
-
-  /** @domName SVGClipPathElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGClipPathElement.xmlspace')
   void set xmlspace(String value) native "SVGClipPathElement_xmlspace_Setter";
 
-
-  /** @domName SVGClipPathElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGClipPathElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGClipPathElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGClipPathElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGClipPathElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGClipPathElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGClipPathElement.getBBox */
+  @DocsEditable
+  @DomName('SVGClipPathElement.getBBox')
   Rect getBBox() native "SVGClipPathElement_getBBox_Callback";
 
-
-  /** @domName SVGClipPathElement.getCTM */
+  @DocsEditable
+  @DomName('SVGClipPathElement.getCTM')
   Matrix getCtm() native "SVGClipPathElement_getCTM_Callback";
 
-
-  /** @domName SVGClipPathElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGClipPathElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGClipPathElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGClipPathElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGClipPathElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGClipPathElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGClipPathElement.className */
+  @DocsEditable
+  @DomName('SVGClipPathElement.className')
   AnimatedString get $dom_svgClassName native "SVGClipPathElement_className_Getter";
 
-
-  /** @domName SVGClipPathElement.style */
+  @DocsEditable
+  @DomName('SVGClipPathElement.style')
   CssStyleDeclaration get style native "SVGClipPathElement_style_Getter";
 
-
-  /** @domName SVGClipPathElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGClipPathElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGClipPathElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGClipPathElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGClipPathElement.requiredExtensions')
   StringList get requiredExtensions native "SVGClipPathElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGClipPathElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGClipPathElement.requiredFeatures')
   StringList get requiredFeatures native "SVGClipPathElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGClipPathElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGClipPathElement.systemLanguage')
   StringList get systemLanguage native "SVGClipPathElement_systemLanguage_Getter";
 
-
-  /** @domName SVGClipPathElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGClipPathElement.hasExtension')
   bool hasExtension(String extension) native "SVGClipPathElement_hasExtension_Callback";
 
-
-  /** @domName SVGClipPathElement.transform */
+  @DocsEditable
+  @DomName('SVGClipPathElement.transform')
   AnimatedTransformList get transform native "SVGClipPathElement_transform_Getter";
 
 }
@@ -857,7 +881,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGColor
+@DocsEditable
+@DomName('SVGColor')
 class Color extends CssValue {
   Color.internal() : super.internal();
 
@@ -869,24 +894,24 @@
 
   static const int SVG_COLORTYPE_UNKNOWN = 0;
 
-
-  /** @domName SVGColor.colorType */
+  @DocsEditable
+  @DomName('SVGColor.colorType')
   int get colorType native "SVGColor_colorType_Getter";
 
-
-  /** @domName SVGColor.rgbColor */
+  @DocsEditable
+  @DomName('SVGColor.rgbColor')
   RgbColor get rgbColor native "SVGColor_rgbColor_Getter";
 
-
-  /** @domName SVGColor.setColor */
+  @DocsEditable
+  @DomName('SVGColor.setColor')
   void setColor(int colorType, String rgbColor, String iccColor) native "SVGColor_setColor_Callback";
 
-
-  /** @domName SVGColor.setRGBColor */
+  @DocsEditable
+  @DomName('SVGColor.setRGBColor')
   void setRgbColor(String rgbColor) native "SVGColor_setRGBColor_Callback";
 
-
-  /** @domName SVGColor.setRGBColorICCColor */
+  @DocsEditable
+  @DomName('SVGColor.setRGBColorICCColor')
   void setRgbColorIccColor(String rgbColor, String iccColor) native "SVGColor_setRGBColorICCColor_Callback";
 
 }
@@ -897,7 +922,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGComponentTransferFunctionElement
+@DocsEditable
+@DomName('SVGComponentTransferFunctionElement')
 class ComponentTransferFunctionElement extends SvgElement {
   ComponentTransferFunctionElement.internal() : super.internal();
 
@@ -913,32 +939,32 @@
 
   static const int SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0;
 
-
-  /** @domName SVGComponentTransferFunctionElement.amplitude */
+  @DocsEditable
+  @DomName('SVGComponentTransferFunctionElement.amplitude')
   AnimatedNumber get amplitude native "SVGComponentTransferFunctionElement_amplitude_Getter";
 
-
-  /** @domName SVGComponentTransferFunctionElement.exponent */
+  @DocsEditable
+  @DomName('SVGComponentTransferFunctionElement.exponent')
   AnimatedNumber get exponent native "SVGComponentTransferFunctionElement_exponent_Getter";
 
-
-  /** @domName SVGComponentTransferFunctionElement.intercept */
+  @DocsEditable
+  @DomName('SVGComponentTransferFunctionElement.intercept')
   AnimatedNumber get intercept native "SVGComponentTransferFunctionElement_intercept_Getter";
 
-
-  /** @domName SVGComponentTransferFunctionElement.offset */
+  @DocsEditable
+  @DomName('SVGComponentTransferFunctionElement.offset')
   AnimatedNumber get offset native "SVGComponentTransferFunctionElement_offset_Getter";
 
-
-  /** @domName SVGComponentTransferFunctionElement.slope */
+  @DocsEditable
+  @DomName('SVGComponentTransferFunctionElement.slope')
   AnimatedNumber get slope native "SVGComponentTransferFunctionElement_slope_Getter";
 
-
-  /** @domName SVGComponentTransferFunctionElement.tableValues */
+  @DocsEditable
+  @DomName('SVGComponentTransferFunctionElement.tableValues')
   AnimatedNumberList get tableValues native "SVGComponentTransferFunctionElement_tableValues_Getter";
 
-
-  /** @domName SVGComponentTransferFunctionElement.type */
+  @DocsEditable
+  @DomName('SVGComponentTransferFunctionElement.type')
   AnimatedEnumeration get type native "SVGComponentTransferFunctionElement_type_Getter";
 
 }
@@ -949,43 +975,44 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGCursorElement
+@DocsEditable
+@DomName('SVGCursorElement')
 class CursorElement extends SvgElement implements UriReference, Tests, ExternalResourcesRequired {
   CursorElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory CursorElement() => _SvgElementFactoryProvider.createSvgElement_tag("cursor");
 
-
-  /** @domName SVGCursorElement.x */
+  @DocsEditable
+  @DomName('SVGCursorElement.x')
   AnimatedLength get x native "SVGCursorElement_x_Getter";
 
-
-  /** @domName SVGCursorElement.y */
+  @DocsEditable
+  @DomName('SVGCursorElement.y')
   AnimatedLength get y native "SVGCursorElement_y_Getter";
 
-
-  /** @domName SVGCursorElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGCursorElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGCursorElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGCursorElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGCursorElement.requiredExtensions')
   StringList get requiredExtensions native "SVGCursorElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGCursorElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGCursorElement.requiredFeatures')
   StringList get requiredFeatures native "SVGCursorElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGCursorElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGCursorElement.systemLanguage')
   StringList get systemLanguage native "SVGCursorElement_systemLanguage_Getter";
 
-
-  /** @domName SVGCursorElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGCursorElement.hasExtension')
   bool hasExtension(String extension) native "SVGCursorElement_hasExtension_Callback";
 
-
-  /** @domName SVGCursorElement.href */
+  @DocsEditable
+  @DomName('SVGCursorElement.href')
   AnimatedString get href native "SVGCursorElement_href_Getter";
 
 }
@@ -996,87 +1023,88 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGDefsElement
+@DocsEditable
+@DomName('SVGDefsElement')
 class DefsElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
   DefsElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory DefsElement() => _SvgElementFactoryProvider.createSvgElement_tag("defs");
 
-
-  /** @domName SVGDefsElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGDefsElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGDefsElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGDefsElement.xmllang */
+  @DocsEditable
+  @DomName('SVGDefsElement.xmllang')
   String get xmllang native "SVGDefsElement_xmllang_Getter";
 
-
-  /** @domName SVGDefsElement.xmllang */
+  @DocsEditable
+  @DomName('SVGDefsElement.xmllang')
   void set xmllang(String value) native "SVGDefsElement_xmllang_Setter";
 
-
-  /** @domName SVGDefsElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGDefsElement.xmlspace')
   String get xmlspace native "SVGDefsElement_xmlspace_Getter";
 
-
-  /** @domName SVGDefsElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGDefsElement.xmlspace')
   void set xmlspace(String value) native "SVGDefsElement_xmlspace_Setter";
 
-
-  /** @domName SVGDefsElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGDefsElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGDefsElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGDefsElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGDefsElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGDefsElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGDefsElement.getBBox */
+  @DocsEditable
+  @DomName('SVGDefsElement.getBBox')
   Rect getBBox() native "SVGDefsElement_getBBox_Callback";
 
-
-  /** @domName SVGDefsElement.getCTM */
+  @DocsEditable
+  @DomName('SVGDefsElement.getCTM')
   Matrix getCtm() native "SVGDefsElement_getCTM_Callback";
 
-
-  /** @domName SVGDefsElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGDefsElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGDefsElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGDefsElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGDefsElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGDefsElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGDefsElement.className */
+  @DocsEditable
+  @DomName('SVGDefsElement.className')
   AnimatedString get $dom_svgClassName native "SVGDefsElement_className_Getter";
 
-
-  /** @domName SVGDefsElement.style */
+  @DocsEditable
+  @DomName('SVGDefsElement.style')
   CssStyleDeclaration get style native "SVGDefsElement_style_Getter";
 
-
-  /** @domName SVGDefsElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGDefsElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGDefsElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGDefsElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGDefsElement.requiredExtensions')
   StringList get requiredExtensions native "SVGDefsElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGDefsElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGDefsElement.requiredFeatures')
   StringList get requiredFeatures native "SVGDefsElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGDefsElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGDefsElement.systemLanguage')
   StringList get systemLanguage native "SVGDefsElement_systemLanguage_Getter";
 
-
-  /** @domName SVGDefsElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGDefsElement.hasExtension')
   bool hasExtension(String extension) native "SVGDefsElement_hasExtension_Callback";
 
-
-  /** @domName SVGDefsElement.transform */
+  @DocsEditable
+  @DomName('SVGDefsElement.transform')
   AnimatedTransformList get transform native "SVGDefsElement_transform_Getter";
 
 }
@@ -1087,39 +1115,40 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGDescElement
+@DocsEditable
+@DomName('SVGDescElement')
 class DescElement extends SvgElement implements Stylable, LangSpace {
   DescElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory DescElement() => _SvgElementFactoryProvider.createSvgElement_tag("desc");
 
-
-  /** @domName SVGDescElement.xmllang */
+  @DocsEditable
+  @DomName('SVGDescElement.xmllang')
   String get xmllang native "SVGDescElement_xmllang_Getter";
 
-
-  /** @domName SVGDescElement.xmllang */
+  @DocsEditable
+  @DomName('SVGDescElement.xmllang')
   void set xmllang(String value) native "SVGDescElement_xmllang_Setter";
 
-
-  /** @domName SVGDescElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGDescElement.xmlspace')
   String get xmlspace native "SVGDescElement_xmlspace_Getter";
 
-
-  /** @domName SVGDescElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGDescElement.xmlspace')
   void set xmlspace(String value) native "SVGDescElement_xmlspace_Setter";
 
-
-  /** @domName SVGDescElement.className */
+  @DocsEditable
+  @DomName('SVGDescElement.className')
   AnimatedString get $dom_svgClassName native "SVGDescElement_className_Getter";
 
-
-  /** @domName SVGDescElement.style */
+  @DocsEditable
+  @DomName('SVGDescElement.style')
   CssStyleDeclaration get style native "SVGDescElement_style_Getter";
 
-
-  /** @domName SVGDescElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGDescElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGDescElement_getPresentationAttribute_Callback";
 
 }
@@ -1130,7 +1159,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGElementInstance
+@DocsEditable
+@DomName('SVGElementInstance')
 class ElementInstance extends EventTarget {
   ElementInstance.internal() : super.internal();
 
@@ -1214,40 +1244,41 @@
 
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   ElementInstanceEvents get on =>
     new ElementInstanceEvents(this);
 
-
-  /** @domName SVGElementInstance.childNodes */
+  @DocsEditable
+  @DomName('SVGElementInstance.childNodes')
   List<ElementInstance> get childNodes native "SVGElementInstance_childNodes_Getter";
 
-
-  /** @domName SVGElementInstance.correspondingElement */
+  @DocsEditable
+  @DomName('SVGElementInstance.correspondingElement')
   SvgElement get correspondingElement native "SVGElementInstance_correspondingElement_Getter";
 
-
-  /** @domName SVGElementInstance.correspondingUseElement */
+  @DocsEditable
+  @DomName('SVGElementInstance.correspondingUseElement')
   UseElement get correspondingUseElement native "SVGElementInstance_correspondingUseElement_Getter";
 
-
-  /** @domName SVGElementInstance.firstChild */
+  @DocsEditable
+  @DomName('SVGElementInstance.firstChild')
   ElementInstance get firstChild native "SVGElementInstance_firstChild_Getter";
 
-
-  /** @domName SVGElementInstance.lastChild */
+  @DocsEditable
+  @DomName('SVGElementInstance.lastChild')
   ElementInstance get lastChild native "SVGElementInstance_lastChild_Getter";
 
-
-  /** @domName SVGElementInstance.nextSibling */
+  @DocsEditable
+  @DomName('SVGElementInstance.nextSibling')
   ElementInstance get nextSibling native "SVGElementInstance_nextSibling_Getter";
 
-
-  /** @domName SVGElementInstance.parentNode */
+  @DocsEditable
+  @DomName('SVGElementInstance.parentNode')
   ElementInstance get parentNode native "SVGElementInstance_parentNode_Getter";
 
-
-  /** @domName SVGElementInstance.previousSibling */
+  @DocsEditable
+  @DomName('SVGElementInstance.previousSibling')
   ElementInstance get previousSibling native "SVGElementInstance_previousSibling_Getter";
 
   Stream<Event> get onAbort => abortEvent.forTarget(this);
@@ -1332,129 +1363,129 @@
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class ElementInstanceEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   ElementInstanceEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get abort => this['abort'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get beforeCopy => this['beforecopy'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get beforeCut => this['beforecut'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get beforePaste => this['beforepaste'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get blur => this['blur'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get change => this['change'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get click => this['click'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get contextMenu => this['contextmenu'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get copy => this['copy'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get cut => this['cut'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get doubleClick => this['dblclick'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get drag => this['drag'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragEnd => this['dragend'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragEnter => this['dragenter'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragLeave => this['dragleave'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragOver => this['dragover'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get dragStart => this['dragstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get drop => this['drop'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get error => this['error'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get focus => this['focus'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get input => this['input'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyDown => this['keydown'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyPress => this['keypress'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get keyUp => this['keyup'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get load => this['load'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseDown => this['mousedown'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseMove => this['mousemove'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseOut => this['mouseout'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseOver => this['mouseover'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseUp => this['mouseup'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get mouseWheel => this['mousewheel'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get paste => this['paste'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get reset => this['reset'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get resize => this['resize'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get scroll => this['scroll'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get search => this['search'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get select => this['select'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get selectStart => this['selectstart'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get submit => this['submit'];
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get unload => this['unload'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1464,24 +1495,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ElementTimeControl
+@DocsEditable
+@DomName('ElementTimeControl')
 class ElementTimeControl extends NativeFieldWrapperClass1 {
   ElementTimeControl.internal();
 
-
-  /** @domName ElementTimeControl.beginElement */
+  @DocsEditable
+  @DomName('ElementTimeControl.beginElement')
   void beginElement() native "ElementTimeControl_beginElement_Callback";
 
-
-  /** @domName ElementTimeControl.beginElementAt */
+  @DocsEditable
+  @DomName('ElementTimeControl.beginElementAt')
   void beginElementAt(num offset) native "ElementTimeControl_beginElementAt_Callback";
 
-
-  /** @domName ElementTimeControl.endElement */
+  @DocsEditable
+  @DomName('ElementTimeControl.endElement')
   void endElement() native "ElementTimeControl_endElement_Callback";
 
-
-  /** @domName ElementTimeControl.endElementAt */
+  @DocsEditable
+  @DomName('ElementTimeControl.endElementAt')
   void endElementAt(num offset) native "ElementTimeControl_endElementAt_Callback";
 
 }
@@ -1492,103 +1524,104 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGEllipseElement
+@DocsEditable
+@DomName('SVGEllipseElement')
 class EllipseElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
   EllipseElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory EllipseElement() => _SvgElementFactoryProvider.createSvgElement_tag("ellipse");
 
-
-  /** @domName SVGEllipseElement.cx */
+  @DocsEditable
+  @DomName('SVGEllipseElement.cx')
   AnimatedLength get cx native "SVGEllipseElement_cx_Getter";
 
-
-  /** @domName SVGEllipseElement.cy */
+  @DocsEditable
+  @DomName('SVGEllipseElement.cy')
   AnimatedLength get cy native "SVGEllipseElement_cy_Getter";
 
-
-  /** @domName SVGEllipseElement.rx */
+  @DocsEditable
+  @DomName('SVGEllipseElement.rx')
   AnimatedLength get rx native "SVGEllipseElement_rx_Getter";
 
-
-  /** @domName SVGEllipseElement.ry */
+  @DocsEditable
+  @DomName('SVGEllipseElement.ry')
   AnimatedLength get ry native "SVGEllipseElement_ry_Getter";
 
-
-  /** @domName SVGEllipseElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGEllipseElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGEllipseElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGEllipseElement.xmllang */
+  @DocsEditable
+  @DomName('SVGEllipseElement.xmllang')
   String get xmllang native "SVGEllipseElement_xmllang_Getter";
 
-
-  /** @domName SVGEllipseElement.xmllang */
+  @DocsEditable
+  @DomName('SVGEllipseElement.xmllang')
   void set xmllang(String value) native "SVGEllipseElement_xmllang_Setter";
 
-
-  /** @domName SVGEllipseElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGEllipseElement.xmlspace')
   String get xmlspace native "SVGEllipseElement_xmlspace_Getter";
 
-
-  /** @domName SVGEllipseElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGEllipseElement.xmlspace')
   void set xmlspace(String value) native "SVGEllipseElement_xmlspace_Setter";
 
-
-  /** @domName SVGEllipseElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGEllipseElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGEllipseElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGEllipseElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGEllipseElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGEllipseElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGEllipseElement.getBBox */
+  @DocsEditable
+  @DomName('SVGEllipseElement.getBBox')
   Rect getBBox() native "SVGEllipseElement_getBBox_Callback";
 
-
-  /** @domName SVGEllipseElement.getCTM */
+  @DocsEditable
+  @DomName('SVGEllipseElement.getCTM')
   Matrix getCtm() native "SVGEllipseElement_getCTM_Callback";
 
-
-  /** @domName SVGEllipseElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGEllipseElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGEllipseElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGEllipseElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGEllipseElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGEllipseElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGEllipseElement.className */
+  @DocsEditable
+  @DomName('SVGEllipseElement.className')
   AnimatedString get $dom_svgClassName native "SVGEllipseElement_className_Getter";
 
-
-  /** @domName SVGEllipseElement.style */
+  @DocsEditable
+  @DomName('SVGEllipseElement.style')
   CssStyleDeclaration get style native "SVGEllipseElement_style_Getter";
 
-
-  /** @domName SVGEllipseElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGEllipseElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGEllipseElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGEllipseElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGEllipseElement.requiredExtensions')
   StringList get requiredExtensions native "SVGEllipseElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGEllipseElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGEllipseElement.requiredFeatures')
   StringList get requiredFeatures native "SVGEllipseElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGEllipseElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGEllipseElement.systemLanguage')
   StringList get systemLanguage native "SVGEllipseElement_systemLanguage_Getter";
 
-
-  /** @domName SVGEllipseElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGEllipseElement.hasExtension')
   bool hasExtension(String extension) native "SVGEllipseElement_hasExtension_Callback";
 
-
-  /** @domName SVGEllipseElement.transform */
+  @DocsEditable
+  @DomName('SVGEllipseElement.transform')
   AnimatedTransformList get transform native "SVGEllipseElement_transform_Getter";
 
 }
@@ -1599,12 +1632,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGExternalResourcesRequired
+@DocsEditable
+@DomName('SVGExternalResourcesRequired')
 class ExternalResourcesRequired extends NativeFieldWrapperClass1 {
   ExternalResourcesRequired.internal();
 
-
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGExternalResourcesRequired.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGExternalResourcesRequired_externalResourcesRequired_Getter";
 
 }
@@ -1615,7 +1649,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEBlendElement
+@DocsEditable
+@DomName('SVGFEBlendElement')
 class FEBlendElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   FEBlendElement.internal() : super.internal();
 
@@ -1631,48 +1666,48 @@
 
   static const int SVG_FEBLEND_MODE_UNKNOWN = 0;
 
-
-  /** @domName SVGFEBlendElement.in1 */
+  @DocsEditable
+  @DomName('SVGFEBlendElement.in1')
   AnimatedString get in1 native "SVGFEBlendElement_in1_Getter";
 
-
-  /** @domName SVGFEBlendElement.in2 */
+  @DocsEditable
+  @DomName('SVGFEBlendElement.in2')
   AnimatedString get in2 native "SVGFEBlendElement_in2_Getter";
 
-
-  /** @domName SVGFEBlendElement.mode */
+  @DocsEditable
+  @DomName('SVGFEBlendElement.mode')
   AnimatedEnumeration get mode native "SVGFEBlendElement_mode_Getter";
 
-
-  /** @domName SVGFEBlendElement.height */
+  @DocsEditable
+  @DomName('SVGFEBlendElement.height')
   AnimatedLength get height native "SVGFEBlendElement_height_Getter";
 
-
-  /** @domName SVGFEBlendElement.result */
+  @DocsEditable
+  @DomName('SVGFEBlendElement.result')
   AnimatedString get result native "SVGFEBlendElement_result_Getter";
 
-
-  /** @domName SVGFEBlendElement.width */
+  @DocsEditable
+  @DomName('SVGFEBlendElement.width')
   AnimatedLength get width native "SVGFEBlendElement_width_Getter";
 
-
-  /** @domName SVGFEBlendElement.x */
+  @DocsEditable
+  @DomName('SVGFEBlendElement.x')
   AnimatedLength get x native "SVGFEBlendElement_x_Getter";
 
-
-  /** @domName SVGFEBlendElement.y */
+  @DocsEditable
+  @DomName('SVGFEBlendElement.y')
   AnimatedLength get y native "SVGFEBlendElement_y_Getter";
 
-
-  /** @domName SVGFEBlendElement.className */
+  @DocsEditable
+  @DomName('SVGFEBlendElement.className')
   AnimatedString get $dom_svgClassName native "SVGFEBlendElement_className_Getter";
 
-
-  /** @domName SVGFEBlendElement.style */
+  @DocsEditable
+  @DomName('SVGFEBlendElement.style')
   CssStyleDeclaration get style native "SVGFEBlendElement_style_Getter";
 
-
-  /** @domName SVGFEBlendElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFEBlendElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFEBlendElement_getPresentationAttribute_Callback";
 
 }
@@ -1683,7 +1718,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEColorMatrixElement
+@DocsEditable
+@DomName('SVGFEColorMatrixElement')
 class FEColorMatrixElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   FEColorMatrixElement.internal() : super.internal();
 
@@ -1697,48 +1733,48 @@
 
   static const int SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
 
-
-  /** @domName SVGFEColorMatrixElement.in1 */
+  @DocsEditable
+  @DomName('SVGFEColorMatrixElement.in1')
   AnimatedString get in1 native "SVGFEColorMatrixElement_in1_Getter";
 
-
-  /** @domName SVGFEColorMatrixElement.type */
+  @DocsEditable
+  @DomName('SVGFEColorMatrixElement.type')
   AnimatedEnumeration get type native "SVGFEColorMatrixElement_type_Getter";
 
-
-  /** @domName SVGFEColorMatrixElement.values */
+  @DocsEditable
+  @DomName('SVGFEColorMatrixElement.values')
   AnimatedNumberList get values native "SVGFEColorMatrixElement_values_Getter";
 
-
-  /** @domName SVGFEColorMatrixElement.height */
+  @DocsEditable
+  @DomName('SVGFEColorMatrixElement.height')
   AnimatedLength get height native "SVGFEColorMatrixElement_height_Getter";
 
-
-  /** @domName SVGFEColorMatrixElement.result */
+  @DocsEditable
+  @DomName('SVGFEColorMatrixElement.result')
   AnimatedString get result native "SVGFEColorMatrixElement_result_Getter";
 
-
-  /** @domName SVGFEColorMatrixElement.width */
+  @DocsEditable
+  @DomName('SVGFEColorMatrixElement.width')
   AnimatedLength get width native "SVGFEColorMatrixElement_width_Getter";
 
-
-  /** @domName SVGFEColorMatrixElement.x */
+  @DocsEditable
+  @DomName('SVGFEColorMatrixElement.x')
   AnimatedLength get x native "SVGFEColorMatrixElement_x_Getter";
 
-
-  /** @domName SVGFEColorMatrixElement.y */
+  @DocsEditable
+  @DomName('SVGFEColorMatrixElement.y')
   AnimatedLength get y native "SVGFEColorMatrixElement_y_Getter";
 
-
-  /** @domName SVGFEColorMatrixElement.className */
+  @DocsEditable
+  @DomName('SVGFEColorMatrixElement.className')
   AnimatedString get $dom_svgClassName native "SVGFEColorMatrixElement_className_Getter";
 
-
-  /** @domName SVGFEColorMatrixElement.style */
+  @DocsEditable
+  @DomName('SVGFEColorMatrixElement.style')
   CssStyleDeclaration get style native "SVGFEColorMatrixElement_style_Getter";
 
-
-  /** @domName SVGFEColorMatrixElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFEColorMatrixElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFEColorMatrixElement_getPresentationAttribute_Callback";
 
 }
@@ -1749,44 +1785,45 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEComponentTransferElement
+@DocsEditable
+@DomName('SVGFEComponentTransferElement')
 class FEComponentTransferElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   FEComponentTransferElement.internal() : super.internal();
 
-
-  /** @domName SVGFEComponentTransferElement.in1 */
+  @DocsEditable
+  @DomName('SVGFEComponentTransferElement.in1')
   AnimatedString get in1 native "SVGFEComponentTransferElement_in1_Getter";
 
-
-  /** @domName SVGFEComponentTransferElement.height */
+  @DocsEditable
+  @DomName('SVGFEComponentTransferElement.height')
   AnimatedLength get height native "SVGFEComponentTransferElement_height_Getter";
 
-
-  /** @domName SVGFEComponentTransferElement.result */
+  @DocsEditable
+  @DomName('SVGFEComponentTransferElement.result')
   AnimatedString get result native "SVGFEComponentTransferElement_result_Getter";
 
-
-  /** @domName SVGFEComponentTransferElement.width */
+  @DocsEditable
+  @DomName('SVGFEComponentTransferElement.width')
   AnimatedLength get width native "SVGFEComponentTransferElement_width_Getter";
 
-
-  /** @domName SVGFEComponentTransferElement.x */
+  @DocsEditable
+  @DomName('SVGFEComponentTransferElement.x')
   AnimatedLength get x native "SVGFEComponentTransferElement_x_Getter";
 
-
-  /** @domName SVGFEComponentTransferElement.y */
+  @DocsEditable
+  @DomName('SVGFEComponentTransferElement.y')
   AnimatedLength get y native "SVGFEComponentTransferElement_y_Getter";
 
-
-  /** @domName SVGFEComponentTransferElement.className */
+  @DocsEditable
+  @DomName('SVGFEComponentTransferElement.className')
   AnimatedString get $dom_svgClassName native "SVGFEComponentTransferElement_className_Getter";
 
-
-  /** @domName SVGFEComponentTransferElement.style */
+  @DocsEditable
+  @DomName('SVGFEComponentTransferElement.style')
   CssStyleDeclaration get style native "SVGFEComponentTransferElement_style_Getter";
 
-
-  /** @domName SVGFEComponentTransferElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFEComponentTransferElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFEComponentTransferElement_getPresentationAttribute_Callback";
 
 }
@@ -1797,7 +1834,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFECompositeElement
+@DocsEditable
+@DomName('SVGFECompositeElement')
 class FECompositeElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   FECompositeElement.internal() : super.internal();
 
@@ -1815,64 +1853,64 @@
 
   static const int SVG_FECOMPOSITE_OPERATOR_XOR = 5;
 
-
-  /** @domName SVGFECompositeElement.in1 */
+  @DocsEditable
+  @DomName('SVGFECompositeElement.in1')
   AnimatedString get in1 native "SVGFECompositeElement_in1_Getter";
 
-
-  /** @domName SVGFECompositeElement.in2 */
+  @DocsEditable
+  @DomName('SVGFECompositeElement.in2')
   AnimatedString get in2 native "SVGFECompositeElement_in2_Getter";
 
-
-  /** @domName SVGFECompositeElement.k1 */
+  @DocsEditable
+  @DomName('SVGFECompositeElement.k1')
   AnimatedNumber get k1 native "SVGFECompositeElement_k1_Getter";
 
-
-  /** @domName SVGFECompositeElement.k2 */
+  @DocsEditable
+  @DomName('SVGFECompositeElement.k2')
   AnimatedNumber get k2 native "SVGFECompositeElement_k2_Getter";
 
-
-  /** @domName SVGFECompositeElement.k3 */
+  @DocsEditable
+  @DomName('SVGFECompositeElement.k3')
   AnimatedNumber get k3 native "SVGFECompositeElement_k3_Getter";
 
-
-  /** @domName SVGFECompositeElement.k4 */
+  @DocsEditable
+  @DomName('SVGFECompositeElement.k4')
   AnimatedNumber get k4 native "SVGFECompositeElement_k4_Getter";
 
-
-  /** @domName SVGFECompositeElement.operator */
+  @DocsEditable
+  @DomName('SVGFECompositeElement.operator')
   AnimatedEnumeration get operator native "SVGFECompositeElement_operator_Getter";
 
-
-  /** @domName SVGFECompositeElement.height */
+  @DocsEditable
+  @DomName('SVGFECompositeElement.height')
   AnimatedLength get height native "SVGFECompositeElement_height_Getter";
 
-
-  /** @domName SVGFECompositeElement.result */
+  @DocsEditable
+  @DomName('SVGFECompositeElement.result')
   AnimatedString get result native "SVGFECompositeElement_result_Getter";
 
-
-  /** @domName SVGFECompositeElement.width */
+  @DocsEditable
+  @DomName('SVGFECompositeElement.width')
   AnimatedLength get width native "SVGFECompositeElement_width_Getter";
 
-
-  /** @domName SVGFECompositeElement.x */
+  @DocsEditable
+  @DomName('SVGFECompositeElement.x')
   AnimatedLength get x native "SVGFECompositeElement_x_Getter";
 
-
-  /** @domName SVGFECompositeElement.y */
+  @DocsEditable
+  @DomName('SVGFECompositeElement.y')
   AnimatedLength get y native "SVGFECompositeElement_y_Getter";
 
-
-  /** @domName SVGFECompositeElement.className */
+  @DocsEditable
+  @DomName('SVGFECompositeElement.className')
   AnimatedString get $dom_svgClassName native "SVGFECompositeElement_className_Getter";
 
-
-  /** @domName SVGFECompositeElement.style */
+  @DocsEditable
+  @DomName('SVGFECompositeElement.style')
   CssStyleDeclaration get style native "SVGFECompositeElement_style_Getter";
 
-
-  /** @domName SVGFECompositeElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFECompositeElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFECompositeElement_getPresentationAttribute_Callback";
 
 }
@@ -1883,7 +1921,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEConvolveMatrixElement
+@DocsEditable
+@DomName('SVGFEConvolveMatrixElement')
 class FEConvolveMatrixElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   FEConvolveMatrixElement.internal() : super.internal();
 
@@ -1895,84 +1934,84 @@
 
   static const int SVG_EDGEMODE_WRAP = 2;
 
-
-  /** @domName SVGFEConvolveMatrixElement.bias */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.bias')
   AnimatedNumber get bias native "SVGFEConvolveMatrixElement_bias_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.divisor */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.divisor')
   AnimatedNumber get divisor native "SVGFEConvolveMatrixElement_divisor_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.edgeMode */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.edgeMode')
   AnimatedEnumeration get edgeMode native "SVGFEConvolveMatrixElement_edgeMode_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.in1 */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.in1')
   AnimatedString get in1 native "SVGFEConvolveMatrixElement_in1_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.kernelMatrix */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.kernelMatrix')
   AnimatedNumberList get kernelMatrix native "SVGFEConvolveMatrixElement_kernelMatrix_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.kernelUnitLengthX */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.kernelUnitLengthX')
   AnimatedNumber get kernelUnitLengthX native "SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.kernelUnitLengthY */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.kernelUnitLengthY')
   AnimatedNumber get kernelUnitLengthY native "SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.orderX */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.orderX')
   AnimatedInteger get orderX native "SVGFEConvolveMatrixElement_orderX_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.orderY */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.orderY')
   AnimatedInteger get orderY native "SVGFEConvolveMatrixElement_orderY_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.preserveAlpha */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.preserveAlpha')
   AnimatedBoolean get preserveAlpha native "SVGFEConvolveMatrixElement_preserveAlpha_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.targetX */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.targetX')
   AnimatedInteger get targetX native "SVGFEConvolveMatrixElement_targetX_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.targetY */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.targetY')
   AnimatedInteger get targetY native "SVGFEConvolveMatrixElement_targetY_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.height */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.height')
   AnimatedLength get height native "SVGFEConvolveMatrixElement_height_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.result */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.result')
   AnimatedString get result native "SVGFEConvolveMatrixElement_result_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.width */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.width')
   AnimatedLength get width native "SVGFEConvolveMatrixElement_width_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.x */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.x')
   AnimatedLength get x native "SVGFEConvolveMatrixElement_x_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.y */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.y')
   AnimatedLength get y native "SVGFEConvolveMatrixElement_y_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.className */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.className')
   AnimatedString get $dom_svgClassName native "SVGFEConvolveMatrixElement_className_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.style */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.style')
   CssStyleDeclaration get style native "SVGFEConvolveMatrixElement_style_Getter";
 
-
-  /** @domName SVGFEConvolveMatrixElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFEConvolveMatrixElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFEConvolveMatrixElement_getPresentationAttribute_Callback";
 
 }
@@ -1983,60 +2022,61 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEDiffuseLightingElement
+@DocsEditable
+@DomName('SVGFEDiffuseLightingElement')
 class FEDiffuseLightingElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   FEDiffuseLightingElement.internal() : super.internal();
 
-
-  /** @domName SVGFEDiffuseLightingElement.diffuseConstant */
+  @DocsEditable
+  @DomName('SVGFEDiffuseLightingElement.diffuseConstant')
   AnimatedNumber get diffuseConstant native "SVGFEDiffuseLightingElement_diffuseConstant_Getter";
 
-
-  /** @domName SVGFEDiffuseLightingElement.in1 */
+  @DocsEditable
+  @DomName('SVGFEDiffuseLightingElement.in1')
   AnimatedString get in1 native "SVGFEDiffuseLightingElement_in1_Getter";
 
-
-  /** @domName SVGFEDiffuseLightingElement.kernelUnitLengthX */
+  @DocsEditable
+  @DomName('SVGFEDiffuseLightingElement.kernelUnitLengthX')
   AnimatedNumber get kernelUnitLengthX native "SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter";
 
-
-  /** @domName SVGFEDiffuseLightingElement.kernelUnitLengthY */
+  @DocsEditable
+  @DomName('SVGFEDiffuseLightingElement.kernelUnitLengthY')
   AnimatedNumber get kernelUnitLengthY native "SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter";
 
-
-  /** @domName SVGFEDiffuseLightingElement.surfaceScale */
+  @DocsEditable
+  @DomName('SVGFEDiffuseLightingElement.surfaceScale')
   AnimatedNumber get surfaceScale native "SVGFEDiffuseLightingElement_surfaceScale_Getter";
 
-
-  /** @domName SVGFEDiffuseLightingElement.height */
+  @DocsEditable
+  @DomName('SVGFEDiffuseLightingElement.height')
   AnimatedLength get height native "SVGFEDiffuseLightingElement_height_Getter";
 
-
-  /** @domName SVGFEDiffuseLightingElement.result */
+  @DocsEditable
+  @DomName('SVGFEDiffuseLightingElement.result')
   AnimatedString get result native "SVGFEDiffuseLightingElement_result_Getter";
 
-
-  /** @domName SVGFEDiffuseLightingElement.width */
+  @DocsEditable
+  @DomName('SVGFEDiffuseLightingElement.width')
   AnimatedLength get width native "SVGFEDiffuseLightingElement_width_Getter";
 
-
-  /** @domName SVGFEDiffuseLightingElement.x */
+  @DocsEditable
+  @DomName('SVGFEDiffuseLightingElement.x')
   AnimatedLength get x native "SVGFEDiffuseLightingElement_x_Getter";
 
-
-  /** @domName SVGFEDiffuseLightingElement.y */
+  @DocsEditable
+  @DomName('SVGFEDiffuseLightingElement.y')
   AnimatedLength get y native "SVGFEDiffuseLightingElement_y_Getter";
 
-
-  /** @domName SVGFEDiffuseLightingElement.className */
+  @DocsEditable
+  @DomName('SVGFEDiffuseLightingElement.className')
   AnimatedString get $dom_svgClassName native "SVGFEDiffuseLightingElement_className_Getter";
 
-
-  /** @domName SVGFEDiffuseLightingElement.style */
+  @DocsEditable
+  @DomName('SVGFEDiffuseLightingElement.style')
   CssStyleDeclaration get style native "SVGFEDiffuseLightingElement_style_Getter";
 
-
-  /** @domName SVGFEDiffuseLightingElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFEDiffuseLightingElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFEDiffuseLightingElement_getPresentationAttribute_Callback";
 
 }
@@ -2047,7 +2087,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEDisplacementMapElement
+@DocsEditable
+@DomName('SVGFEDisplacementMapElement')
 class FEDisplacementMapElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   FEDisplacementMapElement.internal() : super.internal();
 
@@ -2061,56 +2102,56 @@
 
   static const int SVG_CHANNEL_UNKNOWN = 0;
 
-
-  /** @domName SVGFEDisplacementMapElement.in1 */
+  @DocsEditable
+  @DomName('SVGFEDisplacementMapElement.in1')
   AnimatedString get in1 native "SVGFEDisplacementMapElement_in1_Getter";
 
-
-  /** @domName SVGFEDisplacementMapElement.in2 */
+  @DocsEditable
+  @DomName('SVGFEDisplacementMapElement.in2')
   AnimatedString get in2 native "SVGFEDisplacementMapElement_in2_Getter";
 
-
-  /** @domName SVGFEDisplacementMapElement.scale */
+  @DocsEditable
+  @DomName('SVGFEDisplacementMapElement.scale')
   AnimatedNumber get scale native "SVGFEDisplacementMapElement_scale_Getter";
 
-
-  /** @domName SVGFEDisplacementMapElement.xChannelSelector */
+  @DocsEditable
+  @DomName('SVGFEDisplacementMapElement.xChannelSelector')
   AnimatedEnumeration get xChannelSelector native "SVGFEDisplacementMapElement_xChannelSelector_Getter";
 
-
-  /** @domName SVGFEDisplacementMapElement.yChannelSelector */
+  @DocsEditable
+  @DomName('SVGFEDisplacementMapElement.yChannelSelector')
   AnimatedEnumeration get yChannelSelector native "SVGFEDisplacementMapElement_yChannelSelector_Getter";
 
-
-  /** @domName SVGFEDisplacementMapElement.height */
+  @DocsEditable
+  @DomName('SVGFEDisplacementMapElement.height')
   AnimatedLength get height native "SVGFEDisplacementMapElement_height_Getter";
 
-
-  /** @domName SVGFEDisplacementMapElement.result */
+  @DocsEditable
+  @DomName('SVGFEDisplacementMapElement.result')
   AnimatedString get result native "SVGFEDisplacementMapElement_result_Getter";
 
-
-  /** @domName SVGFEDisplacementMapElement.width */
+  @DocsEditable
+  @DomName('SVGFEDisplacementMapElement.width')
   AnimatedLength get width native "SVGFEDisplacementMapElement_width_Getter";
 
-
-  /** @domName SVGFEDisplacementMapElement.x */
+  @DocsEditable
+  @DomName('SVGFEDisplacementMapElement.x')
   AnimatedLength get x native "SVGFEDisplacementMapElement_x_Getter";
 
-
-  /** @domName SVGFEDisplacementMapElement.y */
+  @DocsEditable
+  @DomName('SVGFEDisplacementMapElement.y')
   AnimatedLength get y native "SVGFEDisplacementMapElement_y_Getter";
 
-
-  /** @domName SVGFEDisplacementMapElement.className */
+  @DocsEditable
+  @DomName('SVGFEDisplacementMapElement.className')
   AnimatedString get $dom_svgClassName native "SVGFEDisplacementMapElement_className_Getter";
 
-
-  /** @domName SVGFEDisplacementMapElement.style */
+  @DocsEditable
+  @DomName('SVGFEDisplacementMapElement.style')
   CssStyleDeclaration get style native "SVGFEDisplacementMapElement_style_Getter";
 
-
-  /** @domName SVGFEDisplacementMapElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFEDisplacementMapElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFEDisplacementMapElement_getPresentationAttribute_Callback";
 
 }
@@ -2121,16 +2162,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEDistantLightElement
+@DocsEditable
+@DomName('SVGFEDistantLightElement')
 class FEDistantLightElement extends SvgElement {
   FEDistantLightElement.internal() : super.internal();
 
-
-  /** @domName SVGFEDistantLightElement.azimuth */
+  @DocsEditable
+  @DomName('SVGFEDistantLightElement.azimuth')
   AnimatedNumber get azimuth native "SVGFEDistantLightElement_azimuth_Getter";
 
-
-  /** @domName SVGFEDistantLightElement.elevation */
+  @DocsEditable
+  @DomName('SVGFEDistantLightElement.elevation')
   AnimatedNumber get elevation native "SVGFEDistantLightElement_elevation_Getter";
 
 }
@@ -2141,64 +2183,65 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEDropShadowElement
+@DocsEditable
+@DomName('SVGFEDropShadowElement')
 class FEDropShadowElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   FEDropShadowElement.internal() : super.internal();
 
-
-  /** @domName SVGFEDropShadowElement.dx */
+  @DocsEditable
+  @DomName('SVGFEDropShadowElement.dx')
   AnimatedNumber get dx native "SVGFEDropShadowElement_dx_Getter";
 
-
-  /** @domName SVGFEDropShadowElement.dy */
+  @DocsEditable
+  @DomName('SVGFEDropShadowElement.dy')
   AnimatedNumber get dy native "SVGFEDropShadowElement_dy_Getter";
 
-
-  /** @domName SVGFEDropShadowElement.in1 */
+  @DocsEditable
+  @DomName('SVGFEDropShadowElement.in1')
   AnimatedString get in1 native "SVGFEDropShadowElement_in1_Getter";
 
-
-  /** @domName SVGFEDropShadowElement.stdDeviationX */
+  @DocsEditable
+  @DomName('SVGFEDropShadowElement.stdDeviationX')
   AnimatedNumber get stdDeviationX native "SVGFEDropShadowElement_stdDeviationX_Getter";
 
-
-  /** @domName SVGFEDropShadowElement.stdDeviationY */
+  @DocsEditable
+  @DomName('SVGFEDropShadowElement.stdDeviationY')
   AnimatedNumber get stdDeviationY native "SVGFEDropShadowElement_stdDeviationY_Getter";
 
-
-  /** @domName SVGFEDropShadowElement.setStdDeviation */
+  @DocsEditable
+  @DomName('SVGFEDropShadowElement.setStdDeviation')
   void setStdDeviation(num stdDeviationX, num stdDeviationY) native "SVGFEDropShadowElement_setStdDeviation_Callback";
 
-
-  /** @domName SVGFEDropShadowElement.height */
+  @DocsEditable
+  @DomName('SVGFEDropShadowElement.height')
   AnimatedLength get height native "SVGFEDropShadowElement_height_Getter";
 
-
-  /** @domName SVGFEDropShadowElement.result */
+  @DocsEditable
+  @DomName('SVGFEDropShadowElement.result')
   AnimatedString get result native "SVGFEDropShadowElement_result_Getter";
 
-
-  /** @domName SVGFEDropShadowElement.width */
+  @DocsEditable
+  @DomName('SVGFEDropShadowElement.width')
   AnimatedLength get width native "SVGFEDropShadowElement_width_Getter";
 
-
-  /** @domName SVGFEDropShadowElement.x */
+  @DocsEditable
+  @DomName('SVGFEDropShadowElement.x')
   AnimatedLength get x native "SVGFEDropShadowElement_x_Getter";
 
-
-  /** @domName SVGFEDropShadowElement.y */
+  @DocsEditable
+  @DomName('SVGFEDropShadowElement.y')
   AnimatedLength get y native "SVGFEDropShadowElement_y_Getter";
 
-
-  /** @domName SVGFEDropShadowElement.className */
+  @DocsEditable
+  @DomName('SVGFEDropShadowElement.className')
   AnimatedString get $dom_svgClassName native "SVGFEDropShadowElement_className_Getter";
 
-
-  /** @domName SVGFEDropShadowElement.style */
+  @DocsEditable
+  @DomName('SVGFEDropShadowElement.style')
   CssStyleDeclaration get style native "SVGFEDropShadowElement_style_Getter";
 
-
-  /** @domName SVGFEDropShadowElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFEDropShadowElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFEDropShadowElement_getPresentationAttribute_Callback";
 
 }
@@ -2209,40 +2252,41 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEFloodElement
+@DocsEditable
+@DomName('SVGFEFloodElement')
 class FEFloodElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   FEFloodElement.internal() : super.internal();
 
-
-  /** @domName SVGFEFloodElement.height */
+  @DocsEditable
+  @DomName('SVGFEFloodElement.height')
   AnimatedLength get height native "SVGFEFloodElement_height_Getter";
 
-
-  /** @domName SVGFEFloodElement.result */
+  @DocsEditable
+  @DomName('SVGFEFloodElement.result')
   AnimatedString get result native "SVGFEFloodElement_result_Getter";
 
-
-  /** @domName SVGFEFloodElement.width */
+  @DocsEditable
+  @DomName('SVGFEFloodElement.width')
   AnimatedLength get width native "SVGFEFloodElement_width_Getter";
 
-
-  /** @domName SVGFEFloodElement.x */
+  @DocsEditable
+  @DomName('SVGFEFloodElement.x')
   AnimatedLength get x native "SVGFEFloodElement_x_Getter";
 
-
-  /** @domName SVGFEFloodElement.y */
+  @DocsEditable
+  @DomName('SVGFEFloodElement.y')
   AnimatedLength get y native "SVGFEFloodElement_y_Getter";
 
-
-  /** @domName SVGFEFloodElement.className */
+  @DocsEditable
+  @DomName('SVGFEFloodElement.className')
   AnimatedString get $dom_svgClassName native "SVGFEFloodElement_className_Getter";
 
-
-  /** @domName SVGFEFloodElement.style */
+  @DocsEditable
+  @DomName('SVGFEFloodElement.style')
   CssStyleDeclaration get style native "SVGFEFloodElement_style_Getter";
 
-
-  /** @domName SVGFEFloodElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFEFloodElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFEFloodElement_getPresentationAttribute_Callback";
 
 }
@@ -2253,7 +2297,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEFuncAElement
+@DocsEditable
+@DomName('SVGFEFuncAElement')
 class FEFuncAElement extends ComponentTransferFunctionElement {
   FEFuncAElement.internal() : super.internal();
 
@@ -2265,7 +2310,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEFuncBElement
+@DocsEditable
+@DomName('SVGFEFuncBElement')
 class FEFuncBElement extends ComponentTransferFunctionElement {
   FEFuncBElement.internal() : super.internal();
 
@@ -2277,7 +2323,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEFuncGElement
+@DocsEditable
+@DomName('SVGFEFuncGElement')
 class FEFuncGElement extends ComponentTransferFunctionElement {
   FEFuncGElement.internal() : super.internal();
 
@@ -2289,7 +2336,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEFuncRElement
+@DocsEditable
+@DomName('SVGFEFuncRElement')
 class FEFuncRElement extends ComponentTransferFunctionElement {
   FEFuncRElement.internal() : super.internal();
 
@@ -2301,56 +2349,57 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEGaussianBlurElement
+@DocsEditable
+@DomName('SVGFEGaussianBlurElement')
 class FEGaussianBlurElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   FEGaussianBlurElement.internal() : super.internal();
 
-
-  /** @domName SVGFEGaussianBlurElement.in1 */
+  @DocsEditable
+  @DomName('SVGFEGaussianBlurElement.in1')
   AnimatedString get in1 native "SVGFEGaussianBlurElement_in1_Getter";
 
-
-  /** @domName SVGFEGaussianBlurElement.stdDeviationX */
+  @DocsEditable
+  @DomName('SVGFEGaussianBlurElement.stdDeviationX')
   AnimatedNumber get stdDeviationX native "SVGFEGaussianBlurElement_stdDeviationX_Getter";
 
-
-  /** @domName SVGFEGaussianBlurElement.stdDeviationY */
+  @DocsEditable
+  @DomName('SVGFEGaussianBlurElement.stdDeviationY')
   AnimatedNumber get stdDeviationY native "SVGFEGaussianBlurElement_stdDeviationY_Getter";
 
-
-  /** @domName SVGFEGaussianBlurElement.setStdDeviation */
+  @DocsEditable
+  @DomName('SVGFEGaussianBlurElement.setStdDeviation')
   void setStdDeviation(num stdDeviationX, num stdDeviationY) native "SVGFEGaussianBlurElement_setStdDeviation_Callback";
 
-
-  /** @domName SVGFEGaussianBlurElement.height */
+  @DocsEditable
+  @DomName('SVGFEGaussianBlurElement.height')
   AnimatedLength get height native "SVGFEGaussianBlurElement_height_Getter";
 
-
-  /** @domName SVGFEGaussianBlurElement.result */
+  @DocsEditable
+  @DomName('SVGFEGaussianBlurElement.result')
   AnimatedString get result native "SVGFEGaussianBlurElement_result_Getter";
 
-
-  /** @domName SVGFEGaussianBlurElement.width */
+  @DocsEditable
+  @DomName('SVGFEGaussianBlurElement.width')
   AnimatedLength get width native "SVGFEGaussianBlurElement_width_Getter";
 
-
-  /** @domName SVGFEGaussianBlurElement.x */
+  @DocsEditable
+  @DomName('SVGFEGaussianBlurElement.x')
   AnimatedLength get x native "SVGFEGaussianBlurElement_x_Getter";
 
-
-  /** @domName SVGFEGaussianBlurElement.y */
+  @DocsEditable
+  @DomName('SVGFEGaussianBlurElement.y')
   AnimatedLength get y native "SVGFEGaussianBlurElement_y_Getter";
 
-
-  /** @domName SVGFEGaussianBlurElement.className */
+  @DocsEditable
+  @DomName('SVGFEGaussianBlurElement.className')
   AnimatedString get $dom_svgClassName native "SVGFEGaussianBlurElement_className_Getter";
 
-
-  /** @domName SVGFEGaussianBlurElement.style */
+  @DocsEditable
+  @DomName('SVGFEGaussianBlurElement.style')
   CssStyleDeclaration get style native "SVGFEGaussianBlurElement_style_Getter";
 
-
-  /** @domName SVGFEGaussianBlurElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFEGaussianBlurElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFEGaussianBlurElement_getPresentationAttribute_Callback";
 
 }
@@ -2361,68 +2410,69 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEImageElement
+@DocsEditable
+@DomName('SVGFEImageElement')
 class FEImageElement extends SvgElement implements FilterPrimitiveStandardAttributes, UriReference, ExternalResourcesRequired, LangSpace {
   FEImageElement.internal() : super.internal();
 
-
-  /** @domName SVGFEImageElement.preserveAspectRatio */
+  @DocsEditable
+  @DomName('SVGFEImageElement.preserveAspectRatio')
   AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGFEImageElement_preserveAspectRatio_Getter";
 
-
-  /** @domName SVGFEImageElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGFEImageElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGFEImageElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGFEImageElement.height */
+  @DocsEditable
+  @DomName('SVGFEImageElement.height')
   AnimatedLength get height native "SVGFEImageElement_height_Getter";
 
-
-  /** @domName SVGFEImageElement.result */
+  @DocsEditable
+  @DomName('SVGFEImageElement.result')
   AnimatedString get result native "SVGFEImageElement_result_Getter";
 
-
-  /** @domName SVGFEImageElement.width */
+  @DocsEditable
+  @DomName('SVGFEImageElement.width')
   AnimatedLength get width native "SVGFEImageElement_width_Getter";
 
-
-  /** @domName SVGFEImageElement.x */
+  @DocsEditable
+  @DomName('SVGFEImageElement.x')
   AnimatedLength get x native "SVGFEImageElement_x_Getter";
 
-
-  /** @domName SVGFEImageElement.y */
+  @DocsEditable
+  @DomName('SVGFEImageElement.y')
   AnimatedLength get y native "SVGFEImageElement_y_Getter";
 
-
-  /** @domName SVGFEImageElement.xmllang */
+  @DocsEditable
+  @DomName('SVGFEImageElement.xmllang')
   String get xmllang native "SVGFEImageElement_xmllang_Getter";
 
-
-  /** @domName SVGFEImageElement.xmllang */
+  @DocsEditable
+  @DomName('SVGFEImageElement.xmllang')
   void set xmllang(String value) native "SVGFEImageElement_xmllang_Setter";
 
-
-  /** @domName SVGFEImageElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGFEImageElement.xmlspace')
   String get xmlspace native "SVGFEImageElement_xmlspace_Getter";
 
-
-  /** @domName SVGFEImageElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGFEImageElement.xmlspace')
   void set xmlspace(String value) native "SVGFEImageElement_xmlspace_Setter";
 
-
-  /** @domName SVGFEImageElement.className */
+  @DocsEditable
+  @DomName('SVGFEImageElement.className')
   AnimatedString get $dom_svgClassName native "SVGFEImageElement_className_Getter";
 
-
-  /** @domName SVGFEImageElement.style */
+  @DocsEditable
+  @DomName('SVGFEImageElement.style')
   CssStyleDeclaration get style native "SVGFEImageElement_style_Getter";
 
-
-  /** @domName SVGFEImageElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFEImageElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFEImageElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGFEImageElement.href */
+  @DocsEditable
+  @DomName('SVGFEImageElement.href')
   AnimatedString get href native "SVGFEImageElement_href_Getter";
 
 }
@@ -2433,40 +2483,41 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEMergeElement
+@DocsEditable
+@DomName('SVGFEMergeElement')
 class FEMergeElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   FEMergeElement.internal() : super.internal();
 
-
-  /** @domName SVGFEMergeElement.height */
+  @DocsEditable
+  @DomName('SVGFEMergeElement.height')
   AnimatedLength get height native "SVGFEMergeElement_height_Getter";
 
-
-  /** @domName SVGFEMergeElement.result */
+  @DocsEditable
+  @DomName('SVGFEMergeElement.result')
   AnimatedString get result native "SVGFEMergeElement_result_Getter";
 
-
-  /** @domName SVGFEMergeElement.width */
+  @DocsEditable
+  @DomName('SVGFEMergeElement.width')
   AnimatedLength get width native "SVGFEMergeElement_width_Getter";
 
-
-  /** @domName SVGFEMergeElement.x */
+  @DocsEditable
+  @DomName('SVGFEMergeElement.x')
   AnimatedLength get x native "SVGFEMergeElement_x_Getter";
 
-
-  /** @domName SVGFEMergeElement.y */
+  @DocsEditable
+  @DomName('SVGFEMergeElement.y')
   AnimatedLength get y native "SVGFEMergeElement_y_Getter";
 
-
-  /** @domName SVGFEMergeElement.className */
+  @DocsEditable
+  @DomName('SVGFEMergeElement.className')
   AnimatedString get $dom_svgClassName native "SVGFEMergeElement_className_Getter";
 
-
-  /** @domName SVGFEMergeElement.style */
+  @DocsEditable
+  @DomName('SVGFEMergeElement.style')
   CssStyleDeclaration get style native "SVGFEMergeElement_style_Getter";
 
-
-  /** @domName SVGFEMergeElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFEMergeElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFEMergeElement_getPresentationAttribute_Callback";
 
 }
@@ -2477,12 +2528,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEMergeNodeElement
+@DocsEditable
+@DomName('SVGFEMergeNodeElement')
 class FEMergeNodeElement extends SvgElement {
   FEMergeNodeElement.internal() : super.internal();
 
-
-  /** @domName SVGFEMergeNodeElement.in1 */
+  @DocsEditable
+  @DomName('SVGFEMergeNodeElement.in1')
   AnimatedString get in1 native "SVGFEMergeNodeElement_in1_Getter";
 
 }
@@ -2493,7 +2545,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEMorphologyElement
+@DocsEditable
+@DomName('SVGFEMorphologyElement')
 class FEMorphologyElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   FEMorphologyElement.internal() : super.internal();
 
@@ -2503,56 +2556,56 @@
 
   static const int SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
 
-
-  /** @domName SVGFEMorphologyElement.in1 */
+  @DocsEditable
+  @DomName('SVGFEMorphologyElement.in1')
   AnimatedString get in1 native "SVGFEMorphologyElement_in1_Getter";
 
-
-  /** @domName SVGFEMorphologyElement.operator */
+  @DocsEditable
+  @DomName('SVGFEMorphologyElement.operator')
   AnimatedEnumeration get operator native "SVGFEMorphologyElement_operator_Getter";
 
-
-  /** @domName SVGFEMorphologyElement.radiusX */
+  @DocsEditable
+  @DomName('SVGFEMorphologyElement.radiusX')
   AnimatedNumber get radiusX native "SVGFEMorphologyElement_radiusX_Getter";
 
-
-  /** @domName SVGFEMorphologyElement.radiusY */
+  @DocsEditable
+  @DomName('SVGFEMorphologyElement.radiusY')
   AnimatedNumber get radiusY native "SVGFEMorphologyElement_radiusY_Getter";
 
-
-  /** @domName SVGFEMorphologyElement.setRadius */
+  @DocsEditable
+  @DomName('SVGFEMorphologyElement.setRadius')
   void setRadius(num radiusX, num radiusY) native "SVGFEMorphologyElement_setRadius_Callback";
 
-
-  /** @domName SVGFEMorphologyElement.height */
+  @DocsEditable
+  @DomName('SVGFEMorphologyElement.height')
   AnimatedLength get height native "SVGFEMorphologyElement_height_Getter";
 
-
-  /** @domName SVGFEMorphologyElement.result */
+  @DocsEditable
+  @DomName('SVGFEMorphologyElement.result')
   AnimatedString get result native "SVGFEMorphologyElement_result_Getter";
 
-
-  /** @domName SVGFEMorphologyElement.width */
+  @DocsEditable
+  @DomName('SVGFEMorphologyElement.width')
   AnimatedLength get width native "SVGFEMorphologyElement_width_Getter";
 
-
-  /** @domName SVGFEMorphologyElement.x */
+  @DocsEditable
+  @DomName('SVGFEMorphologyElement.x')
   AnimatedLength get x native "SVGFEMorphologyElement_x_Getter";
 
-
-  /** @domName SVGFEMorphologyElement.y */
+  @DocsEditable
+  @DomName('SVGFEMorphologyElement.y')
   AnimatedLength get y native "SVGFEMorphologyElement_y_Getter";
 
-
-  /** @domName SVGFEMorphologyElement.className */
+  @DocsEditable
+  @DomName('SVGFEMorphologyElement.className')
   AnimatedString get $dom_svgClassName native "SVGFEMorphologyElement_className_Getter";
 
-
-  /** @domName SVGFEMorphologyElement.style */
+  @DocsEditable
+  @DomName('SVGFEMorphologyElement.style')
   CssStyleDeclaration get style native "SVGFEMorphologyElement_style_Getter";
 
-
-  /** @domName SVGFEMorphologyElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFEMorphologyElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFEMorphologyElement_getPresentationAttribute_Callback";
 
 }
@@ -2563,52 +2616,53 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEOffsetElement
+@DocsEditable
+@DomName('SVGFEOffsetElement')
 class FEOffsetElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   FEOffsetElement.internal() : super.internal();
 
-
-  /** @domName SVGFEOffsetElement.dx */
+  @DocsEditable
+  @DomName('SVGFEOffsetElement.dx')
   AnimatedNumber get dx native "SVGFEOffsetElement_dx_Getter";
 
-
-  /** @domName SVGFEOffsetElement.dy */
+  @DocsEditable
+  @DomName('SVGFEOffsetElement.dy')
   AnimatedNumber get dy native "SVGFEOffsetElement_dy_Getter";
 
-
-  /** @domName SVGFEOffsetElement.in1 */
+  @DocsEditable
+  @DomName('SVGFEOffsetElement.in1')
   AnimatedString get in1 native "SVGFEOffsetElement_in1_Getter";
 
-
-  /** @domName SVGFEOffsetElement.height */
+  @DocsEditable
+  @DomName('SVGFEOffsetElement.height')
   AnimatedLength get height native "SVGFEOffsetElement_height_Getter";
 
-
-  /** @domName SVGFEOffsetElement.result */
+  @DocsEditable
+  @DomName('SVGFEOffsetElement.result')
   AnimatedString get result native "SVGFEOffsetElement_result_Getter";
 
-
-  /** @domName SVGFEOffsetElement.width */
+  @DocsEditable
+  @DomName('SVGFEOffsetElement.width')
   AnimatedLength get width native "SVGFEOffsetElement_width_Getter";
 
-
-  /** @domName SVGFEOffsetElement.x */
+  @DocsEditable
+  @DomName('SVGFEOffsetElement.x')
   AnimatedLength get x native "SVGFEOffsetElement_x_Getter";
 
-
-  /** @domName SVGFEOffsetElement.y */
+  @DocsEditable
+  @DomName('SVGFEOffsetElement.y')
   AnimatedLength get y native "SVGFEOffsetElement_y_Getter";
 
-
-  /** @domName SVGFEOffsetElement.className */
+  @DocsEditable
+  @DomName('SVGFEOffsetElement.className')
   AnimatedString get $dom_svgClassName native "SVGFEOffsetElement_className_Getter";
 
-
-  /** @domName SVGFEOffsetElement.style */
+  @DocsEditable
+  @DomName('SVGFEOffsetElement.style')
   CssStyleDeclaration get style native "SVGFEOffsetElement_style_Getter";
 
-
-  /** @domName SVGFEOffsetElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFEOffsetElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFEOffsetElement_getPresentationAttribute_Callback";
 
 }
@@ -2619,20 +2673,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFEPointLightElement
+@DocsEditable
+@DomName('SVGFEPointLightElement')
 class FEPointLightElement extends SvgElement {
   FEPointLightElement.internal() : super.internal();
 
-
-  /** @domName SVGFEPointLightElement.x */
+  @DocsEditable
+  @DomName('SVGFEPointLightElement.x')
   AnimatedNumber get x native "SVGFEPointLightElement_x_Getter";
 
-
-  /** @domName SVGFEPointLightElement.y */
+  @DocsEditable
+  @DomName('SVGFEPointLightElement.y')
   AnimatedNumber get y native "SVGFEPointLightElement_y_Getter";
 
-
-  /** @domName SVGFEPointLightElement.z */
+  @DocsEditable
+  @DomName('SVGFEPointLightElement.z')
   AnimatedNumber get z native "SVGFEPointLightElement_z_Getter";
 
 }
@@ -2643,56 +2698,57 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFESpecularLightingElement
+@DocsEditable
+@DomName('SVGFESpecularLightingElement')
 class FESpecularLightingElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   FESpecularLightingElement.internal() : super.internal();
 
-
-  /** @domName SVGFESpecularLightingElement.in1 */
+  @DocsEditable
+  @DomName('SVGFESpecularLightingElement.in1')
   AnimatedString get in1 native "SVGFESpecularLightingElement_in1_Getter";
 
-
-  /** @domName SVGFESpecularLightingElement.specularConstant */
+  @DocsEditable
+  @DomName('SVGFESpecularLightingElement.specularConstant')
   AnimatedNumber get specularConstant native "SVGFESpecularLightingElement_specularConstant_Getter";
 
-
-  /** @domName SVGFESpecularLightingElement.specularExponent */
+  @DocsEditable
+  @DomName('SVGFESpecularLightingElement.specularExponent')
   AnimatedNumber get specularExponent native "SVGFESpecularLightingElement_specularExponent_Getter";
 
-
-  /** @domName SVGFESpecularLightingElement.surfaceScale */
+  @DocsEditable
+  @DomName('SVGFESpecularLightingElement.surfaceScale')
   AnimatedNumber get surfaceScale native "SVGFESpecularLightingElement_surfaceScale_Getter";
 
-
-  /** @domName SVGFESpecularLightingElement.height */
+  @DocsEditable
+  @DomName('SVGFESpecularLightingElement.height')
   AnimatedLength get height native "SVGFESpecularLightingElement_height_Getter";
 
-
-  /** @domName SVGFESpecularLightingElement.result */
+  @DocsEditable
+  @DomName('SVGFESpecularLightingElement.result')
   AnimatedString get result native "SVGFESpecularLightingElement_result_Getter";
 
-
-  /** @domName SVGFESpecularLightingElement.width */
+  @DocsEditable
+  @DomName('SVGFESpecularLightingElement.width')
   AnimatedLength get width native "SVGFESpecularLightingElement_width_Getter";
 
-
-  /** @domName SVGFESpecularLightingElement.x */
+  @DocsEditable
+  @DomName('SVGFESpecularLightingElement.x')
   AnimatedLength get x native "SVGFESpecularLightingElement_x_Getter";
 
-
-  /** @domName SVGFESpecularLightingElement.y */
+  @DocsEditable
+  @DomName('SVGFESpecularLightingElement.y')
   AnimatedLength get y native "SVGFESpecularLightingElement_y_Getter";
 
-
-  /** @domName SVGFESpecularLightingElement.className */
+  @DocsEditable
+  @DomName('SVGFESpecularLightingElement.className')
   AnimatedString get $dom_svgClassName native "SVGFESpecularLightingElement_className_Getter";
 
-
-  /** @domName SVGFESpecularLightingElement.style */
+  @DocsEditable
+  @DomName('SVGFESpecularLightingElement.style')
   CssStyleDeclaration get style native "SVGFESpecularLightingElement_style_Getter";
 
-
-  /** @domName SVGFESpecularLightingElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFESpecularLightingElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFESpecularLightingElement_getPresentationAttribute_Callback";
 
 }
@@ -2703,40 +2759,41 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFESpotLightElement
+@DocsEditable
+@DomName('SVGFESpotLightElement')
 class FESpotLightElement extends SvgElement {
   FESpotLightElement.internal() : super.internal();
 
-
-  /** @domName SVGFESpotLightElement.limitingConeAngle */
+  @DocsEditable
+  @DomName('SVGFESpotLightElement.limitingConeAngle')
   AnimatedNumber get limitingConeAngle native "SVGFESpotLightElement_limitingConeAngle_Getter";
 
-
-  /** @domName SVGFESpotLightElement.pointsAtX */
+  @DocsEditable
+  @DomName('SVGFESpotLightElement.pointsAtX')
   AnimatedNumber get pointsAtX native "SVGFESpotLightElement_pointsAtX_Getter";
 
-
-  /** @domName SVGFESpotLightElement.pointsAtY */
+  @DocsEditable
+  @DomName('SVGFESpotLightElement.pointsAtY')
   AnimatedNumber get pointsAtY native "SVGFESpotLightElement_pointsAtY_Getter";
 
-
-  /** @domName SVGFESpotLightElement.pointsAtZ */
+  @DocsEditable
+  @DomName('SVGFESpotLightElement.pointsAtZ')
   AnimatedNumber get pointsAtZ native "SVGFESpotLightElement_pointsAtZ_Getter";
 
-
-  /** @domName SVGFESpotLightElement.specularExponent */
+  @DocsEditable
+  @DomName('SVGFESpotLightElement.specularExponent')
   AnimatedNumber get specularExponent native "SVGFESpotLightElement_specularExponent_Getter";
 
-
-  /** @domName SVGFESpotLightElement.x */
+  @DocsEditable
+  @DomName('SVGFESpotLightElement.x')
   AnimatedNumber get x native "SVGFESpotLightElement_x_Getter";
 
-
-  /** @domName SVGFESpotLightElement.y */
+  @DocsEditable
+  @DomName('SVGFESpotLightElement.y')
   AnimatedNumber get y native "SVGFESpotLightElement_y_Getter";
 
-
-  /** @domName SVGFESpotLightElement.z */
+  @DocsEditable
+  @DomName('SVGFESpotLightElement.z')
   AnimatedNumber get z native "SVGFESpotLightElement_z_Getter";
 
 }
@@ -2747,44 +2804,45 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFETileElement
+@DocsEditable
+@DomName('SVGFETileElement')
 class FETileElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   FETileElement.internal() : super.internal();
 
-
-  /** @domName SVGFETileElement.in1 */
+  @DocsEditable
+  @DomName('SVGFETileElement.in1')
   AnimatedString get in1 native "SVGFETileElement_in1_Getter";
 
-
-  /** @domName SVGFETileElement.height */
+  @DocsEditable
+  @DomName('SVGFETileElement.height')
   AnimatedLength get height native "SVGFETileElement_height_Getter";
 
-
-  /** @domName SVGFETileElement.result */
+  @DocsEditable
+  @DomName('SVGFETileElement.result')
   AnimatedString get result native "SVGFETileElement_result_Getter";
 
-
-  /** @domName SVGFETileElement.width */
+  @DocsEditable
+  @DomName('SVGFETileElement.width')
   AnimatedLength get width native "SVGFETileElement_width_Getter";
 
-
-  /** @domName SVGFETileElement.x */
+  @DocsEditable
+  @DomName('SVGFETileElement.x')
   AnimatedLength get x native "SVGFETileElement_x_Getter";
 
-
-  /** @domName SVGFETileElement.y */
+  @DocsEditable
+  @DomName('SVGFETileElement.y')
   AnimatedLength get y native "SVGFETileElement_y_Getter";
 
-
-  /** @domName SVGFETileElement.className */
+  @DocsEditable
+  @DomName('SVGFETileElement.className')
   AnimatedString get $dom_svgClassName native "SVGFETileElement_className_Getter";
 
-
-  /** @domName SVGFETileElement.style */
+  @DocsEditable
+  @DomName('SVGFETileElement.style')
   CssStyleDeclaration get style native "SVGFETileElement_style_Getter";
 
-
-  /** @domName SVGFETileElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFETileElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFETileElement_getPresentationAttribute_Callback";
 
 }
@@ -2795,7 +2853,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFETurbulenceElement
+@DocsEditable
+@DomName('SVGFETurbulenceElement')
 class FETurbulenceElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   FETurbulenceElement.internal() : super.internal();
 
@@ -2811,60 +2870,60 @@
 
   static const int SVG_TURBULENCE_TYPE_UNKNOWN = 0;
 
-
-  /** @domName SVGFETurbulenceElement.baseFrequencyX */
+  @DocsEditable
+  @DomName('SVGFETurbulenceElement.baseFrequencyX')
   AnimatedNumber get baseFrequencyX native "SVGFETurbulenceElement_baseFrequencyX_Getter";
 
-
-  /** @domName SVGFETurbulenceElement.baseFrequencyY */
+  @DocsEditable
+  @DomName('SVGFETurbulenceElement.baseFrequencyY')
   AnimatedNumber get baseFrequencyY native "SVGFETurbulenceElement_baseFrequencyY_Getter";
 
-
-  /** @domName SVGFETurbulenceElement.numOctaves */
+  @DocsEditable
+  @DomName('SVGFETurbulenceElement.numOctaves')
   AnimatedInteger get numOctaves native "SVGFETurbulenceElement_numOctaves_Getter";
 
-
-  /** @domName SVGFETurbulenceElement.seed */
+  @DocsEditable
+  @DomName('SVGFETurbulenceElement.seed')
   AnimatedNumber get seed native "SVGFETurbulenceElement_seed_Getter";
 
-
-  /** @domName SVGFETurbulenceElement.stitchTiles */
+  @DocsEditable
+  @DomName('SVGFETurbulenceElement.stitchTiles')
   AnimatedEnumeration get stitchTiles native "SVGFETurbulenceElement_stitchTiles_Getter";
 
-
-  /** @domName SVGFETurbulenceElement.type */
+  @DocsEditable
+  @DomName('SVGFETurbulenceElement.type')
   AnimatedEnumeration get type native "SVGFETurbulenceElement_type_Getter";
 
-
-  /** @domName SVGFETurbulenceElement.height */
+  @DocsEditable
+  @DomName('SVGFETurbulenceElement.height')
   AnimatedLength get height native "SVGFETurbulenceElement_height_Getter";
 
-
-  /** @domName SVGFETurbulenceElement.result */
+  @DocsEditable
+  @DomName('SVGFETurbulenceElement.result')
   AnimatedString get result native "SVGFETurbulenceElement_result_Getter";
 
-
-  /** @domName SVGFETurbulenceElement.width */
+  @DocsEditable
+  @DomName('SVGFETurbulenceElement.width')
   AnimatedLength get width native "SVGFETurbulenceElement_width_Getter";
 
-
-  /** @domName SVGFETurbulenceElement.x */
+  @DocsEditable
+  @DomName('SVGFETurbulenceElement.x')
   AnimatedLength get x native "SVGFETurbulenceElement_x_Getter";
 
-
-  /** @domName SVGFETurbulenceElement.y */
+  @DocsEditable
+  @DomName('SVGFETurbulenceElement.y')
   AnimatedLength get y native "SVGFETurbulenceElement_y_Getter";
 
-
-  /** @domName SVGFETurbulenceElement.className */
+  @DocsEditable
+  @DomName('SVGFETurbulenceElement.className')
   AnimatedString get $dom_svgClassName native "SVGFETurbulenceElement_className_Getter";
 
-
-  /** @domName SVGFETurbulenceElement.style */
+  @DocsEditable
+  @DomName('SVGFETurbulenceElement.style')
   CssStyleDeclaration get style native "SVGFETurbulenceElement_style_Getter";
 
-
-  /** @domName SVGFETurbulenceElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFETurbulenceElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFETurbulenceElement_getPresentationAttribute_Callback";
 
 }
@@ -2875,83 +2934,84 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFilterElement
+@DocsEditable
+@DomName('SVGFilterElement')
 class FilterElement extends SvgElement implements UriReference, ExternalResourcesRequired, Stylable, LangSpace {
   FilterElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory FilterElement() => _SvgElementFactoryProvider.createSvgElement_tag("filter");
 
-
-  /** @domName SVGFilterElement.filterResX */
+  @DocsEditable
+  @DomName('SVGFilterElement.filterResX')
   AnimatedInteger get filterResX native "SVGFilterElement_filterResX_Getter";
 
-
-  /** @domName SVGFilterElement.filterResY */
+  @DocsEditable
+  @DomName('SVGFilterElement.filterResY')
   AnimatedInteger get filterResY native "SVGFilterElement_filterResY_Getter";
 
-
-  /** @domName SVGFilterElement.filterUnits */
+  @DocsEditable
+  @DomName('SVGFilterElement.filterUnits')
   AnimatedEnumeration get filterUnits native "SVGFilterElement_filterUnits_Getter";
 
-
-  /** @domName SVGFilterElement.height */
+  @DocsEditable
+  @DomName('SVGFilterElement.height')
   AnimatedLength get height native "SVGFilterElement_height_Getter";
 
-
-  /** @domName SVGFilterElement.primitiveUnits */
+  @DocsEditable
+  @DomName('SVGFilterElement.primitiveUnits')
   AnimatedEnumeration get primitiveUnits native "SVGFilterElement_primitiveUnits_Getter";
 
-
-  /** @domName SVGFilterElement.width */
+  @DocsEditable
+  @DomName('SVGFilterElement.width')
   AnimatedLength get width native "SVGFilterElement_width_Getter";
 
-
-  /** @domName SVGFilterElement.x */
+  @DocsEditable
+  @DomName('SVGFilterElement.x')
   AnimatedLength get x native "SVGFilterElement_x_Getter";
 
-
-  /** @domName SVGFilterElement.y */
+  @DocsEditable
+  @DomName('SVGFilterElement.y')
   AnimatedLength get y native "SVGFilterElement_y_Getter";
 
-
-  /** @domName SVGFilterElement.setFilterRes */
+  @DocsEditable
+  @DomName('SVGFilterElement.setFilterRes')
   void setFilterRes(int filterResX, int filterResY) native "SVGFilterElement_setFilterRes_Callback";
 
-
-  /** @domName SVGFilterElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGFilterElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGFilterElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGFilterElement.xmllang */
+  @DocsEditable
+  @DomName('SVGFilterElement.xmllang')
   String get xmllang native "SVGFilterElement_xmllang_Getter";
 
-
-  /** @domName SVGFilterElement.xmllang */
+  @DocsEditable
+  @DomName('SVGFilterElement.xmllang')
   void set xmllang(String value) native "SVGFilterElement_xmllang_Setter";
 
-
-  /** @domName SVGFilterElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGFilterElement.xmlspace')
   String get xmlspace native "SVGFilterElement_xmlspace_Getter";
 
-
-  /** @domName SVGFilterElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGFilterElement.xmlspace')
   void set xmlspace(String value) native "SVGFilterElement_xmlspace_Setter";
 
-
-  /** @domName SVGFilterElement.className */
+  @DocsEditable
+  @DomName('SVGFilterElement.className')
   AnimatedString get $dom_svgClassName native "SVGFilterElement_className_Getter";
 
-
-  /** @domName SVGFilterElement.style */
+  @DocsEditable
+  @DomName('SVGFilterElement.style')
   CssStyleDeclaration get style native "SVGFilterElement_style_Getter";
 
-
-  /** @domName SVGFilterElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFilterElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFilterElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGFilterElement.href */
+  @DocsEditable
+  @DomName('SVGFilterElement.href')
   AnimatedString get href native "SVGFilterElement_href_Getter";
 
 }
@@ -2962,40 +3022,41 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFilterPrimitiveStandardAttributes
+@DocsEditable
+@DomName('SVGFilterPrimitiveStandardAttributes')
 class FilterPrimitiveStandardAttributes extends NativeFieldWrapperClass1 implements Stylable {
   FilterPrimitiveStandardAttributes.internal();
 
-
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  @DocsEditable
+  @DomName('SVGFilterPrimitiveStandardAttributes.height')
   AnimatedLength get height native "SVGFilterPrimitiveStandardAttributes_height_Getter";
 
-
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  @DocsEditable
+  @DomName('SVGFilterPrimitiveStandardAttributes.result')
   AnimatedString get result native "SVGFilterPrimitiveStandardAttributes_result_Getter";
 
-
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  @DocsEditable
+  @DomName('SVGFilterPrimitiveStandardAttributes.width')
   AnimatedLength get width native "SVGFilterPrimitiveStandardAttributes_width_Getter";
 
-
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  @DocsEditable
+  @DomName('SVGFilterPrimitiveStandardAttributes.x')
   AnimatedLength get x native "SVGFilterPrimitiveStandardAttributes_x_Getter";
 
-
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  @DocsEditable
+  @DomName('SVGFilterPrimitiveStandardAttributes.y')
   AnimatedLength get y native "SVGFilterPrimitiveStandardAttributes_y_Getter";
 
-
-  /** @domName SVGFilterPrimitiveStandardAttributes.className */
+  @DocsEditable
+  @DomName('SVGFilterPrimitiveStandardAttributes.className')
   AnimatedString get $dom_svgClassName native "SVGFilterPrimitiveStandardAttributes_className_Getter";
 
-
-  /** @domName SVGFilterPrimitiveStandardAttributes.style */
+  @DocsEditable
+  @DomName('SVGFilterPrimitiveStandardAttributes.style')
   CssStyleDeclaration get style native "SVGFilterPrimitiveStandardAttributes_style_Getter";
 
-
-  /** @domName SVGFilterPrimitiveStandardAttributes.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGFilterPrimitiveStandardAttributes.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGFilterPrimitiveStandardAttributes_getPresentationAttribute_Callback";
 
 }
@@ -3006,16 +3067,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFitToViewBox
+@DocsEditable
+@DomName('SVGFitToViewBox')
 class FitToViewBox extends NativeFieldWrapperClass1 {
   FitToViewBox.internal();
 
-
-  /** @domName SVGFitToViewBox.preserveAspectRatio */
+  @DocsEditable
+  @DomName('SVGFitToViewBox.preserveAspectRatio')
   AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGFitToViewBox_preserveAspectRatio_Getter";
 
-
-  /** @domName SVGFitToViewBox.viewBox */
+  @DocsEditable
+  @DomName('SVGFitToViewBox.viewBox')
   AnimatedRect get viewBox native "SVGFitToViewBox_viewBox_Getter";
 
 }
@@ -3026,11 +3088,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFontElement
+@DocsEditable
+@DomName('SVGFontElement')
 class FontElement extends SvgElement {
   FontElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory FontElement() => _SvgElementFactoryProvider.createSvgElement_tag("font");
 
 }
@@ -3041,11 +3104,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFontFaceElement
+@DocsEditable
+@DomName('SVGFontFaceElement')
 class FontFaceElement extends SvgElement {
   FontFaceElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory FontFaceElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face");
 
 }
@@ -3056,11 +3120,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFontFaceFormatElement
+@DocsEditable
+@DomName('SVGFontFaceFormatElement')
 class FontFaceFormatElement extends SvgElement {
   FontFaceFormatElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory FontFaceFormatElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face-format");
 
 }
@@ -3071,11 +3136,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFontFaceNameElement
+@DocsEditable
+@DomName('SVGFontFaceNameElement')
 class FontFaceNameElement extends SvgElement {
   FontFaceNameElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory FontFaceNameElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face-name");
 
 }
@@ -3086,11 +3152,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFontFaceSrcElement
+@DocsEditable
+@DomName('SVGFontFaceSrcElement')
 class FontFaceSrcElement extends SvgElement {
   FontFaceSrcElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory FontFaceSrcElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face-src");
 
 }
@@ -3101,11 +3168,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGFontFaceUriElement
+@DocsEditable
+@DomName('SVGFontFaceUriElement')
 class FontFaceUriElement extends SvgElement {
   FontFaceUriElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory FontFaceUriElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face-uri");
 
 }
@@ -3116,103 +3184,104 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGForeignObjectElement
+@DocsEditable
+@DomName('SVGForeignObjectElement')
 class ForeignObjectElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
   ForeignObjectElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory ForeignObjectElement() => _SvgElementFactoryProvider.createSvgElement_tag("foreignObject");
 
-
-  /** @domName SVGForeignObjectElement.height */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.height')
   AnimatedLength get height native "SVGForeignObjectElement_height_Getter";
 
-
-  /** @domName SVGForeignObjectElement.width */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.width')
   AnimatedLength get width native "SVGForeignObjectElement_width_Getter";
 
-
-  /** @domName SVGForeignObjectElement.x */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.x')
   AnimatedLength get x native "SVGForeignObjectElement_x_Getter";
 
-
-  /** @domName SVGForeignObjectElement.y */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.y')
   AnimatedLength get y native "SVGForeignObjectElement_y_Getter";
 
-
-  /** @domName SVGForeignObjectElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGForeignObjectElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGForeignObjectElement.xmllang */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.xmllang')
   String get xmllang native "SVGForeignObjectElement_xmllang_Getter";
 
-
-  /** @domName SVGForeignObjectElement.xmllang */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.xmllang')
   void set xmllang(String value) native "SVGForeignObjectElement_xmllang_Setter";
 
-
-  /** @domName SVGForeignObjectElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.xmlspace')
   String get xmlspace native "SVGForeignObjectElement_xmlspace_Getter";
 
-
-  /** @domName SVGForeignObjectElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.xmlspace')
   void set xmlspace(String value) native "SVGForeignObjectElement_xmlspace_Setter";
 
-
-  /** @domName SVGForeignObjectElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGForeignObjectElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGForeignObjectElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGForeignObjectElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGForeignObjectElement.getBBox */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.getBBox')
   Rect getBBox() native "SVGForeignObjectElement_getBBox_Callback";
 
-
-  /** @domName SVGForeignObjectElement.getCTM */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.getCTM')
   Matrix getCtm() native "SVGForeignObjectElement_getCTM_Callback";
 
-
-  /** @domName SVGForeignObjectElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGForeignObjectElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGForeignObjectElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGForeignObjectElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGForeignObjectElement.className */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.className')
   AnimatedString get $dom_svgClassName native "SVGForeignObjectElement_className_Getter";
 
-
-  /** @domName SVGForeignObjectElement.style */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.style')
   CssStyleDeclaration get style native "SVGForeignObjectElement_style_Getter";
 
-
-  /** @domName SVGForeignObjectElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGForeignObjectElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGForeignObjectElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.requiredExtensions')
   StringList get requiredExtensions native "SVGForeignObjectElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGForeignObjectElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.requiredFeatures')
   StringList get requiredFeatures native "SVGForeignObjectElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGForeignObjectElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.systemLanguage')
   StringList get systemLanguage native "SVGForeignObjectElement_systemLanguage_Getter";
 
-
-  /** @domName SVGForeignObjectElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.hasExtension')
   bool hasExtension(String extension) native "SVGForeignObjectElement_hasExtension_Callback";
 
-
-  /** @domName SVGForeignObjectElement.transform */
+  @DocsEditable
+  @DomName('SVGForeignObjectElement.transform')
   AnimatedTransformList get transform native "SVGForeignObjectElement_transform_Getter";
 
 }
@@ -3223,87 +3292,88 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGGElement
+@DocsEditable
+@DomName('SVGGElement')
 class GElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
   GElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory GElement() => _SvgElementFactoryProvider.createSvgElement_tag("g");
 
-
-  /** @domName SVGGElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGGElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGGElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGGElement.xmllang */
+  @DocsEditable
+  @DomName('SVGGElement.xmllang')
   String get xmllang native "SVGGElement_xmllang_Getter";
 
-
-  /** @domName SVGGElement.xmllang */
+  @DocsEditable
+  @DomName('SVGGElement.xmllang')
   void set xmllang(String value) native "SVGGElement_xmllang_Setter";
 
-
-  /** @domName SVGGElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGGElement.xmlspace')
   String get xmlspace native "SVGGElement_xmlspace_Getter";
 
-
-  /** @domName SVGGElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGGElement.xmlspace')
   void set xmlspace(String value) native "SVGGElement_xmlspace_Setter";
 
-
-  /** @domName SVGGElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGGElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGGElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGGElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGGElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGGElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGGElement.getBBox */
+  @DocsEditable
+  @DomName('SVGGElement.getBBox')
   Rect getBBox() native "SVGGElement_getBBox_Callback";
 
-
-  /** @domName SVGGElement.getCTM */
+  @DocsEditable
+  @DomName('SVGGElement.getCTM')
   Matrix getCtm() native "SVGGElement_getCTM_Callback";
 
-
-  /** @domName SVGGElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGGElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGGElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGGElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGGElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGGElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGGElement.className */
+  @DocsEditable
+  @DomName('SVGGElement.className')
   AnimatedString get $dom_svgClassName native "SVGGElement_className_Getter";
 
-
-  /** @domName SVGGElement.style */
+  @DocsEditable
+  @DomName('SVGGElement.style')
   CssStyleDeclaration get style native "SVGGElement_style_Getter";
 
-
-  /** @domName SVGGElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGGElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGGElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGGElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGGElement.requiredExtensions')
   StringList get requiredExtensions native "SVGGElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGGElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGGElement.requiredFeatures')
   StringList get requiredFeatures native "SVGGElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGGElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGGElement.systemLanguage')
   StringList get systemLanguage native "SVGGElement_systemLanguage_Getter";
 
-
-  /** @domName SVGGElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGGElement.hasExtension')
   bool hasExtension(String extension) native "SVGGElement_hasExtension_Callback";
 
-
-  /** @domName SVGGElement.transform */
+  @DocsEditable
+  @DomName('SVGGElement.transform')
   AnimatedTransformList get transform native "SVGGElement_transform_Getter";
 
 }
@@ -3314,11 +3384,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGGlyphElement
+@DocsEditable
+@DomName('SVGGlyphElement')
 class GlyphElement extends SvgElement {
   GlyphElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory GlyphElement() => _SvgElementFactoryProvider.createSvgElement_tag("glyph");
 
 }
@@ -3329,72 +3400,73 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGGlyphRefElement
+@DocsEditable
+@DomName('SVGGlyphRefElement')
 class GlyphRefElement extends SvgElement implements UriReference, Stylable {
   GlyphRefElement.internal() : super.internal();
 
-
-  /** @domName SVGGlyphRefElement.dx */
+  @DocsEditable
+  @DomName('SVGGlyphRefElement.dx')
   num get dx native "SVGGlyphRefElement_dx_Getter";
 
-
-  /** @domName SVGGlyphRefElement.dx */
+  @DocsEditable
+  @DomName('SVGGlyphRefElement.dx')
   void set dx(num value) native "SVGGlyphRefElement_dx_Setter";
 
-
-  /** @domName SVGGlyphRefElement.dy */
+  @DocsEditable
+  @DomName('SVGGlyphRefElement.dy')
   num get dy native "SVGGlyphRefElement_dy_Getter";
 
-
-  /** @domName SVGGlyphRefElement.dy */
+  @DocsEditable
+  @DomName('SVGGlyphRefElement.dy')
   void set dy(num value) native "SVGGlyphRefElement_dy_Setter";
 
-
-  /** @domName SVGGlyphRefElement.format */
+  @DocsEditable
+  @DomName('SVGGlyphRefElement.format')
   String get format native "SVGGlyphRefElement_format_Getter";
 
-
-  /** @domName SVGGlyphRefElement.format */
+  @DocsEditable
+  @DomName('SVGGlyphRefElement.format')
   void set format(String value) native "SVGGlyphRefElement_format_Setter";
 
-
-  /** @domName SVGGlyphRefElement.glyphRef */
+  @DocsEditable
+  @DomName('SVGGlyphRefElement.glyphRef')
   String get glyphRef native "SVGGlyphRefElement_glyphRef_Getter";
 
-
-  /** @domName SVGGlyphRefElement.glyphRef */
+  @DocsEditable
+  @DomName('SVGGlyphRefElement.glyphRef')
   void set glyphRef(String value) native "SVGGlyphRefElement_glyphRef_Setter";
 
-
-  /** @domName SVGGlyphRefElement.x */
+  @DocsEditable
+  @DomName('SVGGlyphRefElement.x')
   num get x native "SVGGlyphRefElement_x_Getter";
 
-
-  /** @domName SVGGlyphRefElement.x */
+  @DocsEditable
+  @DomName('SVGGlyphRefElement.x')
   void set x(num value) native "SVGGlyphRefElement_x_Setter";
 
-
-  /** @domName SVGGlyphRefElement.y */
+  @DocsEditable
+  @DomName('SVGGlyphRefElement.y')
   num get y native "SVGGlyphRefElement_y_Getter";
 
-
-  /** @domName SVGGlyphRefElement.y */
+  @DocsEditable
+  @DomName('SVGGlyphRefElement.y')
   void set y(num value) native "SVGGlyphRefElement_y_Setter";
 
-
-  /** @domName SVGGlyphRefElement.className */
+  @DocsEditable
+  @DomName('SVGGlyphRefElement.className')
   AnimatedString get $dom_svgClassName native "SVGGlyphRefElement_className_Getter";
 
-
-  /** @domName SVGGlyphRefElement.style */
+  @DocsEditable
+  @DomName('SVGGlyphRefElement.style')
   CssStyleDeclaration get style native "SVGGlyphRefElement_style_Getter";
 
-
-  /** @domName SVGGlyphRefElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGGlyphRefElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGGlyphRefElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGGlyphRefElement.href */
+  @DocsEditable
+  @DomName('SVGGlyphRefElement.href')
   AnimatedString get href native "SVGGlyphRefElement_href_Getter";
 
 }
@@ -3405,7 +3477,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGGradientElement
+@DocsEditable
+@DomName('SVGGradientElement')
 class GradientElement extends SvgElement implements UriReference, ExternalResourcesRequired, Stylable {
   GradientElement.internal() : super.internal();
 
@@ -3417,36 +3490,36 @@
 
   static const int SVG_SPREADMETHOD_UNKNOWN = 0;
 
-
-  /** @domName SVGGradientElement.gradientTransform */
+  @DocsEditable
+  @DomName('SVGGradientElement.gradientTransform')
   AnimatedTransformList get gradientTransform native "SVGGradientElement_gradientTransform_Getter";
 
-
-  /** @domName SVGGradientElement.gradientUnits */
+  @DocsEditable
+  @DomName('SVGGradientElement.gradientUnits')
   AnimatedEnumeration get gradientUnits native "SVGGradientElement_gradientUnits_Getter";
 
-
-  /** @domName SVGGradientElement.spreadMethod */
+  @DocsEditable
+  @DomName('SVGGradientElement.spreadMethod')
   AnimatedEnumeration get spreadMethod native "SVGGradientElement_spreadMethod_Getter";
 
-
-  /** @domName SVGGradientElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGGradientElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGGradientElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGGradientElement.className */
+  @DocsEditable
+  @DomName('SVGGradientElement.className')
   AnimatedString get $dom_svgClassName native "SVGGradientElement_className_Getter";
 
-
-  /** @domName SVGGradientElement.style */
+  @DocsEditable
+  @DomName('SVGGradientElement.style')
   CssStyleDeclaration get style native "SVGGradientElement_style_Getter";
 
-
-  /** @domName SVGGradientElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGGradientElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGGradientElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGGradientElement.href */
+  @DocsEditable
+  @DomName('SVGGradientElement.href')
   AnimatedString get href native "SVGGradientElement_href_Getter";
 
 }
@@ -3457,11 +3530,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGHKernElement
+@DocsEditable
+@DomName('SVGHKernElement')
 class HKernElement extends SvgElement {
   HKernElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory HKernElement() => _SvgElementFactoryProvider.createSvgElement_tag("hkern");
 
 }
@@ -3472,111 +3546,112 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGImageElement
+@DocsEditable
+@DomName('SVGImageElement')
 class ImageElement extends SvgElement implements Transformable, Tests, UriReference, Stylable, ExternalResourcesRequired, LangSpace {
   ImageElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory ImageElement() => _SvgElementFactoryProvider.createSvgElement_tag("image");
 
-
-  /** @domName SVGImageElement.height */
+  @DocsEditable
+  @DomName('SVGImageElement.height')
   AnimatedLength get height native "SVGImageElement_height_Getter";
 
-
-  /** @domName SVGImageElement.preserveAspectRatio */
+  @DocsEditable
+  @DomName('SVGImageElement.preserveAspectRatio')
   AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGImageElement_preserveAspectRatio_Getter";
 
-
-  /** @domName SVGImageElement.width */
+  @DocsEditable
+  @DomName('SVGImageElement.width')
   AnimatedLength get width native "SVGImageElement_width_Getter";
 
-
-  /** @domName SVGImageElement.x */
+  @DocsEditable
+  @DomName('SVGImageElement.x')
   AnimatedLength get x native "SVGImageElement_x_Getter";
 
-
-  /** @domName SVGImageElement.y */
+  @DocsEditable
+  @DomName('SVGImageElement.y')
   AnimatedLength get y native "SVGImageElement_y_Getter";
 
-
-  /** @domName SVGImageElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGImageElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGImageElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGImageElement.xmllang */
+  @DocsEditable
+  @DomName('SVGImageElement.xmllang')
   String get xmllang native "SVGImageElement_xmllang_Getter";
 
-
-  /** @domName SVGImageElement.xmllang */
+  @DocsEditable
+  @DomName('SVGImageElement.xmllang')
   void set xmllang(String value) native "SVGImageElement_xmllang_Setter";
 
-
-  /** @domName SVGImageElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGImageElement.xmlspace')
   String get xmlspace native "SVGImageElement_xmlspace_Getter";
 
-
-  /** @domName SVGImageElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGImageElement.xmlspace')
   void set xmlspace(String value) native "SVGImageElement_xmlspace_Setter";
 
-
-  /** @domName SVGImageElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGImageElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGImageElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGImageElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGImageElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGImageElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGImageElement.getBBox */
+  @DocsEditable
+  @DomName('SVGImageElement.getBBox')
   Rect getBBox() native "SVGImageElement_getBBox_Callback";
 
-
-  /** @domName SVGImageElement.getCTM */
+  @DocsEditable
+  @DomName('SVGImageElement.getCTM')
   Matrix getCtm() native "SVGImageElement_getCTM_Callback";
 
-
-  /** @domName SVGImageElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGImageElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGImageElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGImageElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGImageElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGImageElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGImageElement.className */
+  @DocsEditable
+  @DomName('SVGImageElement.className')
   AnimatedString get $dom_svgClassName native "SVGImageElement_className_Getter";
 
-
-  /** @domName SVGImageElement.style */
+  @DocsEditable
+  @DomName('SVGImageElement.style')
   CssStyleDeclaration get style native "SVGImageElement_style_Getter";
 
-
-  /** @domName SVGImageElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGImageElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGImageElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGImageElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGImageElement.requiredExtensions')
   StringList get requiredExtensions native "SVGImageElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGImageElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGImageElement.requiredFeatures')
   StringList get requiredFeatures native "SVGImageElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGImageElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGImageElement.systemLanguage')
   StringList get systemLanguage native "SVGImageElement_systemLanguage_Getter";
 
-
-  /** @domName SVGImageElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGImageElement.hasExtension')
   bool hasExtension(String extension) native "SVGImageElement_hasExtension_Callback";
 
-
-  /** @domName SVGImageElement.transform */
+  @DocsEditable
+  @DomName('SVGImageElement.transform')
   AnimatedTransformList get transform native "SVGImageElement_transform_Getter";
 
-
-  /** @domName SVGImageElement.href */
+  @DocsEditable
+  @DomName('SVGImageElement.href')
   AnimatedString get href native "SVGImageElement_href_Getter";
 
 }
@@ -3587,24 +3662,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGLangSpace
+@DocsEditable
+@DomName('SVGLangSpace')
 class LangSpace extends NativeFieldWrapperClass1 {
   LangSpace.internal();
 
-
-  /** @domName SVGLangSpace.xmllang */
+  @DocsEditable
+  @DomName('SVGLangSpace.xmllang')
   String get xmllang native "SVGLangSpace_xmllang_Getter";
 
-
-  /** @domName SVGLangSpace.xmllang */
+  @DocsEditable
+  @DomName('SVGLangSpace.xmllang')
   void set xmllang(String value) native "SVGLangSpace_xmllang_Setter";
 
-
-  /** @domName SVGLangSpace.xmlspace */
+  @DocsEditable
+  @DomName('SVGLangSpace.xmlspace')
   String get xmlspace native "SVGLangSpace_xmlspace_Getter";
 
-
-  /** @domName SVGLangSpace.xmlspace */
+  @DocsEditable
+  @DomName('SVGLangSpace.xmlspace')
   void set xmlspace(String value) native "SVGLangSpace_xmlspace_Setter";
 
 }
@@ -3615,7 +3691,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGLength
+@DocsEditable
+@DomName('SVGLength')
 class Length extends NativeFieldWrapperClass1 {
   Length.internal();
 
@@ -3641,40 +3718,40 @@
 
   static const int SVG_LENGTHTYPE_UNKNOWN = 0;
 
-
-  /** @domName SVGLength.unitType */
+  @DocsEditable
+  @DomName('SVGLength.unitType')
   int get unitType native "SVGLength_unitType_Getter";
 
-
-  /** @domName SVGLength.value */
+  @DocsEditable
+  @DomName('SVGLength.value')
   num get value native "SVGLength_value_Getter";
 
-
-  /** @domName SVGLength.value */
+  @DocsEditable
+  @DomName('SVGLength.value')
   void set value(num value) native "SVGLength_value_Setter";
 
-
-  /** @domName SVGLength.valueAsString */
+  @DocsEditable
+  @DomName('SVGLength.valueAsString')
   String get valueAsString native "SVGLength_valueAsString_Getter";
 
-
-  /** @domName SVGLength.valueAsString */
+  @DocsEditable
+  @DomName('SVGLength.valueAsString')
   void set valueAsString(String value) native "SVGLength_valueAsString_Setter";
 
-
-  /** @domName SVGLength.valueInSpecifiedUnits */
+  @DocsEditable
+  @DomName('SVGLength.valueInSpecifiedUnits')
   num get valueInSpecifiedUnits native "SVGLength_valueInSpecifiedUnits_Getter";
 
-
-  /** @domName SVGLength.valueInSpecifiedUnits */
+  @DocsEditable
+  @DomName('SVGLength.valueInSpecifiedUnits')
   void set valueInSpecifiedUnits(num value) native "SVGLength_valueInSpecifiedUnits_Setter";
 
-
-  /** @domName SVGLength.convertToSpecifiedUnits */
+  @DocsEditable
+  @DomName('SVGLength.convertToSpecifiedUnits')
   void convertToSpecifiedUnits(int unitType) native "SVGLength_convertToSpecifiedUnits_Callback";
 
-
-  /** @domName SVGLength.newValueSpecifiedUnits */
+  @DocsEditable
+  @DomName('SVGLength.newValueSpecifiedUnits')
   void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native "SVGLength_newValueSpecifiedUnits_Callback";
 
 }
@@ -3685,12 +3762,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGLengthList
+@DocsEditable
+@DomName('SVGLengthList')
 class LengthList extends NativeFieldWrapperClass1 implements List<Length> {
   LengthList.internal();
 
-
-  /** @domName SVGLengthList.numberOfItems */
+  @DocsEditable
+  @DomName('SVGLengthList.numberOfItems')
   int get numberOfItems native "SVGLengthList_numberOfItems_Getter";
 
   Length operator[](int index) native "SVGLengthList_item_Callback";
@@ -3713,50 +3791,50 @@
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Length)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Length element) => Collections.contains(this, element);
+  bool contains(Length element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Length element)) => Collections.forEach(this, f);
+  void forEach(void f(Length element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Length element)) => new MappedList<Length, dynamic>(this, f);
+  List mappedBy(f(Length element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Length> where(bool f(Length element)) => new WhereIterable<Length>(this, f);
+  Iterable<Length> where(bool f(Length element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Length element)) => Collections.every(this, f);
+  bool every(bool f(Length element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Length element)) => Collections.any(this, f);
+  bool any(bool f(Length element)) => IterableMixinWorkaround.any(this, f);
 
   List<Length> toList() => new List<Length>.from(this);
   Set<Length> toSet() => new Set<Length>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Length> take(int n) => new ListView<Length>(this, 0, n);
+  List<Length> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Length> takeWhile(bool test(Length value)) {
-    return new TakeWhileIterable<Length>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Length> skip(int n) => new ListView<Length>(this, n, null);
+  List<Length> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Length> skipWhile(bool test(Length value)) {
-    return new SkipWhileIterable<Length>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Length firstMatching(bool test(Length value), { Length orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Length lastMatching(bool test(Length value), {Length orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Length singleMatching(bool test(Length value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Length elementAt(int index) {
@@ -3782,7 +3860,7 @@
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
-  // contains() defined by IDL.
+  // clear() defined by IDL.
 
   void sort([int compare(Length a, Length b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
@@ -3812,16 +3890,36 @@
     throw new StateError("More than one element");
   }
 
-  Length min([int compare(Length a, Length b)]) => Collections.min(this, compare);
+  Length min([int compare(Length a, Length b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Length max([int compare(Length a, Length b)]) => Collections.max(this, compare);
+  Length max([int compare(Length a, Length b)]) => IterableMixinWorkaround.max(this, compare);
 
   Length removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Length removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Length element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Length element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Length> from, [int startFrom]) {
@@ -3841,32 +3939,32 @@
 
   // -- end List<Length> mixins.
 
-
-  /** @domName SVGLengthList.appendItem */
+  @DocsEditable
+  @DomName('SVGLengthList.appendItem')
   Length appendItem(Length item) native "SVGLengthList_appendItem_Callback";
 
-
-  /** @domName SVGLengthList.clear */
+  @DocsEditable
+  @DomName('SVGLengthList.clear')
   void clear() native "SVGLengthList_clear_Callback";
 
-
-  /** @domName SVGLengthList.getItem */
+  @DocsEditable
+  @DomName('SVGLengthList.getItem')
   Length getItem(int index) native "SVGLengthList_getItem_Callback";
 
-
-  /** @domName SVGLengthList.initialize */
+  @DocsEditable
+  @DomName('SVGLengthList.initialize')
   Length initialize(Length item) native "SVGLengthList_initialize_Callback";
 
-
-  /** @domName SVGLengthList.insertItemBefore */
+  @DocsEditable
+  @DomName('SVGLengthList.insertItemBefore')
   Length insertItemBefore(Length item, int index) native "SVGLengthList_insertItemBefore_Callback";
 
-
-  /** @domName SVGLengthList.removeItem */
+  @DocsEditable
+  @DomName('SVGLengthList.removeItem')
   Length removeItem(int index) native "SVGLengthList_removeItem_Callback";
 
-
-  /** @domName SVGLengthList.replaceItem */
+  @DocsEditable
+  @DomName('SVGLengthList.replaceItem')
   Length replaceItem(Length item, int index) native "SVGLengthList_replaceItem_Callback";
 
 }
@@ -3877,103 +3975,104 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGLineElement
+@DocsEditable
+@DomName('SVGLineElement')
 class LineElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
   LineElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory LineElement() => _SvgElementFactoryProvider.createSvgElement_tag("line");
 
-
-  /** @domName SVGLineElement.x1 */
+  @DocsEditable
+  @DomName('SVGLineElement.x1')
   AnimatedLength get x1 native "SVGLineElement_x1_Getter";
 
-
-  /** @domName SVGLineElement.x2 */
+  @DocsEditable
+  @DomName('SVGLineElement.x2')
   AnimatedLength get x2 native "SVGLineElement_x2_Getter";
 
-
-  /** @domName SVGLineElement.y1 */
+  @DocsEditable
+  @DomName('SVGLineElement.y1')
   AnimatedLength get y1 native "SVGLineElement_y1_Getter";
 
-
-  /** @domName SVGLineElement.y2 */
+  @DocsEditable
+  @DomName('SVGLineElement.y2')
   AnimatedLength get y2 native "SVGLineElement_y2_Getter";
 
-
-  /** @domName SVGLineElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGLineElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGLineElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGLineElement.xmllang */
+  @DocsEditable
+  @DomName('SVGLineElement.xmllang')
   String get xmllang native "SVGLineElement_xmllang_Getter";
 
-
-  /** @domName SVGLineElement.xmllang */
+  @DocsEditable
+  @DomName('SVGLineElement.xmllang')
   void set xmllang(String value) native "SVGLineElement_xmllang_Setter";
 
-
-  /** @domName SVGLineElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGLineElement.xmlspace')
   String get xmlspace native "SVGLineElement_xmlspace_Getter";
 
-
-  /** @domName SVGLineElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGLineElement.xmlspace')
   void set xmlspace(String value) native "SVGLineElement_xmlspace_Setter";
 
-
-  /** @domName SVGLineElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGLineElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGLineElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGLineElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGLineElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGLineElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGLineElement.getBBox */
+  @DocsEditable
+  @DomName('SVGLineElement.getBBox')
   Rect getBBox() native "SVGLineElement_getBBox_Callback";
 
-
-  /** @domName SVGLineElement.getCTM */
+  @DocsEditable
+  @DomName('SVGLineElement.getCTM')
   Matrix getCtm() native "SVGLineElement_getCTM_Callback";
 
-
-  /** @domName SVGLineElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGLineElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGLineElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGLineElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGLineElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGLineElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGLineElement.className */
+  @DocsEditable
+  @DomName('SVGLineElement.className')
   AnimatedString get $dom_svgClassName native "SVGLineElement_className_Getter";
 
-
-  /** @domName SVGLineElement.style */
+  @DocsEditable
+  @DomName('SVGLineElement.style')
   CssStyleDeclaration get style native "SVGLineElement_style_Getter";
 
-
-  /** @domName SVGLineElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGLineElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGLineElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGLineElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGLineElement.requiredExtensions')
   StringList get requiredExtensions native "SVGLineElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGLineElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGLineElement.requiredFeatures')
   StringList get requiredFeatures native "SVGLineElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGLineElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGLineElement.systemLanguage')
   StringList get systemLanguage native "SVGLineElement_systemLanguage_Getter";
 
-
-  /** @domName SVGLineElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGLineElement.hasExtension')
   bool hasExtension(String extension) native "SVGLineElement_hasExtension_Callback";
 
-
-  /** @domName SVGLineElement.transform */
+  @DocsEditable
+  @DomName('SVGLineElement.transform')
   AnimatedTransformList get transform native "SVGLineElement_transform_Getter";
 
 }
@@ -3984,27 +4083,28 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGLinearGradientElement
+@DocsEditable
+@DomName('SVGLinearGradientElement')
 class LinearGradientElement extends GradientElement {
   LinearGradientElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory LinearGradientElement() => _SvgElementFactoryProvider.createSvgElement_tag("linearGradient");
 
-
-  /** @domName SVGLinearGradientElement.x1 */
+  @DocsEditable
+  @DomName('SVGLinearGradientElement.x1')
   AnimatedLength get x1 native "SVGLinearGradientElement_x1_Getter";
 
-
-  /** @domName SVGLinearGradientElement.x2 */
+  @DocsEditable
+  @DomName('SVGLinearGradientElement.x2')
   AnimatedLength get x2 native "SVGLinearGradientElement_x2_Getter";
 
-
-  /** @domName SVGLinearGradientElement.y1 */
+  @DocsEditable
+  @DomName('SVGLinearGradientElement.y1')
   AnimatedLength get y1 native "SVGLinearGradientElement_y1_Getter";
 
-
-  /** @domName SVGLinearGradientElement.y2 */
+  @DocsEditable
+  @DomName('SVGLinearGradientElement.y2')
   AnimatedLength get y2 native "SVGLinearGradientElement_y2_Getter";
 
 }
@@ -4015,32 +4115,33 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGLocatable
+@DocsEditable
+@DomName('SVGLocatable')
 class Locatable extends NativeFieldWrapperClass1 {
   Locatable.internal();
 
-
-  /** @domName SVGLocatable.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGLocatable.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGLocatable_farthestViewportElement_Getter";
 
-
-  /** @domName SVGLocatable.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGLocatable.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGLocatable_nearestViewportElement_Getter";
 
-
-  /** @domName SVGLocatable.getBBox */
+  @DocsEditable
+  @DomName('SVGLocatable.getBBox')
   Rect getBBox() native "SVGLocatable_getBBox_Callback";
 
-
-  /** @domName SVGLocatable.getCTM */
+  @DocsEditable
+  @DomName('SVGLocatable.getCTM')
   Matrix getCtm() native "SVGLocatable_getCTM_Callback";
 
-
-  /** @domName SVGLocatable.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGLocatable.getScreenCTM')
   Matrix getScreenCtm() native "SVGLocatable_getScreenCTM_Callback";
 
-
-  /** @domName SVGLocatable.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGLocatable.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGLocatable_getTransformToElement_Callback";
 
 }
@@ -4051,19 +4152,20 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGMPathElement
+@DocsEditable
+@DomName('SVGMPathElement')
 class MPathElement extends SvgElement implements UriReference, ExternalResourcesRequired {
   MPathElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory MPathElement() => _SvgElementFactoryProvider.createSvgElement_tag("mpath");
 
-
-  /** @domName SVGMPathElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGMPathElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGMPathElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGMPathElement.href */
+  @DocsEditable
+  @DomName('SVGMPathElement.href')
   AnimatedString get href native "SVGMPathElement_href_Getter";
 
 }
@@ -4074,11 +4176,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGMarkerElement
+@DocsEditable
+@DomName('SVGMarkerElement')
 class MarkerElement extends SvgElement implements FitToViewBox, ExternalResourcesRequired, Stylable, LangSpace {
   MarkerElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory MarkerElement() => _SvgElementFactoryProvider.createSvgElement_tag("marker");
 
   static const int SVG_MARKERUNITS_STROKEWIDTH = 2;
@@ -4093,80 +4196,80 @@
 
   static const int SVG_MARKER_ORIENT_UNKNOWN = 0;
 
-
-  /** @domName SVGMarkerElement.markerHeight */
+  @DocsEditable
+  @DomName('SVGMarkerElement.markerHeight')
   AnimatedLength get markerHeight native "SVGMarkerElement_markerHeight_Getter";
 
-
-  /** @domName SVGMarkerElement.markerUnits */
+  @DocsEditable
+  @DomName('SVGMarkerElement.markerUnits')
   AnimatedEnumeration get markerUnits native "SVGMarkerElement_markerUnits_Getter";
 
-
-  /** @domName SVGMarkerElement.markerWidth */
+  @DocsEditable
+  @DomName('SVGMarkerElement.markerWidth')
   AnimatedLength get markerWidth native "SVGMarkerElement_markerWidth_Getter";
 
-
-  /** @domName SVGMarkerElement.orientAngle */
+  @DocsEditable
+  @DomName('SVGMarkerElement.orientAngle')
   AnimatedAngle get orientAngle native "SVGMarkerElement_orientAngle_Getter";
 
-
-  /** @domName SVGMarkerElement.orientType */
+  @DocsEditable
+  @DomName('SVGMarkerElement.orientType')
   AnimatedEnumeration get orientType native "SVGMarkerElement_orientType_Getter";
 
-
-  /** @domName SVGMarkerElement.refX */
+  @DocsEditable
+  @DomName('SVGMarkerElement.refX')
   AnimatedLength get refX native "SVGMarkerElement_refX_Getter";
 
-
-  /** @domName SVGMarkerElement.refY */
+  @DocsEditable
+  @DomName('SVGMarkerElement.refY')
   AnimatedLength get refY native "SVGMarkerElement_refY_Getter";
 
-
-  /** @domName SVGMarkerElement.setOrientToAngle */
+  @DocsEditable
+  @DomName('SVGMarkerElement.setOrientToAngle')
   void setOrientToAngle(Angle angle) native "SVGMarkerElement_setOrientToAngle_Callback";
 
-
-  /** @domName SVGMarkerElement.setOrientToAuto */
+  @DocsEditable
+  @DomName('SVGMarkerElement.setOrientToAuto')
   void setOrientToAuto() native "SVGMarkerElement_setOrientToAuto_Callback";
 
-
-  /** @domName SVGMarkerElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGMarkerElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGMarkerElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGMarkerElement.preserveAspectRatio */
+  @DocsEditable
+  @DomName('SVGMarkerElement.preserveAspectRatio')
   AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGMarkerElement_preserveAspectRatio_Getter";
 
-
-  /** @domName SVGMarkerElement.viewBox */
+  @DocsEditable
+  @DomName('SVGMarkerElement.viewBox')
   AnimatedRect get viewBox native "SVGMarkerElement_viewBox_Getter";
 
-
-  /** @domName SVGMarkerElement.xmllang */
+  @DocsEditable
+  @DomName('SVGMarkerElement.xmllang')
   String get xmllang native "SVGMarkerElement_xmllang_Getter";
 
-
-  /** @domName SVGMarkerElement.xmllang */
+  @DocsEditable
+  @DomName('SVGMarkerElement.xmllang')
   void set xmllang(String value) native "SVGMarkerElement_xmllang_Setter";
 
-
-  /** @domName SVGMarkerElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGMarkerElement.xmlspace')
   String get xmlspace native "SVGMarkerElement_xmlspace_Getter";
 
-
-  /** @domName SVGMarkerElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGMarkerElement.xmlspace')
   void set xmlspace(String value) native "SVGMarkerElement_xmlspace_Setter";
 
-
-  /** @domName SVGMarkerElement.className */
+  @DocsEditable
+  @DomName('SVGMarkerElement.className')
   AnimatedString get $dom_svgClassName native "SVGMarkerElement_className_Getter";
 
-
-  /** @domName SVGMarkerElement.style */
+  @DocsEditable
+  @DomName('SVGMarkerElement.style')
   CssStyleDeclaration get style native "SVGMarkerElement_style_Getter";
 
-
-  /** @domName SVGMarkerElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGMarkerElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGMarkerElement_getPresentationAttribute_Callback";
 
 }
@@ -4177,83 +4280,84 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGMaskElement
+@DocsEditable
+@DomName('SVGMaskElement')
 class MaskElement extends SvgElement implements Tests, Stylable, ExternalResourcesRequired, LangSpace {
   MaskElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory MaskElement() => _SvgElementFactoryProvider.createSvgElement_tag("mask");
 
-
-  /** @domName SVGMaskElement.height */
+  @DocsEditable
+  @DomName('SVGMaskElement.height')
   AnimatedLength get height native "SVGMaskElement_height_Getter";
 
-
-  /** @domName SVGMaskElement.maskContentUnits */
+  @DocsEditable
+  @DomName('SVGMaskElement.maskContentUnits')
   AnimatedEnumeration get maskContentUnits native "SVGMaskElement_maskContentUnits_Getter";
 
-
-  /** @domName SVGMaskElement.maskUnits */
+  @DocsEditable
+  @DomName('SVGMaskElement.maskUnits')
   AnimatedEnumeration get maskUnits native "SVGMaskElement_maskUnits_Getter";
 
-
-  /** @domName SVGMaskElement.width */
+  @DocsEditable
+  @DomName('SVGMaskElement.width')
   AnimatedLength get width native "SVGMaskElement_width_Getter";
 
-
-  /** @domName SVGMaskElement.x */
+  @DocsEditable
+  @DomName('SVGMaskElement.x')
   AnimatedLength get x native "SVGMaskElement_x_Getter";
 
-
-  /** @domName SVGMaskElement.y */
+  @DocsEditable
+  @DomName('SVGMaskElement.y')
   AnimatedLength get y native "SVGMaskElement_y_Getter";
 
-
-  /** @domName SVGMaskElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGMaskElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGMaskElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGMaskElement.xmllang */
+  @DocsEditable
+  @DomName('SVGMaskElement.xmllang')
   String get xmllang native "SVGMaskElement_xmllang_Getter";
 
-
-  /** @domName SVGMaskElement.xmllang */
+  @DocsEditable
+  @DomName('SVGMaskElement.xmllang')
   void set xmllang(String value) native "SVGMaskElement_xmllang_Setter";
 
-
-  /** @domName SVGMaskElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGMaskElement.xmlspace')
   String get xmlspace native "SVGMaskElement_xmlspace_Getter";
 
-
-  /** @domName SVGMaskElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGMaskElement.xmlspace')
   void set xmlspace(String value) native "SVGMaskElement_xmlspace_Setter";
 
-
-  /** @domName SVGMaskElement.className */
+  @DocsEditable
+  @DomName('SVGMaskElement.className')
   AnimatedString get $dom_svgClassName native "SVGMaskElement_className_Getter";
 
-
-  /** @domName SVGMaskElement.style */
+  @DocsEditable
+  @DomName('SVGMaskElement.style')
   CssStyleDeclaration get style native "SVGMaskElement_style_Getter";
 
-
-  /** @domName SVGMaskElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGMaskElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGMaskElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGMaskElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGMaskElement.requiredExtensions')
   StringList get requiredExtensions native "SVGMaskElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGMaskElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGMaskElement.requiredFeatures')
   StringList get requiredFeatures native "SVGMaskElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGMaskElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGMaskElement.systemLanguage')
   StringList get systemLanguage native "SVGMaskElement_systemLanguage_Getter";
 
-
-  /** @domName SVGMaskElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGMaskElement.hasExtension')
   bool hasExtension(String extension) native "SVGMaskElement_hasExtension_Callback";
 
 }
@@ -4264,100 +4368,101 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGMatrix
+@DocsEditable
+@DomName('SVGMatrix')
 class Matrix extends NativeFieldWrapperClass1 {
   Matrix.internal();
 
-
-  /** @domName SVGMatrix.a */
+  @DocsEditable
+  @DomName('SVGMatrix.a')
   num get a native "SVGMatrix_a_Getter";
 
-
-  /** @domName SVGMatrix.a */
+  @DocsEditable
+  @DomName('SVGMatrix.a')
   void set a(num value) native "SVGMatrix_a_Setter";
 
-
-  /** @domName SVGMatrix.b */
+  @DocsEditable
+  @DomName('SVGMatrix.b')
   num get b native "SVGMatrix_b_Getter";
 
-
-  /** @domName SVGMatrix.b */
+  @DocsEditable
+  @DomName('SVGMatrix.b')
   void set b(num value) native "SVGMatrix_b_Setter";
 
-
-  /** @domName SVGMatrix.c */
+  @DocsEditable
+  @DomName('SVGMatrix.c')
   num get c native "SVGMatrix_c_Getter";
 
-
-  /** @domName SVGMatrix.c */
+  @DocsEditable
+  @DomName('SVGMatrix.c')
   void set c(num value) native "SVGMatrix_c_Setter";
 
-
-  /** @domName SVGMatrix.d */
+  @DocsEditable
+  @DomName('SVGMatrix.d')
   num get d native "SVGMatrix_d_Getter";
 
-
-  /** @domName SVGMatrix.d */
+  @DocsEditable
+  @DomName('SVGMatrix.d')
   void set d(num value) native "SVGMatrix_d_Setter";
 
-
-  /** @domName SVGMatrix.e */
+  @DocsEditable
+  @DomName('SVGMatrix.e')
   num get e native "SVGMatrix_e_Getter";
 
-
-  /** @domName SVGMatrix.e */
+  @DocsEditable
+  @DomName('SVGMatrix.e')
   void set e(num value) native "SVGMatrix_e_Setter";
 
-
-  /** @domName SVGMatrix.f */
+  @DocsEditable
+  @DomName('SVGMatrix.f')
   num get f native "SVGMatrix_f_Getter";
 
-
-  /** @domName SVGMatrix.f */
+  @DocsEditable
+  @DomName('SVGMatrix.f')
   void set f(num value) native "SVGMatrix_f_Setter";
 
-
-  /** @domName SVGMatrix.flipX */
+  @DocsEditable
+  @DomName('SVGMatrix.flipX')
   Matrix flipX() native "SVGMatrix_flipX_Callback";
 
-
-  /** @domName SVGMatrix.flipY */
+  @DocsEditable
+  @DomName('SVGMatrix.flipY')
   Matrix flipY() native "SVGMatrix_flipY_Callback";
 
-
-  /** @domName SVGMatrix.inverse */
+  @DocsEditable
+  @DomName('SVGMatrix.inverse')
   Matrix inverse() native "SVGMatrix_inverse_Callback";
 
-
-  /** @domName SVGMatrix.multiply */
+  @DocsEditable
+  @DomName('SVGMatrix.multiply')
   Matrix multiply(Matrix secondMatrix) native "SVGMatrix_multiply_Callback";
 
-
-  /** @domName SVGMatrix.rotate */
+  @DocsEditable
+  @DomName('SVGMatrix.rotate')
   Matrix rotate(num angle) native "SVGMatrix_rotate_Callback";
 
-
-  /** @domName SVGMatrix.rotateFromVector */
+  @DocsEditable
+  @DomName('SVGMatrix.rotateFromVector')
   Matrix rotateFromVector(num x, num y) native "SVGMatrix_rotateFromVector_Callback";
 
-
-  /** @domName SVGMatrix.scale */
+  @DocsEditable
+  @DomName('SVGMatrix.scale')
   Matrix scale(num scaleFactor) native "SVGMatrix_scale_Callback";
 
-
-  /** @domName SVGMatrix.scaleNonUniform */
+  @DocsEditable
+  @DomName('SVGMatrix.scaleNonUniform')
   Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) native "SVGMatrix_scaleNonUniform_Callback";
 
-
-  /** @domName SVGMatrix.skewX */
+  @DocsEditable
+  @DomName('SVGMatrix.skewX')
   Matrix skewX(num angle) native "SVGMatrix_skewX_Callback";
 
-
-  /** @domName SVGMatrix.skewY */
+  @DocsEditable
+  @DomName('SVGMatrix.skewY')
   Matrix skewY(num angle) native "SVGMatrix_skewY_Callback";
 
-
-  /** @domName SVGMatrix.translate */
+  @DocsEditable
+  @DomName('SVGMatrix.translate')
   Matrix translate(num x, num y) native "SVGMatrix_translate_Callback";
 
 }
@@ -4368,7 +4473,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGMetadataElement
+@DocsEditable
+@DomName('SVGMetadataElement')
 class MetadataElement extends SvgElement {
   MetadataElement.internal() : super.internal();
 
@@ -4380,7 +4486,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGMissingGlyphElement
+@DocsEditable
+@DomName('SVGMissingGlyphElement')
 class MissingGlyphElement extends SvgElement {
   MissingGlyphElement.internal() : super.internal();
 
@@ -4392,16 +4499,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGNumber
+@DocsEditable
+@DomName('SVGNumber')
 class Number extends NativeFieldWrapperClass1 {
   Number.internal();
 
-
-  /** @domName SVGNumber.value */
+  @DocsEditable
+  @DomName('SVGNumber.value')
   num get value native "SVGNumber_value_Getter";
 
-
-  /** @domName SVGNumber.value */
+  @DocsEditable
+  @DomName('SVGNumber.value')
   void set value(num value) native "SVGNumber_value_Setter";
 
 }
@@ -4412,12 +4520,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGNumberList
+@DocsEditable
+@DomName('SVGNumberList')
 class NumberList extends NativeFieldWrapperClass1 implements List<Number> {
   NumberList.internal();
 
-
-  /** @domName SVGNumberList.numberOfItems */
+  @DocsEditable
+  @DomName('SVGNumberList.numberOfItems')
   int get numberOfItems native "SVGNumberList_numberOfItems_Getter";
 
   Number operator[](int index) native "SVGNumberList_item_Callback";
@@ -4440,50 +4549,50 @@
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Number)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Number element) => Collections.contains(this, element);
+  bool contains(Number element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Number element)) => Collections.forEach(this, f);
+  void forEach(void f(Number element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Number element)) => new MappedList<Number, dynamic>(this, f);
+  List mappedBy(f(Number element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Number> where(bool f(Number element)) => new WhereIterable<Number>(this, f);
+  Iterable<Number> where(bool f(Number element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Number element)) => Collections.every(this, f);
+  bool every(bool f(Number element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Number element)) => Collections.any(this, f);
+  bool any(bool f(Number element)) => IterableMixinWorkaround.any(this, f);
 
   List<Number> toList() => new List<Number>.from(this);
   Set<Number> toSet() => new Set<Number>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Number> take(int n) => new ListView<Number>(this, 0, n);
+  List<Number> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Number> takeWhile(bool test(Number value)) {
-    return new TakeWhileIterable<Number>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Number> skip(int n) => new ListView<Number>(this, n, null);
+  List<Number> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Number> skipWhile(bool test(Number value)) {
-    return new SkipWhileIterable<Number>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Number firstMatching(bool test(Number value), { Number orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Number lastMatching(bool test(Number value), {Number orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Number singleMatching(bool test(Number value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Number elementAt(int index) {
@@ -4509,7 +4618,7 @@
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
-  // contains() defined by IDL.
+  // clear() defined by IDL.
 
   void sort([int compare(Number a, Number b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
@@ -4539,16 +4648,36 @@
     throw new StateError("More than one element");
   }
 
-  Number min([int compare(Number a, Number b)]) => Collections.min(this, compare);
+  Number min([int compare(Number a, Number b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Number max([int compare(Number a, Number b)]) => Collections.max(this, compare);
+  Number max([int compare(Number a, Number b)]) => IterableMixinWorkaround.max(this, compare);
 
   Number removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Number removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Number element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Number element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Number> from, [int startFrom]) {
@@ -4568,32 +4697,32 @@
 
   // -- end List<Number> mixins.
 
-
-  /** @domName SVGNumberList.appendItem */
+  @DocsEditable
+  @DomName('SVGNumberList.appendItem')
   Number appendItem(Number item) native "SVGNumberList_appendItem_Callback";
 
-
-  /** @domName SVGNumberList.clear */
+  @DocsEditable
+  @DomName('SVGNumberList.clear')
   void clear() native "SVGNumberList_clear_Callback";
 
-
-  /** @domName SVGNumberList.getItem */
+  @DocsEditable
+  @DomName('SVGNumberList.getItem')
   Number getItem(int index) native "SVGNumberList_getItem_Callback";
 
-
-  /** @domName SVGNumberList.initialize */
+  @DocsEditable
+  @DomName('SVGNumberList.initialize')
   Number initialize(Number item) native "SVGNumberList_initialize_Callback";
 
-
-  /** @domName SVGNumberList.insertItemBefore */
+  @DocsEditable
+  @DomName('SVGNumberList.insertItemBefore')
   Number insertItemBefore(Number item, int index) native "SVGNumberList_insertItemBefore_Callback";
 
-
-  /** @domName SVGNumberList.removeItem */
+  @DocsEditable
+  @DomName('SVGNumberList.removeItem')
   Number removeItem(int index) native "SVGNumberList_removeItem_Callback";
 
-
-  /** @domName SVGNumberList.replaceItem */
+  @DocsEditable
+  @DomName('SVGNumberList.replaceItem')
   Number replaceItem(Number item, int index) native "SVGNumberList_replaceItem_Callback";
 
 }
@@ -4604,7 +4733,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPaint
+@DocsEditable
+@DomName('SVGPaint')
 class Paint extends Color {
   Paint.internal() : super.internal();
 
@@ -4628,20 +4758,20 @@
 
   static const int SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR = 106;
 
-
-  /** @domName SVGPaint.paintType */
+  @DocsEditable
+  @DomName('SVGPaint.paintType')
   int get paintType native "SVGPaint_paintType_Getter";
 
-
-  /** @domName SVGPaint.uri */
+  @DocsEditable
+  @DomName('SVGPaint.uri')
   String get uri native "SVGPaint_uri_Getter";
 
-
-  /** @domName SVGPaint.setPaint */
+  @DocsEditable
+  @DomName('SVGPaint.setPaint')
   void setPaint(int paintType, String uri, String rgbColor, String iccColor) native "SVGPaint_setPaint_Callback";
 
-
-  /** @domName SVGPaint.setUri */
+  @DocsEditable
+  @DomName('SVGPaint.setUri')
   void setUri(String uri) native "SVGPaint_setUri_Callback";
 
 }
@@ -4652,195 +4782,196 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathElement
+@DocsEditable
+@DomName('SVGPathElement')
 class PathElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
   PathElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory PathElement() => _SvgElementFactoryProvider.createSvgElement_tag("path");
 
-
-  /** @domName SVGPathElement.animatedNormalizedPathSegList */
+  @DocsEditable
+  @DomName('SVGPathElement.animatedNormalizedPathSegList')
   PathSegList get animatedNormalizedPathSegList native "SVGPathElement_animatedNormalizedPathSegList_Getter";
 
-
-  /** @domName SVGPathElement.animatedPathSegList */
+  @DocsEditable
+  @DomName('SVGPathElement.animatedPathSegList')
   PathSegList get animatedPathSegList native "SVGPathElement_animatedPathSegList_Getter";
 
-
-  /** @domName SVGPathElement.normalizedPathSegList */
+  @DocsEditable
+  @DomName('SVGPathElement.normalizedPathSegList')
   PathSegList get normalizedPathSegList native "SVGPathElement_normalizedPathSegList_Getter";
 
-
-  /** @domName SVGPathElement.pathLength */
+  @DocsEditable
+  @DomName('SVGPathElement.pathLength')
   AnimatedNumber get pathLength native "SVGPathElement_pathLength_Getter";
 
-
-  /** @domName SVGPathElement.pathSegList */
+  @DocsEditable
+  @DomName('SVGPathElement.pathSegList')
   PathSegList get pathSegList native "SVGPathElement_pathSegList_Getter";
 
-
-  /** @domName SVGPathElement.createSVGPathSegArcAbs */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegArcAbs')
   PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native "SVGPathElement_createSVGPathSegArcAbs_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegArcRel */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegArcRel')
   PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native "SVGPathElement_createSVGPathSegArcRel_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegClosePath */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegClosePath')
   PathSegClosePath createSvgPathSegClosePath() native "SVGPathElement_createSVGPathSegClosePath_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicAbs */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegCurvetoCubicAbs')
   PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicRel */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegCurvetoCubicRel')
   PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs')
   PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel')
   PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticAbs */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticAbs')
   PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticRel */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticRel')
   PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs')
   PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel')
   PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoAbs */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegLinetoAbs')
   PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalAbs */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalAbs')
   PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalRel */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalRel')
   PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoRel */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegLinetoRel')
   PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) native "SVGPathElement_createSVGPathSegLinetoRel_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoVerticalAbs */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegLinetoVerticalAbs')
   PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoVerticalRel */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegLinetoVerticalRel')
   PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegMovetoAbs */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegMovetoAbs')
   PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback";
 
-
-  /** @domName SVGPathElement.createSVGPathSegMovetoRel */
+  @DocsEditable
+  @DomName('SVGPathElement.createSVGPathSegMovetoRel')
   PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) native "SVGPathElement_createSVGPathSegMovetoRel_Callback";
 
-
-  /** @domName SVGPathElement.getPathSegAtLength */
+  @DocsEditable
+  @DomName('SVGPathElement.getPathSegAtLength')
   int getPathSegAtLength(num distance) native "SVGPathElement_getPathSegAtLength_Callback";
 
-
-  /** @domName SVGPathElement.getPointAtLength */
+  @DocsEditable
+  @DomName('SVGPathElement.getPointAtLength')
   Point getPointAtLength(num distance) native "SVGPathElement_getPointAtLength_Callback";
 
-
-  /** @domName SVGPathElement.getTotalLength */
+  @DocsEditable
+  @DomName('SVGPathElement.getTotalLength')
   num getTotalLength() native "SVGPathElement_getTotalLength_Callback";
 
-
-  /** @domName SVGPathElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGPathElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGPathElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGPathElement.xmllang */
+  @DocsEditable
+  @DomName('SVGPathElement.xmllang')
   String get xmllang native "SVGPathElement_xmllang_Getter";
 
-
-  /** @domName SVGPathElement.xmllang */
+  @DocsEditable
+  @DomName('SVGPathElement.xmllang')
   void set xmllang(String value) native "SVGPathElement_xmllang_Setter";
 
-
-  /** @domName SVGPathElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGPathElement.xmlspace')
   String get xmlspace native "SVGPathElement_xmlspace_Getter";
 
-
-  /** @domName SVGPathElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGPathElement.xmlspace')
   void set xmlspace(String value) native "SVGPathElement_xmlspace_Setter";
 
-
-  /** @domName SVGPathElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGPathElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGPathElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGPathElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGPathElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGPathElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGPathElement.getBBox */
+  @DocsEditable
+  @DomName('SVGPathElement.getBBox')
   Rect getBBox() native "SVGPathElement_getBBox_Callback";
 
-
-  /** @domName SVGPathElement.getCTM */
+  @DocsEditable
+  @DomName('SVGPathElement.getCTM')
   Matrix getCtm() native "SVGPathElement_getCTM_Callback";
 
-
-  /** @domName SVGPathElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGPathElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGPathElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGPathElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGPathElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGPathElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGPathElement.className */
+  @DocsEditable
+  @DomName('SVGPathElement.className')
   AnimatedString get $dom_svgClassName native "SVGPathElement_className_Getter";
 
-
-  /** @domName SVGPathElement.style */
+  @DocsEditable
+  @DomName('SVGPathElement.style')
   CssStyleDeclaration get style native "SVGPathElement_style_Getter";
 
-
-  /** @domName SVGPathElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGPathElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGPathElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGPathElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGPathElement.requiredExtensions')
   StringList get requiredExtensions native "SVGPathElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGPathElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGPathElement.requiredFeatures')
   StringList get requiredFeatures native "SVGPathElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGPathElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGPathElement.systemLanguage')
   StringList get systemLanguage native "SVGPathElement_systemLanguage_Getter";
 
-
-  /** @domName SVGPathElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGPathElement.hasExtension')
   bool hasExtension(String extension) native "SVGPathElement_hasExtension_Callback";
 
-
-  /** @domName SVGPathElement.transform */
+  @DocsEditable
+  @DomName('SVGPathElement.transform')
   AnimatedTransformList get transform native "SVGPathElement_transform_Getter";
 
 }
@@ -4851,7 +4982,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSeg
+@DocsEditable
+@DomName('SVGPathSeg')
 class PathSeg extends NativeFieldWrapperClass1 {
   PathSeg.internal();
 
@@ -4895,12 +5027,12 @@
 
   static const int PATHSEG_UNKNOWN = 0;
 
-
-  /** @domName SVGPathSeg.pathSegType */
+  @DocsEditable
+  @DomName('SVGPathSeg.pathSegType')
   int get pathSegType native "SVGPathSeg_pathSegType_Getter";
 
-
-  /** @domName SVGPathSeg.pathSegTypeAsLetter */
+  @DocsEditable
+  @DomName('SVGPathSeg.pathSegTypeAsLetter')
   String get pathSegTypeAsLetter native "SVGPathSeg_pathSegTypeAsLetter_Getter";
 
 }
@@ -4911,64 +5043,65 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegArcAbs
+@DocsEditable
+@DomName('SVGPathSegArcAbs')
 class PathSegArcAbs extends PathSeg {
   PathSegArcAbs.internal() : super.internal();
 
-
-  /** @domName SVGPathSegArcAbs.angle */
+  @DocsEditable
+  @DomName('SVGPathSegArcAbs.angle')
   num get angle native "SVGPathSegArcAbs_angle_Getter";
 
-
-  /** @domName SVGPathSegArcAbs.angle */
+  @DocsEditable
+  @DomName('SVGPathSegArcAbs.angle')
   void set angle(num value) native "SVGPathSegArcAbs_angle_Setter";
 
-
-  /** @domName SVGPathSegArcAbs.largeArcFlag */
+  @DocsEditable
+  @DomName('SVGPathSegArcAbs.largeArcFlag')
   bool get largeArcFlag native "SVGPathSegArcAbs_largeArcFlag_Getter";
 
-
-  /** @domName SVGPathSegArcAbs.largeArcFlag */
+  @DocsEditable
+  @DomName('SVGPathSegArcAbs.largeArcFlag')
   void set largeArcFlag(bool value) native "SVGPathSegArcAbs_largeArcFlag_Setter";
 
-
-  /** @domName SVGPathSegArcAbs.r1 */
+  @DocsEditable
+  @DomName('SVGPathSegArcAbs.r1')
   num get r1 native "SVGPathSegArcAbs_r1_Getter";
 
-
-  /** @domName SVGPathSegArcAbs.r1 */
+  @DocsEditable
+  @DomName('SVGPathSegArcAbs.r1')
   void set r1(num value) native "SVGPathSegArcAbs_r1_Setter";
 
-
-  /** @domName SVGPathSegArcAbs.r2 */
+  @DocsEditable
+  @DomName('SVGPathSegArcAbs.r2')
   num get r2 native "SVGPathSegArcAbs_r2_Getter";
 
-
-  /** @domName SVGPathSegArcAbs.r2 */
+  @DocsEditable
+  @DomName('SVGPathSegArcAbs.r2')
   void set r2(num value) native "SVGPathSegArcAbs_r2_Setter";
 
-
-  /** @domName SVGPathSegArcAbs.sweepFlag */
+  @DocsEditable
+  @DomName('SVGPathSegArcAbs.sweepFlag')
   bool get sweepFlag native "SVGPathSegArcAbs_sweepFlag_Getter";
 
-
-  /** @domName SVGPathSegArcAbs.sweepFlag */
+  @DocsEditable
+  @DomName('SVGPathSegArcAbs.sweepFlag')
   void set sweepFlag(bool value) native "SVGPathSegArcAbs_sweepFlag_Setter";
 
-
-  /** @domName SVGPathSegArcAbs.x */
+  @DocsEditable
+  @DomName('SVGPathSegArcAbs.x')
   num get x native "SVGPathSegArcAbs_x_Getter";
 
-
-  /** @domName SVGPathSegArcAbs.x */
+  @DocsEditable
+  @DomName('SVGPathSegArcAbs.x')
   void set x(num value) native "SVGPathSegArcAbs_x_Setter";
 
-
-  /** @domName SVGPathSegArcAbs.y */
+  @DocsEditable
+  @DomName('SVGPathSegArcAbs.y')
   num get y native "SVGPathSegArcAbs_y_Getter";
 
-
-  /** @domName SVGPathSegArcAbs.y */
+  @DocsEditable
+  @DomName('SVGPathSegArcAbs.y')
   void set y(num value) native "SVGPathSegArcAbs_y_Setter";
 
 }
@@ -4979,64 +5112,65 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegArcRel
+@DocsEditable
+@DomName('SVGPathSegArcRel')
 class PathSegArcRel extends PathSeg {
   PathSegArcRel.internal() : super.internal();
 
-
-  /** @domName SVGPathSegArcRel.angle */
+  @DocsEditable
+  @DomName('SVGPathSegArcRel.angle')
   num get angle native "SVGPathSegArcRel_angle_Getter";
 
-
-  /** @domName SVGPathSegArcRel.angle */
+  @DocsEditable
+  @DomName('SVGPathSegArcRel.angle')
   void set angle(num value) native "SVGPathSegArcRel_angle_Setter";
 
-
-  /** @domName SVGPathSegArcRel.largeArcFlag */
+  @DocsEditable
+  @DomName('SVGPathSegArcRel.largeArcFlag')
   bool get largeArcFlag native "SVGPathSegArcRel_largeArcFlag_Getter";
 
-
-  /** @domName SVGPathSegArcRel.largeArcFlag */
+  @DocsEditable
+  @DomName('SVGPathSegArcRel.largeArcFlag')
   void set largeArcFlag(bool value) native "SVGPathSegArcRel_largeArcFlag_Setter";
 
-
-  /** @domName SVGPathSegArcRel.r1 */
+  @DocsEditable
+  @DomName('SVGPathSegArcRel.r1')
   num get r1 native "SVGPathSegArcRel_r1_Getter";
 
-
-  /** @domName SVGPathSegArcRel.r1 */
+  @DocsEditable
+  @DomName('SVGPathSegArcRel.r1')
   void set r1(num value) native "SVGPathSegArcRel_r1_Setter";
 
-
-  /** @domName SVGPathSegArcRel.r2 */
+  @DocsEditable
+  @DomName('SVGPathSegArcRel.r2')
   num get r2 native "SVGPathSegArcRel_r2_Getter";
 
-
-  /** @domName SVGPathSegArcRel.r2 */
+  @DocsEditable
+  @DomName('SVGPathSegArcRel.r2')
   void set r2(num value) native "SVGPathSegArcRel_r2_Setter";
 
-
-  /** @domName SVGPathSegArcRel.sweepFlag */
+  @DocsEditable
+  @DomName('SVGPathSegArcRel.sweepFlag')
   bool get sweepFlag native "SVGPathSegArcRel_sweepFlag_Getter";
 
-
-  /** @domName SVGPathSegArcRel.sweepFlag */
+  @DocsEditable
+  @DomName('SVGPathSegArcRel.sweepFlag')
   void set sweepFlag(bool value) native "SVGPathSegArcRel_sweepFlag_Setter";
 
-
-  /** @domName SVGPathSegArcRel.x */
+  @DocsEditable
+  @DomName('SVGPathSegArcRel.x')
   num get x native "SVGPathSegArcRel_x_Getter";
 
-
-  /** @domName SVGPathSegArcRel.x */
+  @DocsEditable
+  @DomName('SVGPathSegArcRel.x')
   void set x(num value) native "SVGPathSegArcRel_x_Setter";
 
-
-  /** @domName SVGPathSegArcRel.y */
+  @DocsEditable
+  @DomName('SVGPathSegArcRel.y')
   num get y native "SVGPathSegArcRel_y_Getter";
 
-
-  /** @domName SVGPathSegArcRel.y */
+  @DocsEditable
+  @DomName('SVGPathSegArcRel.y')
   void set y(num value) native "SVGPathSegArcRel_y_Setter";
 
 }
@@ -5047,7 +5181,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegClosePath
+@DocsEditable
+@DomName('SVGPathSegClosePath')
 class PathSegClosePath extends PathSeg {
   PathSegClosePath.internal() : super.internal();
 
@@ -5059,56 +5194,57 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegCurvetoCubicAbs
+@DocsEditable
+@DomName('SVGPathSegCurvetoCubicAbs')
 class PathSegCurvetoCubicAbs extends PathSeg {
   PathSegCurvetoCubicAbs.internal() : super.internal();
 
-
-  /** @domName SVGPathSegCurvetoCubicAbs.x */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicAbs.x')
   num get x native "SVGPathSegCurvetoCubicAbs_x_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicAbs.x */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicAbs.x')
   void set x(num value) native "SVGPathSegCurvetoCubicAbs_x_Setter";
 
-
-  /** @domName SVGPathSegCurvetoCubicAbs.x1 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicAbs.x1')
   num get x1 native "SVGPathSegCurvetoCubicAbs_x1_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicAbs.x1 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicAbs.x1')
   void set x1(num value) native "SVGPathSegCurvetoCubicAbs_x1_Setter";
 
-
-  /** @domName SVGPathSegCurvetoCubicAbs.x2 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicAbs.x2')
   num get x2 native "SVGPathSegCurvetoCubicAbs_x2_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicAbs.x2 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicAbs.x2')
   void set x2(num value) native "SVGPathSegCurvetoCubicAbs_x2_Setter";
 
-
-  /** @domName SVGPathSegCurvetoCubicAbs.y */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicAbs.y')
   num get y native "SVGPathSegCurvetoCubicAbs_y_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicAbs.y */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicAbs.y')
   void set y(num value) native "SVGPathSegCurvetoCubicAbs_y_Setter";
 
-
-  /** @domName SVGPathSegCurvetoCubicAbs.y1 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicAbs.y1')
   num get y1 native "SVGPathSegCurvetoCubicAbs_y1_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicAbs.y1 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicAbs.y1')
   void set y1(num value) native "SVGPathSegCurvetoCubicAbs_y1_Setter";
 
-
-  /** @domName SVGPathSegCurvetoCubicAbs.y2 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicAbs.y2')
   num get y2 native "SVGPathSegCurvetoCubicAbs_y2_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicAbs.y2 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicAbs.y2')
   void set y2(num value) native "SVGPathSegCurvetoCubicAbs_y2_Setter";
 
 }
@@ -5119,56 +5255,57 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegCurvetoCubicRel
+@DocsEditable
+@DomName('SVGPathSegCurvetoCubicRel')
 class PathSegCurvetoCubicRel extends PathSeg {
   PathSegCurvetoCubicRel.internal() : super.internal();
 
-
-  /** @domName SVGPathSegCurvetoCubicRel.x */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicRel.x')
   num get x native "SVGPathSegCurvetoCubicRel_x_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicRel.x */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicRel.x')
   void set x(num value) native "SVGPathSegCurvetoCubicRel_x_Setter";
 
-
-  /** @domName SVGPathSegCurvetoCubicRel.x1 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicRel.x1')
   num get x1 native "SVGPathSegCurvetoCubicRel_x1_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicRel.x1 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicRel.x1')
   void set x1(num value) native "SVGPathSegCurvetoCubicRel_x1_Setter";
 
-
-  /** @domName SVGPathSegCurvetoCubicRel.x2 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicRel.x2')
   num get x2 native "SVGPathSegCurvetoCubicRel_x2_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicRel.x2 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicRel.x2')
   void set x2(num value) native "SVGPathSegCurvetoCubicRel_x2_Setter";
 
-
-  /** @domName SVGPathSegCurvetoCubicRel.y */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicRel.y')
   num get y native "SVGPathSegCurvetoCubicRel_y_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicRel.y */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicRel.y')
   void set y(num value) native "SVGPathSegCurvetoCubicRel_y_Setter";
 
-
-  /** @domName SVGPathSegCurvetoCubicRel.y1 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicRel.y1')
   num get y1 native "SVGPathSegCurvetoCubicRel_y1_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicRel.y1 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicRel.y1')
   void set y1(num value) native "SVGPathSegCurvetoCubicRel_y1_Setter";
 
-
-  /** @domName SVGPathSegCurvetoCubicRel.y2 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicRel.y2')
   num get y2 native "SVGPathSegCurvetoCubicRel_y2_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicRel.y2 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicRel.y2')
   void set y2(num value) native "SVGPathSegCurvetoCubicRel_y2_Setter";
 
 }
@@ -5179,40 +5316,41 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegCurvetoCubicSmoothAbs
+@DocsEditable
+@DomName('SVGPathSegCurvetoCubicSmoothAbs')
 class PathSegCurvetoCubicSmoothAbs extends PathSeg {
   PathSegCurvetoCubicSmoothAbs.internal() : super.internal();
 
-
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
   num get x native "SVGPathSegCurvetoCubicSmoothAbs_x_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
   void set x(num value) native "SVGPathSegCurvetoCubicSmoothAbs_x_Setter";
 
-
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x2 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicSmoothAbs.x2')
   num get x2 native "SVGPathSegCurvetoCubicSmoothAbs_x2_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x2 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicSmoothAbs.x2')
   void set x2(num value) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Setter";
 
-
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicSmoothAbs.y')
   num get y native "SVGPathSegCurvetoCubicSmoothAbs_y_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicSmoothAbs.y')
   void set y(num value) native "SVGPathSegCurvetoCubicSmoothAbs_y_Setter";
 
-
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y2 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicSmoothAbs.y2')
   num get y2 native "SVGPathSegCurvetoCubicSmoothAbs_y2_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y2 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicSmoothAbs.y2')
   void set y2(num value) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Setter";
 
 }
@@ -5223,40 +5361,41 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegCurvetoCubicSmoothRel
+@DocsEditable
+@DomName('SVGPathSegCurvetoCubicSmoothRel')
 class PathSegCurvetoCubicSmoothRel extends PathSeg {
   PathSegCurvetoCubicSmoothRel.internal() : super.internal();
 
-
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.x */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
   num get x native "SVGPathSegCurvetoCubicSmoothRel_x_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.x */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
   void set x(num value) native "SVGPathSegCurvetoCubicSmoothRel_x_Setter";
 
-
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.x2 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicSmoothRel.x2')
   num get x2 native "SVGPathSegCurvetoCubicSmoothRel_x2_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.x2 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicSmoothRel.x2')
   void set x2(num value) native "SVGPathSegCurvetoCubicSmoothRel_x2_Setter";
 
-
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.y */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicSmoothRel.y')
   num get y native "SVGPathSegCurvetoCubicSmoothRel_y_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.y */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicSmoothRel.y')
   void set y(num value) native "SVGPathSegCurvetoCubicSmoothRel_y_Setter";
 
-
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.y2 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicSmoothRel.y2')
   num get y2 native "SVGPathSegCurvetoCubicSmoothRel_y2_Getter";
 
-
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.y2 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoCubicSmoothRel.y2')
   void set y2(num value) native "SVGPathSegCurvetoCubicSmoothRel_y2_Setter";
 
 }
@@ -5267,40 +5406,41 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegCurvetoQuadraticAbs
+@DocsEditable
+@DomName('SVGPathSegCurvetoQuadraticAbs')
 class PathSegCurvetoQuadraticAbs extends PathSeg {
   PathSegCurvetoQuadraticAbs.internal() : super.internal();
 
-
-  /** @domName SVGPathSegCurvetoQuadraticAbs.x */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticAbs.x')
   num get x native "SVGPathSegCurvetoQuadraticAbs_x_Getter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticAbs.x */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticAbs.x')
   void set x(num value) native "SVGPathSegCurvetoQuadraticAbs_x_Setter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticAbs.x1 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticAbs.x1')
   num get x1 native "SVGPathSegCurvetoQuadraticAbs_x1_Getter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticAbs.x1 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticAbs.x1')
   void set x1(num value) native "SVGPathSegCurvetoQuadraticAbs_x1_Setter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticAbs.y */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticAbs.y')
   num get y native "SVGPathSegCurvetoQuadraticAbs_y_Getter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticAbs.y */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticAbs.y')
   void set y(num value) native "SVGPathSegCurvetoQuadraticAbs_y_Setter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticAbs.y1 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticAbs.y1')
   num get y1 native "SVGPathSegCurvetoQuadraticAbs_y1_Getter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticAbs.y1 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticAbs.y1')
   void set y1(num value) native "SVGPathSegCurvetoQuadraticAbs_y1_Setter";
 
 }
@@ -5311,40 +5451,41 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegCurvetoQuadraticRel
+@DocsEditable
+@DomName('SVGPathSegCurvetoQuadraticRel')
 class PathSegCurvetoQuadraticRel extends PathSeg {
   PathSegCurvetoQuadraticRel.internal() : super.internal();
 
-
-  /** @domName SVGPathSegCurvetoQuadraticRel.x */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticRel.x')
   num get x native "SVGPathSegCurvetoQuadraticRel_x_Getter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticRel.x */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticRel.x')
   void set x(num value) native "SVGPathSegCurvetoQuadraticRel_x_Setter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticRel.x1 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticRel.x1')
   num get x1 native "SVGPathSegCurvetoQuadraticRel_x1_Getter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticRel.x1 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticRel.x1')
   void set x1(num value) native "SVGPathSegCurvetoQuadraticRel_x1_Setter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticRel.y */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticRel.y')
   num get y native "SVGPathSegCurvetoQuadraticRel_y_Getter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticRel.y */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticRel.y')
   void set y(num value) native "SVGPathSegCurvetoQuadraticRel_y_Setter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticRel.y1 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticRel.y1')
   num get y1 native "SVGPathSegCurvetoQuadraticRel_y1_Getter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticRel.y1 */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticRel.y1')
   void set y1(num value) native "SVGPathSegCurvetoQuadraticRel_y1_Setter";
 
 }
@@ -5355,24 +5496,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegCurvetoQuadraticSmoothAbs
+@DocsEditable
+@DomName('SVGPathSegCurvetoQuadraticSmoothAbs')
 class PathSegCurvetoQuadraticSmoothAbs extends PathSeg {
   PathSegCurvetoQuadraticSmoothAbs.internal() : super.internal();
 
-
-  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.x */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
   num get x native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.x */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
   void set x(num value) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.y */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.y')
   num get y native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.y */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.y')
   void set y(num value) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter";
 
 }
@@ -5383,24 +5525,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegCurvetoQuadraticSmoothRel
+@DocsEditable
+@DomName('SVGPathSegCurvetoQuadraticSmoothRel')
 class PathSegCurvetoQuadraticSmoothRel extends PathSeg {
   PathSegCurvetoQuadraticSmoothRel.internal() : super.internal();
 
-
-  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.x */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
   num get x native "SVGPathSegCurvetoQuadraticSmoothRel_x_Getter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.x */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
   void set x(num value) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Setter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.y */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticSmoothRel.y')
   num get y native "SVGPathSegCurvetoQuadraticSmoothRel_y_Getter";
 
-
-  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.y */
+  @DocsEditable
+  @DomName('SVGPathSegCurvetoQuadraticSmoothRel.y')
   void set y(num value) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Setter";
 
 }
@@ -5411,24 +5554,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegLinetoAbs
+@DocsEditable
+@DomName('SVGPathSegLinetoAbs')
 class PathSegLinetoAbs extends PathSeg {
   PathSegLinetoAbs.internal() : super.internal();
 
-
-  /** @domName SVGPathSegLinetoAbs.x */
+  @DocsEditable
+  @DomName('SVGPathSegLinetoAbs.x')
   num get x native "SVGPathSegLinetoAbs_x_Getter";
 
-
-  /** @domName SVGPathSegLinetoAbs.x */
+  @DocsEditable
+  @DomName('SVGPathSegLinetoAbs.x')
   void set x(num value) native "SVGPathSegLinetoAbs_x_Setter";
 
-
-  /** @domName SVGPathSegLinetoAbs.y */
+  @DocsEditable
+  @DomName('SVGPathSegLinetoAbs.y')
   num get y native "SVGPathSegLinetoAbs_y_Getter";
 
-
-  /** @domName SVGPathSegLinetoAbs.y */
+  @DocsEditable
+  @DomName('SVGPathSegLinetoAbs.y')
   void set y(num value) native "SVGPathSegLinetoAbs_y_Setter";
 
 }
@@ -5439,16 +5583,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegLinetoHorizontalAbs
+@DocsEditable
+@DomName('SVGPathSegLinetoHorizontalAbs')
 class PathSegLinetoHorizontalAbs extends PathSeg {
   PathSegLinetoHorizontalAbs.internal() : super.internal();
 
-
-  /** @domName SVGPathSegLinetoHorizontalAbs.x */
+  @DocsEditable
+  @DomName('SVGPathSegLinetoHorizontalAbs.x')
   num get x native "SVGPathSegLinetoHorizontalAbs_x_Getter";
 
-
-  /** @domName SVGPathSegLinetoHorizontalAbs.x */
+  @DocsEditable
+  @DomName('SVGPathSegLinetoHorizontalAbs.x')
   void set x(num value) native "SVGPathSegLinetoHorizontalAbs_x_Setter";
 
 }
@@ -5459,16 +5604,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegLinetoHorizontalRel
+@DocsEditable
+@DomName('SVGPathSegLinetoHorizontalRel')
 class PathSegLinetoHorizontalRel extends PathSeg {
   PathSegLinetoHorizontalRel.internal() : super.internal();
 
-
-  /** @domName SVGPathSegLinetoHorizontalRel.x */
+  @DocsEditable
+  @DomName('SVGPathSegLinetoHorizontalRel.x')
   num get x native "SVGPathSegLinetoHorizontalRel_x_Getter";
 
-
-  /** @domName SVGPathSegLinetoHorizontalRel.x */
+  @DocsEditable
+  @DomName('SVGPathSegLinetoHorizontalRel.x')
   void set x(num value) native "SVGPathSegLinetoHorizontalRel_x_Setter";
 
 }
@@ -5479,24 +5625,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegLinetoRel
+@DocsEditable
+@DomName('SVGPathSegLinetoRel')
 class PathSegLinetoRel extends PathSeg {
   PathSegLinetoRel.internal() : super.internal();
 
-
-  /** @domName SVGPathSegLinetoRel.x */
+  @DocsEditable
+  @DomName('SVGPathSegLinetoRel.x')
   num get x native "SVGPathSegLinetoRel_x_Getter";
 
-
-  /** @domName SVGPathSegLinetoRel.x */
+  @DocsEditable
+  @DomName('SVGPathSegLinetoRel.x')
   void set x(num value) native "SVGPathSegLinetoRel_x_Setter";
 
-
-  /** @domName SVGPathSegLinetoRel.y */
+  @DocsEditable
+  @DomName('SVGPathSegLinetoRel.y')
   num get y native "SVGPathSegLinetoRel_y_Getter";
 
-
-  /** @domName SVGPathSegLinetoRel.y */
+  @DocsEditable
+  @DomName('SVGPathSegLinetoRel.y')
   void set y(num value) native "SVGPathSegLinetoRel_y_Setter";
 
 }
@@ -5507,16 +5654,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegLinetoVerticalAbs
+@DocsEditable
+@DomName('SVGPathSegLinetoVerticalAbs')
 class PathSegLinetoVerticalAbs extends PathSeg {
   PathSegLinetoVerticalAbs.internal() : super.internal();
 
-
-  /** @domName SVGPathSegLinetoVerticalAbs.y */
+  @DocsEditable
+  @DomName('SVGPathSegLinetoVerticalAbs.y')
   num get y native "SVGPathSegLinetoVerticalAbs_y_Getter";
 
-
-  /** @domName SVGPathSegLinetoVerticalAbs.y */
+  @DocsEditable
+  @DomName('SVGPathSegLinetoVerticalAbs.y')
   void set y(num value) native "SVGPathSegLinetoVerticalAbs_y_Setter";
 
 }
@@ -5527,16 +5675,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegLinetoVerticalRel
+@DocsEditable
+@DomName('SVGPathSegLinetoVerticalRel')
 class PathSegLinetoVerticalRel extends PathSeg {
   PathSegLinetoVerticalRel.internal() : super.internal();
 
-
-  /** @domName SVGPathSegLinetoVerticalRel.y */
+  @DocsEditable
+  @DomName('SVGPathSegLinetoVerticalRel.y')
   num get y native "SVGPathSegLinetoVerticalRel_y_Getter";
 
-
-  /** @domName SVGPathSegLinetoVerticalRel.y */
+  @DocsEditable
+  @DomName('SVGPathSegLinetoVerticalRel.y')
   void set y(num value) native "SVGPathSegLinetoVerticalRel_y_Setter";
 
 }
@@ -5547,12 +5696,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegList
+@DocsEditable
+@DomName('SVGPathSegList')
 class PathSegList extends NativeFieldWrapperClass1 implements List<PathSeg> {
   PathSegList.internal();
 
-
-  /** @domName SVGPathSegList.numberOfItems */
+  @DocsEditable
+  @DomName('SVGPathSegList.numberOfItems')
   int get numberOfItems native "SVGPathSegList_numberOfItems_Getter";
 
   PathSeg operator[](int index) native "SVGPathSegList_item_Callback";
@@ -5575,50 +5725,50 @@
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, PathSeg)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(PathSeg element) => Collections.contains(this, element);
+  bool contains(PathSeg element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(PathSeg element)) => Collections.forEach(this, f);
+  void forEach(void f(PathSeg element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(PathSeg element)) => new MappedList<PathSeg, dynamic>(this, f);
+  List mappedBy(f(PathSeg element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<PathSeg> where(bool f(PathSeg element)) => new WhereIterable<PathSeg>(this, f);
+  Iterable<PathSeg> where(bool f(PathSeg element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(PathSeg element)) => Collections.every(this, f);
+  bool every(bool f(PathSeg element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(PathSeg element)) => Collections.any(this, f);
+  bool any(bool f(PathSeg element)) => IterableMixinWorkaround.any(this, f);
 
   List<PathSeg> toList() => new List<PathSeg>.from(this);
   Set<PathSeg> toSet() => new Set<PathSeg>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<PathSeg> take(int n) => new ListView<PathSeg>(this, 0, n);
+  List<PathSeg> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<PathSeg> takeWhile(bool test(PathSeg value)) {
-    return new TakeWhileIterable<PathSeg>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<PathSeg> skip(int n) => new ListView<PathSeg>(this, n, null);
+  List<PathSeg> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<PathSeg> skipWhile(bool test(PathSeg value)) {
-    return new SkipWhileIterable<PathSeg>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   PathSeg firstMatching(bool test(PathSeg value), { PathSeg orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   PathSeg lastMatching(bool test(PathSeg value), {PathSeg orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   PathSeg singleMatching(bool test(PathSeg value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   PathSeg elementAt(int index) {
@@ -5644,7 +5794,7 @@
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
-  // contains() defined by IDL.
+  // clear() defined by IDL.
 
   void sort([int compare(PathSeg a, PathSeg b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
@@ -5674,16 +5824,36 @@
     throw new StateError("More than one element");
   }
 
-  PathSeg min([int compare(PathSeg a, PathSeg b)]) => Collections.min(this, compare);
+  PathSeg min([int compare(PathSeg a, PathSeg b)]) => IterableMixinWorkaround.min(this, compare);
 
-  PathSeg max([int compare(PathSeg a, PathSeg b)]) => Collections.max(this, compare);
+  PathSeg max([int compare(PathSeg a, PathSeg b)]) => IterableMixinWorkaround.max(this, compare);
 
   PathSeg removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   PathSeg removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(PathSeg element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(PathSeg element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<PathSeg> from, [int startFrom]) {
@@ -5703,32 +5873,32 @@
 
   // -- end List<PathSeg> mixins.
 
-
-  /** @domName SVGPathSegList.appendItem */
+  @DocsEditable
+  @DomName('SVGPathSegList.appendItem')
   PathSeg appendItem(PathSeg newItem) native "SVGPathSegList_appendItem_Callback";
 
-
-  /** @domName SVGPathSegList.clear */
+  @DocsEditable
+  @DomName('SVGPathSegList.clear')
   void clear() native "SVGPathSegList_clear_Callback";
 
-
-  /** @domName SVGPathSegList.getItem */
+  @DocsEditable
+  @DomName('SVGPathSegList.getItem')
   PathSeg getItem(int index) native "SVGPathSegList_getItem_Callback";
 
-
-  /** @domName SVGPathSegList.initialize */
+  @DocsEditable
+  @DomName('SVGPathSegList.initialize')
   PathSeg initialize(PathSeg newItem) native "SVGPathSegList_initialize_Callback";
 
-
-  /** @domName SVGPathSegList.insertItemBefore */
+  @DocsEditable
+  @DomName('SVGPathSegList.insertItemBefore')
   PathSeg insertItemBefore(PathSeg newItem, int index) native "SVGPathSegList_insertItemBefore_Callback";
 
-
-  /** @domName SVGPathSegList.removeItem */
+  @DocsEditable
+  @DomName('SVGPathSegList.removeItem')
   PathSeg removeItem(int index) native "SVGPathSegList_removeItem_Callback";
 
-
-  /** @domName SVGPathSegList.replaceItem */
+  @DocsEditable
+  @DomName('SVGPathSegList.replaceItem')
   PathSeg replaceItem(PathSeg newItem, int index) native "SVGPathSegList_replaceItem_Callback";
 
 }
@@ -5739,24 +5909,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegMovetoAbs
+@DocsEditable
+@DomName('SVGPathSegMovetoAbs')
 class PathSegMovetoAbs extends PathSeg {
   PathSegMovetoAbs.internal() : super.internal();
 
-
-  /** @domName SVGPathSegMovetoAbs.x */
+  @DocsEditable
+  @DomName('SVGPathSegMovetoAbs.x')
   num get x native "SVGPathSegMovetoAbs_x_Getter";
 
-
-  /** @domName SVGPathSegMovetoAbs.x */
+  @DocsEditable
+  @DomName('SVGPathSegMovetoAbs.x')
   void set x(num value) native "SVGPathSegMovetoAbs_x_Setter";
 
-
-  /** @domName SVGPathSegMovetoAbs.y */
+  @DocsEditable
+  @DomName('SVGPathSegMovetoAbs.y')
   num get y native "SVGPathSegMovetoAbs_y_Getter";
 
-
-  /** @domName SVGPathSegMovetoAbs.y */
+  @DocsEditable
+  @DomName('SVGPathSegMovetoAbs.y')
   void set y(num value) native "SVGPathSegMovetoAbs_y_Setter";
 
 }
@@ -5767,24 +5938,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPathSegMovetoRel
+@DocsEditable
+@DomName('SVGPathSegMovetoRel')
 class PathSegMovetoRel extends PathSeg {
   PathSegMovetoRel.internal() : super.internal();
 
-
-  /** @domName SVGPathSegMovetoRel.x */
+  @DocsEditable
+  @DomName('SVGPathSegMovetoRel.x')
   num get x native "SVGPathSegMovetoRel_x_Getter";
 
-
-  /** @domName SVGPathSegMovetoRel.x */
+  @DocsEditable
+  @DomName('SVGPathSegMovetoRel.x')
   void set x(num value) native "SVGPathSegMovetoRel_x_Setter";
 
-
-  /** @domName SVGPathSegMovetoRel.y */
+  @DocsEditable
+  @DomName('SVGPathSegMovetoRel.y')
   num get y native "SVGPathSegMovetoRel_y_Getter";
 
-
-  /** @domName SVGPathSegMovetoRel.y */
+  @DocsEditable
+  @DomName('SVGPathSegMovetoRel.y')
   void set y(num value) native "SVGPathSegMovetoRel_y_Setter";
 
 }
@@ -5795,99 +5967,100 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPatternElement
+@DocsEditable
+@DomName('SVGPatternElement')
 class PatternElement extends SvgElement implements FitToViewBox, Tests, UriReference, Stylable, ExternalResourcesRequired, LangSpace {
   PatternElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory PatternElement() => _SvgElementFactoryProvider.createSvgElement_tag("pattern");
 
-
-  /** @domName SVGPatternElement.height */
+  @DocsEditable
+  @DomName('SVGPatternElement.height')
   AnimatedLength get height native "SVGPatternElement_height_Getter";
 
-
-  /** @domName SVGPatternElement.patternContentUnits */
+  @DocsEditable
+  @DomName('SVGPatternElement.patternContentUnits')
   AnimatedEnumeration get patternContentUnits native "SVGPatternElement_patternContentUnits_Getter";
 
-
-  /** @domName SVGPatternElement.patternTransform */
+  @DocsEditable
+  @DomName('SVGPatternElement.patternTransform')
   AnimatedTransformList get patternTransform native "SVGPatternElement_patternTransform_Getter";
 
-
-  /** @domName SVGPatternElement.patternUnits */
+  @DocsEditable
+  @DomName('SVGPatternElement.patternUnits')
   AnimatedEnumeration get patternUnits native "SVGPatternElement_patternUnits_Getter";
 
-
-  /** @domName SVGPatternElement.width */
+  @DocsEditable
+  @DomName('SVGPatternElement.width')
   AnimatedLength get width native "SVGPatternElement_width_Getter";
 
-
-  /** @domName SVGPatternElement.x */
+  @DocsEditable
+  @DomName('SVGPatternElement.x')
   AnimatedLength get x native "SVGPatternElement_x_Getter";
 
-
-  /** @domName SVGPatternElement.y */
+  @DocsEditable
+  @DomName('SVGPatternElement.y')
   AnimatedLength get y native "SVGPatternElement_y_Getter";
 
-
-  /** @domName SVGPatternElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGPatternElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGPatternElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGPatternElement.preserveAspectRatio */
+  @DocsEditable
+  @DomName('SVGPatternElement.preserveAspectRatio')
   AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGPatternElement_preserveAspectRatio_Getter";
 
-
-  /** @domName SVGPatternElement.viewBox */
+  @DocsEditable
+  @DomName('SVGPatternElement.viewBox')
   AnimatedRect get viewBox native "SVGPatternElement_viewBox_Getter";
 
-
-  /** @domName SVGPatternElement.xmllang */
+  @DocsEditable
+  @DomName('SVGPatternElement.xmllang')
   String get xmllang native "SVGPatternElement_xmllang_Getter";
 
-
-  /** @domName SVGPatternElement.xmllang */
+  @DocsEditable
+  @DomName('SVGPatternElement.xmllang')
   void set xmllang(String value) native "SVGPatternElement_xmllang_Setter";
 
-
-  /** @domName SVGPatternElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGPatternElement.xmlspace')
   String get xmlspace native "SVGPatternElement_xmlspace_Getter";
 
-
-  /** @domName SVGPatternElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGPatternElement.xmlspace')
   void set xmlspace(String value) native "SVGPatternElement_xmlspace_Setter";
 
-
-  /** @domName SVGPatternElement.className */
+  @DocsEditable
+  @DomName('SVGPatternElement.className')
   AnimatedString get $dom_svgClassName native "SVGPatternElement_className_Getter";
 
-
-  /** @domName SVGPatternElement.style */
+  @DocsEditable
+  @DomName('SVGPatternElement.style')
   CssStyleDeclaration get style native "SVGPatternElement_style_Getter";
 
-
-  /** @domName SVGPatternElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGPatternElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGPatternElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGPatternElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGPatternElement.requiredExtensions')
   StringList get requiredExtensions native "SVGPatternElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGPatternElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGPatternElement.requiredFeatures')
   StringList get requiredFeatures native "SVGPatternElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGPatternElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGPatternElement.systemLanguage')
   StringList get systemLanguage native "SVGPatternElement_systemLanguage_Getter";
 
-
-  /** @domName SVGPatternElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGPatternElement.hasExtension')
   bool hasExtension(String extension) native "SVGPatternElement_hasExtension_Callback";
 
-
-  /** @domName SVGPatternElement.href */
+  @DocsEditable
+  @DomName('SVGPatternElement.href')
   AnimatedString get href native "SVGPatternElement_href_Getter";
 
 }
@@ -5898,28 +6071,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPoint
+@DocsEditable
+@DomName('SVGPoint')
 class Point extends NativeFieldWrapperClass1 {
   Point.internal();
 
-
-  /** @domName SVGPoint.x */
+  @DocsEditable
+  @DomName('SVGPoint.x')
   num get x native "SVGPoint_x_Getter";
 
-
-  /** @domName SVGPoint.x */
+  @DocsEditable
+  @DomName('SVGPoint.x')
   void set x(num value) native "SVGPoint_x_Setter";
 
-
-  /** @domName SVGPoint.y */
+  @DocsEditable
+  @DomName('SVGPoint.y')
   num get y native "SVGPoint_y_Getter";
 
-
-  /** @domName SVGPoint.y */
+  @DocsEditable
+  @DomName('SVGPoint.y')
   void set y(num value) native "SVGPoint_y_Setter";
 
-
-  /** @domName SVGPoint.matrixTransform */
+  @DocsEditable
+  @DomName('SVGPoint.matrixTransform')
   Point matrixTransform(Matrix matrix) native "SVGPoint_matrixTransform_Callback";
 
 }
@@ -5930,40 +6104,41 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPointList
+@DocsEditable
+@DomName('SVGPointList')
 class PointList extends NativeFieldWrapperClass1 {
   PointList.internal();
 
-
-  /** @domName SVGPointList.numberOfItems */
+  @DocsEditable
+  @DomName('SVGPointList.numberOfItems')
   int get numberOfItems native "SVGPointList_numberOfItems_Getter";
 
-
-  /** @domName SVGPointList.appendItem */
+  @DocsEditable
+  @DomName('SVGPointList.appendItem')
   Point appendItem(Point item) native "SVGPointList_appendItem_Callback";
 
-
-  /** @domName SVGPointList.clear */
+  @DocsEditable
+  @DomName('SVGPointList.clear')
   void clear() native "SVGPointList_clear_Callback";
 
-
-  /** @domName SVGPointList.getItem */
+  @DocsEditable
+  @DomName('SVGPointList.getItem')
   Point getItem(int index) native "SVGPointList_getItem_Callback";
 
-
-  /** @domName SVGPointList.initialize */
+  @DocsEditable
+  @DomName('SVGPointList.initialize')
   Point initialize(Point item) native "SVGPointList_initialize_Callback";
 
-
-  /** @domName SVGPointList.insertItemBefore */
+  @DocsEditable
+  @DomName('SVGPointList.insertItemBefore')
   Point insertItemBefore(Point item, int index) native "SVGPointList_insertItemBefore_Callback";
 
-
-  /** @domName SVGPointList.removeItem */
+  @DocsEditable
+  @DomName('SVGPointList.removeItem')
   Point removeItem(int index) native "SVGPointList_removeItem_Callback";
 
-
-  /** @domName SVGPointList.replaceItem */
+  @DocsEditable
+  @DomName('SVGPointList.replaceItem')
   Point replaceItem(Point item, int index) native "SVGPointList_replaceItem_Callback";
 
 }
@@ -5974,95 +6149,96 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPolygonElement
+@DocsEditable
+@DomName('SVGPolygonElement')
 class PolygonElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
   PolygonElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory PolygonElement() => _SvgElementFactoryProvider.createSvgElement_tag("polygon");
 
-
-  /** @domName SVGPolygonElement.animatedPoints */
+  @DocsEditable
+  @DomName('SVGPolygonElement.animatedPoints')
   PointList get animatedPoints native "SVGPolygonElement_animatedPoints_Getter";
 
-
-  /** @domName SVGPolygonElement.points */
+  @DocsEditable
+  @DomName('SVGPolygonElement.points')
   PointList get points native "SVGPolygonElement_points_Getter";
 
-
-  /** @domName SVGPolygonElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGPolygonElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGPolygonElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGPolygonElement.xmllang */
+  @DocsEditable
+  @DomName('SVGPolygonElement.xmllang')
   String get xmllang native "SVGPolygonElement_xmllang_Getter";
 
-
-  /** @domName SVGPolygonElement.xmllang */
+  @DocsEditable
+  @DomName('SVGPolygonElement.xmllang')
   void set xmllang(String value) native "SVGPolygonElement_xmllang_Setter";
 
-
-  /** @domName SVGPolygonElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGPolygonElement.xmlspace')
   String get xmlspace native "SVGPolygonElement_xmlspace_Getter";
 
-
-  /** @domName SVGPolygonElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGPolygonElement.xmlspace')
   void set xmlspace(String value) native "SVGPolygonElement_xmlspace_Setter";
 
-
-  /** @domName SVGPolygonElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGPolygonElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGPolygonElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGPolygonElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGPolygonElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGPolygonElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGPolygonElement.getBBox */
+  @DocsEditable
+  @DomName('SVGPolygonElement.getBBox')
   Rect getBBox() native "SVGPolygonElement_getBBox_Callback";
 
-
-  /** @domName SVGPolygonElement.getCTM */
+  @DocsEditable
+  @DomName('SVGPolygonElement.getCTM')
   Matrix getCtm() native "SVGPolygonElement_getCTM_Callback";
 
-
-  /** @domName SVGPolygonElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGPolygonElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGPolygonElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGPolygonElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGPolygonElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGPolygonElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGPolygonElement.className */
+  @DocsEditable
+  @DomName('SVGPolygonElement.className')
   AnimatedString get $dom_svgClassName native "SVGPolygonElement_className_Getter";
 
-
-  /** @domName SVGPolygonElement.style */
+  @DocsEditable
+  @DomName('SVGPolygonElement.style')
   CssStyleDeclaration get style native "SVGPolygonElement_style_Getter";
 
-
-  /** @domName SVGPolygonElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGPolygonElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGPolygonElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGPolygonElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGPolygonElement.requiredExtensions')
   StringList get requiredExtensions native "SVGPolygonElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGPolygonElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGPolygonElement.requiredFeatures')
   StringList get requiredFeatures native "SVGPolygonElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGPolygonElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGPolygonElement.systemLanguage')
   StringList get systemLanguage native "SVGPolygonElement_systemLanguage_Getter";
 
-
-  /** @domName SVGPolygonElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGPolygonElement.hasExtension')
   bool hasExtension(String extension) native "SVGPolygonElement_hasExtension_Callback";
 
-
-  /** @domName SVGPolygonElement.transform */
+  @DocsEditable
+  @DomName('SVGPolygonElement.transform')
   AnimatedTransformList get transform native "SVGPolygonElement_transform_Getter";
 
 }
@@ -6073,95 +6249,96 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPolylineElement
+@DocsEditable
+@DomName('SVGPolylineElement')
 class PolylineElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
   PolylineElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory PolylineElement() => _SvgElementFactoryProvider.createSvgElement_tag("polyline");
 
-
-  /** @domName SVGPolylineElement.animatedPoints */
+  @DocsEditable
+  @DomName('SVGPolylineElement.animatedPoints')
   PointList get animatedPoints native "SVGPolylineElement_animatedPoints_Getter";
 
-
-  /** @domName SVGPolylineElement.points */
+  @DocsEditable
+  @DomName('SVGPolylineElement.points')
   PointList get points native "SVGPolylineElement_points_Getter";
 
-
-  /** @domName SVGPolylineElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGPolylineElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGPolylineElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGPolylineElement.xmllang */
+  @DocsEditable
+  @DomName('SVGPolylineElement.xmllang')
   String get xmllang native "SVGPolylineElement_xmllang_Getter";
 
-
-  /** @domName SVGPolylineElement.xmllang */
+  @DocsEditable
+  @DomName('SVGPolylineElement.xmllang')
   void set xmllang(String value) native "SVGPolylineElement_xmllang_Setter";
 
-
-  /** @domName SVGPolylineElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGPolylineElement.xmlspace')
   String get xmlspace native "SVGPolylineElement_xmlspace_Getter";
 
-
-  /** @domName SVGPolylineElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGPolylineElement.xmlspace')
   void set xmlspace(String value) native "SVGPolylineElement_xmlspace_Setter";
 
-
-  /** @domName SVGPolylineElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGPolylineElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGPolylineElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGPolylineElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGPolylineElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGPolylineElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGPolylineElement.getBBox */
+  @DocsEditable
+  @DomName('SVGPolylineElement.getBBox')
   Rect getBBox() native "SVGPolylineElement_getBBox_Callback";
 
-
-  /** @domName SVGPolylineElement.getCTM */
+  @DocsEditable
+  @DomName('SVGPolylineElement.getCTM')
   Matrix getCtm() native "SVGPolylineElement_getCTM_Callback";
 
-
-  /** @domName SVGPolylineElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGPolylineElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGPolylineElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGPolylineElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGPolylineElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGPolylineElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGPolylineElement.className */
+  @DocsEditable
+  @DomName('SVGPolylineElement.className')
   AnimatedString get $dom_svgClassName native "SVGPolylineElement_className_Getter";
 
-
-  /** @domName SVGPolylineElement.style */
+  @DocsEditable
+  @DomName('SVGPolylineElement.style')
   CssStyleDeclaration get style native "SVGPolylineElement_style_Getter";
 
-
-  /** @domName SVGPolylineElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGPolylineElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGPolylineElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGPolylineElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGPolylineElement.requiredExtensions')
   StringList get requiredExtensions native "SVGPolylineElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGPolylineElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGPolylineElement.requiredFeatures')
   StringList get requiredFeatures native "SVGPolylineElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGPolylineElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGPolylineElement.systemLanguage')
   StringList get systemLanguage native "SVGPolylineElement_systemLanguage_Getter";
 
-
-  /** @domName SVGPolylineElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGPolylineElement.hasExtension')
   bool hasExtension(String extension) native "SVGPolylineElement_hasExtension_Callback";
 
-
-  /** @domName SVGPolylineElement.transform */
+  @DocsEditable
+  @DomName('SVGPolylineElement.transform')
   AnimatedTransformList get transform native "SVGPolylineElement_transform_Getter";
 
 }
@@ -6172,7 +6349,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPreserveAspectRatio
+@DocsEditable
+@DomName('SVGPreserveAspectRatio')
 class PreserveAspectRatio extends NativeFieldWrapperClass1 {
   PreserveAspectRatio.internal();
 
@@ -6204,20 +6382,20 @@
 
   static const int SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
 
-
-  /** @domName SVGPreserveAspectRatio.align */
+  @DocsEditable
+  @DomName('SVGPreserveAspectRatio.align')
   int get align native "SVGPreserveAspectRatio_align_Getter";
 
-
-  /** @domName SVGPreserveAspectRatio.align */
+  @DocsEditable
+  @DomName('SVGPreserveAspectRatio.align')
   void set align(int value) native "SVGPreserveAspectRatio_align_Setter";
 
-
-  /** @domName SVGPreserveAspectRatio.meetOrSlice */
+  @DocsEditable
+  @DomName('SVGPreserveAspectRatio.meetOrSlice')
   int get meetOrSlice native "SVGPreserveAspectRatio_meetOrSlice_Getter";
 
-
-  /** @domName SVGPreserveAspectRatio.meetOrSlice */
+  @DocsEditable
+  @DomName('SVGPreserveAspectRatio.meetOrSlice')
   void set meetOrSlice(int value) native "SVGPreserveAspectRatio_meetOrSlice_Setter";
 
 }
@@ -6228,35 +6406,36 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGRadialGradientElement
+@DocsEditable
+@DomName('SVGRadialGradientElement')
 class RadialGradientElement extends GradientElement {
   RadialGradientElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory RadialGradientElement() => _SvgElementFactoryProvider.createSvgElement_tag("radialGradient");
 
-
-  /** @domName SVGRadialGradientElement.cx */
+  @DocsEditable
+  @DomName('SVGRadialGradientElement.cx')
   AnimatedLength get cx native "SVGRadialGradientElement_cx_Getter";
 
-
-  /** @domName SVGRadialGradientElement.cy */
+  @DocsEditable
+  @DomName('SVGRadialGradientElement.cy')
   AnimatedLength get cy native "SVGRadialGradientElement_cy_Getter";
 
-
-  /** @domName SVGRadialGradientElement.fr */
+  @DocsEditable
+  @DomName('SVGRadialGradientElement.fr')
   AnimatedLength get fr native "SVGRadialGradientElement_fr_Getter";
 
-
-  /** @domName SVGRadialGradientElement.fx */
+  @DocsEditable
+  @DomName('SVGRadialGradientElement.fx')
   AnimatedLength get fx native "SVGRadialGradientElement_fx_Getter";
 
-
-  /** @domName SVGRadialGradientElement.fy */
+  @DocsEditable
+  @DomName('SVGRadialGradientElement.fy')
   AnimatedLength get fy native "SVGRadialGradientElement_fy_Getter";
 
-
-  /** @domName SVGRadialGradientElement.r */
+  @DocsEditable
+  @DomName('SVGRadialGradientElement.r')
   AnimatedLength get r native "SVGRadialGradientElement_r_Getter";
 
 }
@@ -6267,40 +6446,41 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGRect
+@DocsEditable
+@DomName('SVGRect')
 class Rect extends NativeFieldWrapperClass1 {
   Rect.internal();
 
-
-  /** @domName SVGRect.height */
+  @DocsEditable
+  @DomName('SVGRect.height')
   num get height native "SVGRect_height_Getter";
 
-
-  /** @domName SVGRect.height */
+  @DocsEditable
+  @DomName('SVGRect.height')
   void set height(num value) native "SVGRect_height_Setter";
 
-
-  /** @domName SVGRect.width */
+  @DocsEditable
+  @DomName('SVGRect.width')
   num get width native "SVGRect_width_Getter";
 
-
-  /** @domName SVGRect.width */
+  @DocsEditable
+  @DomName('SVGRect.width')
   void set width(num value) native "SVGRect_width_Setter";
 
-
-  /** @domName SVGRect.x */
+  @DocsEditable
+  @DomName('SVGRect.x')
   num get x native "SVGRect_x_Getter";
 
-
-  /** @domName SVGRect.x */
+  @DocsEditable
+  @DomName('SVGRect.x')
   void set x(num value) native "SVGRect_x_Setter";
 
-
-  /** @domName SVGRect.y */
+  @DocsEditable
+  @DomName('SVGRect.y')
   num get y native "SVGRect_y_Getter";
 
-
-  /** @domName SVGRect.y */
+  @DocsEditable
+  @DomName('SVGRect.y')
   void set y(num value) native "SVGRect_y_Setter";
 
 }
@@ -6311,111 +6491,112 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGRectElement
+@DocsEditable
+@DomName('SVGRectElement')
 class RectElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
   RectElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory RectElement() => _SvgElementFactoryProvider.createSvgElement_tag("rect");
 
-
-  /** @domName SVGRectElement.height */
+  @DocsEditable
+  @DomName('SVGRectElement.height')
   AnimatedLength get height native "SVGRectElement_height_Getter";
 
-
-  /** @domName SVGRectElement.rx */
+  @DocsEditable
+  @DomName('SVGRectElement.rx')
   AnimatedLength get rx native "SVGRectElement_rx_Getter";
 
-
-  /** @domName SVGRectElement.ry */
+  @DocsEditable
+  @DomName('SVGRectElement.ry')
   AnimatedLength get ry native "SVGRectElement_ry_Getter";
 
-
-  /** @domName SVGRectElement.width */
+  @DocsEditable
+  @DomName('SVGRectElement.width')
   AnimatedLength get width native "SVGRectElement_width_Getter";
 
-
-  /** @domName SVGRectElement.x */
+  @DocsEditable
+  @DomName('SVGRectElement.x')
   AnimatedLength get x native "SVGRectElement_x_Getter";
 
-
-  /** @domName SVGRectElement.y */
+  @DocsEditable
+  @DomName('SVGRectElement.y')
   AnimatedLength get y native "SVGRectElement_y_Getter";
 
-
-  /** @domName SVGRectElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGRectElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGRectElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGRectElement.xmllang */
+  @DocsEditable
+  @DomName('SVGRectElement.xmllang')
   String get xmllang native "SVGRectElement_xmllang_Getter";
 
-
-  /** @domName SVGRectElement.xmllang */
+  @DocsEditable
+  @DomName('SVGRectElement.xmllang')
   void set xmllang(String value) native "SVGRectElement_xmllang_Setter";
 
-
-  /** @domName SVGRectElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGRectElement.xmlspace')
   String get xmlspace native "SVGRectElement_xmlspace_Getter";
 
-
-  /** @domName SVGRectElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGRectElement.xmlspace')
   void set xmlspace(String value) native "SVGRectElement_xmlspace_Setter";
 
-
-  /** @domName SVGRectElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGRectElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGRectElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGRectElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGRectElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGRectElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGRectElement.getBBox */
+  @DocsEditable
+  @DomName('SVGRectElement.getBBox')
   Rect getBBox() native "SVGRectElement_getBBox_Callback";
 
-
-  /** @domName SVGRectElement.getCTM */
+  @DocsEditable
+  @DomName('SVGRectElement.getCTM')
   Matrix getCtm() native "SVGRectElement_getCTM_Callback";
 
-
-  /** @domName SVGRectElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGRectElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGRectElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGRectElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGRectElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGRectElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGRectElement.className */
+  @DocsEditable
+  @DomName('SVGRectElement.className')
   AnimatedString get $dom_svgClassName native "SVGRectElement_className_Getter";
 
-
-  /** @domName SVGRectElement.style */
+  @DocsEditable
+  @DomName('SVGRectElement.style')
   CssStyleDeclaration get style native "SVGRectElement_style_Getter";
 
-
-  /** @domName SVGRectElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGRectElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGRectElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGRectElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGRectElement.requiredExtensions')
   StringList get requiredExtensions native "SVGRectElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGRectElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGRectElement.requiredFeatures')
   StringList get requiredFeatures native "SVGRectElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGRectElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGRectElement.systemLanguage')
   StringList get systemLanguage native "SVGRectElement_systemLanguage_Getter";
 
-
-  /** @domName SVGRectElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGRectElement.hasExtension')
   bool hasExtension(String extension) native "SVGRectElement_hasExtension_Callback";
 
-
-  /** @domName SVGRectElement.transform */
+  @DocsEditable
+  @DomName('SVGRectElement.transform')
   AnimatedTransformList get transform native "SVGRectElement_transform_Getter";
 
 }
@@ -6426,7 +6607,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGRenderingIntent
+@DocsEditable
+@DomName('SVGRenderingIntent')
 class RenderingIntent extends NativeFieldWrapperClass1 {
   RenderingIntent.internal();
 
@@ -6450,27 +6632,28 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGScriptElement
+@DocsEditable
+@DomName('SVGScriptElement')
 class ScriptElement extends SvgElement implements UriReference, ExternalResourcesRequired {
   ScriptElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory ScriptElement() => _SvgElementFactoryProvider.createSvgElement_tag("script");
 
-
-  /** @domName SVGScriptElement.type */
+  @DocsEditable
+  @DomName('SVGScriptElement.type')
   String get type native "SVGScriptElement_type_Getter";
 
-
-  /** @domName SVGScriptElement.type */
+  @DocsEditable
+  @DomName('SVGScriptElement.type')
   void set type(String value) native "SVGScriptElement_type_Setter";
 
-
-  /** @domName SVGScriptElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGScriptElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGScriptElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGScriptElement.href */
+  @DocsEditable
+  @DomName('SVGScriptElement.href')
   AnimatedString get href native "SVGScriptElement_href_Getter";
 
 }
@@ -6481,11 +6664,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGSetElement
+@DocsEditable
+@DomName('SVGSetElement')
 class SetElement extends AnimationElement {
   SetElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory SetElement() => _SvgElementFactoryProvider.createSvgElement_tag("set");
 
 }
@@ -6496,27 +6680,28 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGStopElement
+@DocsEditable
+@DomName('SVGStopElement')
 class StopElement extends SvgElement implements Stylable {
   StopElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory StopElement() => _SvgElementFactoryProvider.createSvgElement_tag("stop");
 
-
-  /** @domName SVGStopElement.offset */
+  @DocsEditable
+  @DomName('SVGStopElement.offset')
   AnimatedNumber get offset native "SVGStopElement_offset_Getter";
 
-
-  /** @domName SVGStopElement.className */
+  @DocsEditable
+  @DomName('SVGStopElement.className')
   AnimatedString get $dom_svgClassName native "SVGStopElement_className_Getter";
 
-
-  /** @domName SVGStopElement.style */
+  @DocsEditable
+  @DomName('SVGStopElement.style')
   CssStyleDeclaration get style native "SVGStopElement_style_Getter";
 
-
-  /** @domName SVGStopElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGStopElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGStopElement_getPresentationAttribute_Callback";
 
 }
@@ -6527,12 +6712,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGStringList
+@DocsEditable
+@DomName('SVGStringList')
 class StringList extends NativeFieldWrapperClass1 implements List<String> {
   StringList.internal();
 
-
-  /** @domName SVGStringList.numberOfItems */
+  @DocsEditable
+  @DomName('SVGStringList.numberOfItems')
   int get numberOfItems native "SVGStringList_numberOfItems_Getter";
 
   String operator[](int index) native "SVGStringList_item_Callback";
@@ -6555,50 +6741,50 @@
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, String)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(String element) => Collections.contains(this, element);
+  bool contains(String element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(String element)) => Collections.forEach(this, f);
+  void forEach(void f(String element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(String element)) => new MappedList<String, dynamic>(this, f);
+  List mappedBy(f(String element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<String> where(bool f(String element)) => new WhereIterable<String>(this, f);
+  Iterable<String> where(bool f(String element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(String element)) => Collections.every(this, f);
+  bool every(bool f(String element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(String element)) => Collections.any(this, f);
+  bool any(bool f(String element)) => IterableMixinWorkaround.any(this, f);
 
   List<String> toList() => new List<String>.from(this);
   Set<String> toSet() => new Set<String>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<String> take(int n) => new ListView<String>(this, 0, n);
+  List<String> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<String> takeWhile(bool test(String value)) {
-    return new TakeWhileIterable<String>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<String> skip(int n) => new ListView<String>(this, n, null);
+  List<String> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<String> skipWhile(bool test(String value)) {
-    return new SkipWhileIterable<String>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   String firstMatching(bool test(String value), { String orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   String lastMatching(bool test(String value), {String orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   String singleMatching(bool test(String value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   String elementAt(int index) {
@@ -6624,7 +6810,7 @@
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
-  // contains() defined by IDL.
+  // clear() defined by IDL.
 
   void sort([int compare(String a, String b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
@@ -6654,16 +6840,36 @@
     throw new StateError("More than one element");
   }
 
-  String min([int compare(String a, String b)]) => Collections.min(this, compare);
+  String min([int compare(String a, String b)]) => IterableMixinWorkaround.min(this, compare);
 
-  String max([int compare(String a, String b)]) => Collections.max(this, compare);
+  String max([int compare(String a, String b)]) => IterableMixinWorkaround.max(this, compare);
 
   String removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   String removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(String element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(String element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<String> from, [int startFrom]) {
@@ -6683,32 +6889,32 @@
 
   // -- end List<String> mixins.
 
-
-  /** @domName SVGStringList.appendItem */
+  @DocsEditable
+  @DomName('SVGStringList.appendItem')
   String appendItem(String item) native "SVGStringList_appendItem_Callback";
 
-
-  /** @domName SVGStringList.clear */
+  @DocsEditable
+  @DomName('SVGStringList.clear')
   void clear() native "SVGStringList_clear_Callback";
 
-
-  /** @domName SVGStringList.getItem */
+  @DocsEditable
+  @DomName('SVGStringList.getItem')
   String getItem(int index) native "SVGStringList_getItem_Callback";
 
-
-  /** @domName SVGStringList.initialize */
+  @DocsEditable
+  @DomName('SVGStringList.initialize')
   String initialize(String item) native "SVGStringList_initialize_Callback";
 
-
-  /** @domName SVGStringList.insertItemBefore */
+  @DocsEditable
+  @DomName('SVGStringList.insertItemBefore')
   String insertItemBefore(String item, int index) native "SVGStringList_insertItemBefore_Callback";
 
-
-  /** @domName SVGStringList.removeItem */
+  @DocsEditable
+  @DomName('SVGStringList.removeItem')
   String removeItem(int index) native "SVGStringList_removeItem_Callback";
 
-
-  /** @domName SVGStringList.replaceItem */
+  @DocsEditable
+  @DomName('SVGStringList.replaceItem')
   String replaceItem(String item, int index) native "SVGStringList_replaceItem_Callback";
 
 }
@@ -6719,20 +6925,21 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGStylable
+@DocsEditable
+@DomName('SVGStylable')
 class Stylable extends NativeFieldWrapperClass1 {
   Stylable.internal();
 
-
-  /** @domName SVGStylable.className */
+  @DocsEditable
+  @DomName('SVGStylable.className')
   AnimatedString get $dom_svgClassName native "SVGStylable_className_Getter";
 
-
-  /** @domName SVGStylable.style */
+  @DocsEditable
+  @DomName('SVGStylable.style')
   CssStyleDeclaration get style native "SVGStylable_style_Getter";
 
-
-  /** @domName SVGStylable.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGStylable.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGStylable_getPresentationAttribute_Callback";
 
 }
@@ -6743,59 +6950,60 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGStyleElement
+@DocsEditable
+@DomName('SVGStyleElement')
 class StyleElement extends SvgElement implements LangSpace {
   StyleElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory StyleElement() => _SvgElementFactoryProvider.createSvgElement_tag("style");
 
-
-  /** @domName SVGStyleElement.disabled */
+  @DocsEditable
+  @DomName('SVGStyleElement.disabled')
   bool get disabled native "SVGStyleElement_disabled_Getter";
 
-
-  /** @domName SVGStyleElement.disabled */
+  @DocsEditable
+  @DomName('SVGStyleElement.disabled')
   void set disabled(bool value) native "SVGStyleElement_disabled_Setter";
 
-
-  /** @domName SVGStyleElement.media */
+  @DocsEditable
+  @DomName('SVGStyleElement.media')
   String get media native "SVGStyleElement_media_Getter";
 
-
-  /** @domName SVGStyleElement.media */
+  @DocsEditable
+  @DomName('SVGStyleElement.media')
   void set media(String value) native "SVGStyleElement_media_Setter";
 
-
-  /** @domName SVGStyleElement.title */
+  @DocsEditable
+  @DomName('SVGStyleElement.title')
   String get title native "SVGStyleElement_title_Getter";
 
-
-  /** @domName SVGStyleElement.title */
+  @DocsEditable
+  @DomName('SVGStyleElement.title')
   void set title(String value) native "SVGStyleElement_title_Setter";
 
-
-  /** @domName SVGStyleElement.type */
+  @DocsEditable
+  @DomName('SVGStyleElement.type')
   String get type native "SVGStyleElement_type_Getter";
 
-
-  /** @domName SVGStyleElement.type */
+  @DocsEditable
+  @DomName('SVGStyleElement.type')
   void set type(String value) native "SVGStyleElement_type_Setter";
 
-
-  /** @domName SVGStyleElement.xmllang */
+  @DocsEditable
+  @DomName('SVGStyleElement.xmllang')
   String get xmllang native "SVGStyleElement_xmllang_Getter";
 
-
-  /** @domName SVGStyleElement.xmllang */
+  @DocsEditable
+  @DomName('SVGStyleElement.xmllang')
   void set xmllang(String value) native "SVGStyleElement_xmllang_Setter";
 
-
-  /** @domName SVGStyleElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGStyleElement.xmlspace')
   String get xmlspace native "SVGStyleElement_xmlspace_Getter";
 
-
-  /** @domName SVGStyleElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGStyleElement.xmlspace')
   void set xmlspace(String value) native "SVGStyleElement_xmlspace_Setter";
 
 }
@@ -6806,16 +7014,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGDocument
+@DocsEditable
+@DomName('SVGDocument')
 class SvgDocument extends Document {
   SvgDocument.internal() : super.internal();
 
-
-  /** @domName SVGDocument.rootElement */
+  @DocsEditable
+  @DomName('SVGDocument.rootElement')
   SvgSvgElement get rootElement native "SVGDocument_rootElement_Getter";
 
-
-  /** @domName SVGDocument.createEvent */
+  @DocsEditable
+  @DomName('SVGDocument.createEvent')
   Event $dom_createEvent(String eventType) native "SVGDocument_createEvent_Callback";
 
 }
@@ -6851,7 +7060,8 @@
   }
 }
 
-/// @domName SVGElement
+@DocsEditable
+@DomName('SVGElement')
 class SvgElement extends Element {
   factory SvgElement.tag(String tag) =>
       _SvgElementFactoryProvider.createSvgElement_tag(tag);
@@ -6908,17 +7118,17 @@
 
   // Unsupported methods inherited from Element.
 
-  /** @domName Element.insertAdjacentText */
+  @DomName('Element.insertAdjacentText')
   void insertAdjacentText(String where, String text) {
     throw new UnsupportedError("Cannot invoke insertAdjacentText on SVG.");
   }
 
-  /** @domName Element.insertAdjacentHTML */
+  @DomName('Element.insertAdjacentHTML')
   void insertAdjacentHtml(String where, String text) {
     throw new UnsupportedError("Cannot invoke insertAdjacentHtml on SVG.");
   }
 
-  /** @domName Element.insertAdjacentHTML */
+  @DomName('Element.insertAdjacentHTML')
   Element insertAdjacentElement(String where, Element element) {
     throw new UnsupportedError("Cannot invoke insertAdjacentElement on SVG.");
   }
@@ -6934,28 +7144,28 @@
 
   SvgElement.internal() : super.internal();
 
-
-  /** @domName SVGElement.id */
+  @DocsEditable
+  @DomName('SVGElement.id')
   String get id native "SVGElement_id_Getter";
 
-
-  /** @domName SVGElement.id */
+  @DocsEditable
+  @DomName('SVGElement.id')
   void set id(String value) native "SVGElement_id_Setter";
 
-
-  /** @domName SVGElement.ownerSVGElement */
+  @DocsEditable
+  @DomName('SVGElement.ownerSVGElement')
   SvgSvgElement get ownerSvgElement native "SVGElement_ownerSVGElement_Getter";
 
-
-  /** @domName SVGElement.viewportElement */
+  @DocsEditable
+  @DomName('SVGElement.viewportElement')
   SvgElement get viewportElement native "SVGElement_viewportElement_Getter";
 
-
-  /** @domName SVGElement.xmlbase */
+  @DocsEditable
+  @DomName('SVGElement.xmlbase')
   String get xmlbase native "SVGElement_xmlbase_Getter";
 
-
-  /** @domName SVGElement.xmlbase */
+  @DocsEditable
+  @DomName('SVGElement.xmlbase')
   void set xmlbase(String value) native "SVGElement_xmlbase_Setter";
 
 }
@@ -6966,7 +7176,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGException
+@DocsEditable
+@DomName('SVGException')
 class SvgException extends NativeFieldWrapperClass1 {
   SvgException.internal();
 
@@ -6976,20 +7187,20 @@
 
   static const int SVG_WRONG_TYPE_ERR = 0;
 
-
-  /** @domName SVGException.code */
+  @DocsEditable
+  @DomName('SVGException.code')
   int get code native "SVGException_code_Getter";
 
-
-  /** @domName SVGException.message */
+  @DocsEditable
+  @DomName('SVGException.message')
   String get message native "SVGException_message_Getter";
 
-
-  /** @domName SVGException.name */
+  @DocsEditable
+  @DomName('SVGException.name')
   String get name native "SVGException_name_Getter";
 
-
-  /** @domName SVGException.toString */
+  @DocsEditable
+  @DomName('SVGException.toString')
   String toString() native "SVGException_toString_Callback";
 
 }
@@ -6998,262 +7209,263 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGSVGElement
+@DocsEditable
+@DomName('SVGSVGElement')
 class SvgSvgElement extends SvgElement implements FitToViewBox, Tests, Stylable, Locatable, ExternalResourcesRequired, ZoomAndPan, LangSpace {
   factory SvgSvgElement() => _SvgSvgElementFactoryProvider.createSvgSvgElement();
 
   SvgSvgElement.internal() : super.internal();
 
-
-  /** @domName SVGSVGElement.contentScriptType */
+  @DocsEditable
+  @DomName('SVGSVGElement.contentScriptType')
   String get contentScriptType native "SVGSVGElement_contentScriptType_Getter";
 
-
-  /** @domName SVGSVGElement.contentScriptType */
+  @DocsEditable
+  @DomName('SVGSVGElement.contentScriptType')
   void set contentScriptType(String value) native "SVGSVGElement_contentScriptType_Setter";
 
-
-  /** @domName SVGSVGElement.contentStyleType */
+  @DocsEditable
+  @DomName('SVGSVGElement.contentStyleType')
   String get contentStyleType native "SVGSVGElement_contentStyleType_Getter";
 
-
-  /** @domName SVGSVGElement.contentStyleType */
+  @DocsEditable
+  @DomName('SVGSVGElement.contentStyleType')
   void set contentStyleType(String value) native "SVGSVGElement_contentStyleType_Setter";
 
-
-  /** @domName SVGSVGElement.currentScale */
+  @DocsEditable
+  @DomName('SVGSVGElement.currentScale')
   num get currentScale native "SVGSVGElement_currentScale_Getter";
 
-
-  /** @domName SVGSVGElement.currentScale */
+  @DocsEditable
+  @DomName('SVGSVGElement.currentScale')
   void set currentScale(num value) native "SVGSVGElement_currentScale_Setter";
 
-
-  /** @domName SVGSVGElement.currentTranslate */
+  @DocsEditable
+  @DomName('SVGSVGElement.currentTranslate')
   Point get currentTranslate native "SVGSVGElement_currentTranslate_Getter";
 
-
-  /** @domName SVGSVGElement.currentView */
+  @DocsEditable
+  @DomName('SVGSVGElement.currentView')
   ViewSpec get currentView native "SVGSVGElement_currentView_Getter";
 
-
-  /** @domName SVGSVGElement.height */
+  @DocsEditable
+  @DomName('SVGSVGElement.height')
   AnimatedLength get height native "SVGSVGElement_height_Getter";
 
-
-  /** @domName SVGSVGElement.pixelUnitToMillimeterX */
+  @DocsEditable
+  @DomName('SVGSVGElement.pixelUnitToMillimeterX')
   num get pixelUnitToMillimeterX native "SVGSVGElement_pixelUnitToMillimeterX_Getter";
 
-
-  /** @domName SVGSVGElement.pixelUnitToMillimeterY */
+  @DocsEditable
+  @DomName('SVGSVGElement.pixelUnitToMillimeterY')
   num get pixelUnitToMillimeterY native "SVGSVGElement_pixelUnitToMillimeterY_Getter";
 
-
-  /** @domName SVGSVGElement.screenPixelToMillimeterX */
+  @DocsEditable
+  @DomName('SVGSVGElement.screenPixelToMillimeterX')
   num get screenPixelToMillimeterX native "SVGSVGElement_screenPixelToMillimeterX_Getter";
 
-
-  /** @domName SVGSVGElement.screenPixelToMillimeterY */
+  @DocsEditable
+  @DomName('SVGSVGElement.screenPixelToMillimeterY')
   num get screenPixelToMillimeterY native "SVGSVGElement_screenPixelToMillimeterY_Getter";
 
-
-  /** @domName SVGSVGElement.useCurrentView */
+  @DocsEditable
+  @DomName('SVGSVGElement.useCurrentView')
   bool get useCurrentView native "SVGSVGElement_useCurrentView_Getter";
 
-
-  /** @domName SVGSVGElement.viewport */
+  @DocsEditable
+  @DomName('SVGSVGElement.viewport')
   Rect get viewport native "SVGSVGElement_viewport_Getter";
 
-
-  /** @domName SVGSVGElement.width */
+  @DocsEditable
+  @DomName('SVGSVGElement.width')
   AnimatedLength get width native "SVGSVGElement_width_Getter";
 
-
-  /** @domName SVGSVGElement.x */
+  @DocsEditable
+  @DomName('SVGSVGElement.x')
   AnimatedLength get x native "SVGSVGElement_x_Getter";
 
-
-  /** @domName SVGSVGElement.y */
+  @DocsEditable
+  @DomName('SVGSVGElement.y')
   AnimatedLength get y native "SVGSVGElement_y_Getter";
 
-
-  /** @domName SVGSVGElement.animationsPaused */
+  @DocsEditable
+  @DomName('SVGSVGElement.animationsPaused')
   bool animationsPaused() native "SVGSVGElement_animationsPaused_Callback";
 
-
-  /** @domName SVGSVGElement.checkEnclosure */
+  @DocsEditable
+  @DomName('SVGSVGElement.checkEnclosure')
   bool checkEnclosure(SvgElement element, Rect rect) native "SVGSVGElement_checkEnclosure_Callback";
 
-
-  /** @domName SVGSVGElement.checkIntersection */
+  @DocsEditable
+  @DomName('SVGSVGElement.checkIntersection')
   bool checkIntersection(SvgElement element, Rect rect) native "SVGSVGElement_checkIntersection_Callback";
 
-
-  /** @domName SVGSVGElement.createSVGAngle */
+  @DocsEditable
+  @DomName('SVGSVGElement.createSVGAngle')
   Angle createSvgAngle() native "SVGSVGElement_createSVGAngle_Callback";
 
-
-  /** @domName SVGSVGElement.createSVGLength */
+  @DocsEditable
+  @DomName('SVGSVGElement.createSVGLength')
   Length createSvgLength() native "SVGSVGElement_createSVGLength_Callback";
 
-
-  /** @domName SVGSVGElement.createSVGMatrix */
+  @DocsEditable
+  @DomName('SVGSVGElement.createSVGMatrix')
   Matrix createSvgMatrix() native "SVGSVGElement_createSVGMatrix_Callback";
 
-
-  /** @domName SVGSVGElement.createSVGNumber */
+  @DocsEditable
+  @DomName('SVGSVGElement.createSVGNumber')
   Number createSvgNumber() native "SVGSVGElement_createSVGNumber_Callback";
 
-
-  /** @domName SVGSVGElement.createSVGPoint */
+  @DocsEditable
+  @DomName('SVGSVGElement.createSVGPoint')
   Point createSvgPoint() native "SVGSVGElement_createSVGPoint_Callback";
 
-
-  /** @domName SVGSVGElement.createSVGRect */
+  @DocsEditable
+  @DomName('SVGSVGElement.createSVGRect')
   Rect createSvgRect() native "SVGSVGElement_createSVGRect_Callback";
 
-
-  /** @domName SVGSVGElement.createSVGTransform */
+  @DocsEditable
+  @DomName('SVGSVGElement.createSVGTransform')
   Transform createSvgTransform() native "SVGSVGElement_createSVGTransform_Callback";
 
-
-  /** @domName SVGSVGElement.createSVGTransformFromMatrix */
+  @DocsEditable
+  @DomName('SVGSVGElement.createSVGTransformFromMatrix')
   Transform createSvgTransformFromMatrix(Matrix matrix) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";
 
-
-  /** @domName SVGSVGElement.deselectAll */
+  @DocsEditable
+  @DomName('SVGSVGElement.deselectAll')
   void deselectAll() native "SVGSVGElement_deselectAll_Callback";
 
-
-  /** @domName SVGSVGElement.forceRedraw */
+  @DocsEditable
+  @DomName('SVGSVGElement.forceRedraw')
   void forceRedraw() native "SVGSVGElement_forceRedraw_Callback";
 
-
-  /** @domName SVGSVGElement.getCurrentTime */
+  @DocsEditable
+  @DomName('SVGSVGElement.getCurrentTime')
   num getCurrentTime() native "SVGSVGElement_getCurrentTime_Callback";
 
-
-  /** @domName SVGSVGElement.getElementById */
+  @DocsEditable
+  @DomName('SVGSVGElement.getElementById')
   Element getElementById(String elementId) native "SVGSVGElement_getElementById_Callback";
 
-
-  /** @domName SVGSVGElement.getEnclosureList */
+  @DocsEditable
+  @DomName('SVGSVGElement.getEnclosureList')
   List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) native "SVGSVGElement_getEnclosureList_Callback";
 
-
-  /** @domName SVGSVGElement.getIntersectionList */
+  @DocsEditable
+  @DomName('SVGSVGElement.getIntersectionList')
   List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) native "SVGSVGElement_getIntersectionList_Callback";
 
-
-  /** @domName SVGSVGElement.pauseAnimations */
+  @DocsEditable
+  @DomName('SVGSVGElement.pauseAnimations')
   void pauseAnimations() native "SVGSVGElement_pauseAnimations_Callback";
 
-
-  /** @domName SVGSVGElement.setCurrentTime */
+  @DocsEditable
+  @DomName('SVGSVGElement.setCurrentTime')
   void setCurrentTime(num seconds) native "SVGSVGElement_setCurrentTime_Callback";
 
-
-  /** @domName SVGSVGElement.suspendRedraw */
+  @DocsEditable
+  @DomName('SVGSVGElement.suspendRedraw')
   int suspendRedraw(int maxWaitMilliseconds) native "SVGSVGElement_suspendRedraw_Callback";
 
-
-  /** @domName SVGSVGElement.unpauseAnimations */
+  @DocsEditable
+  @DomName('SVGSVGElement.unpauseAnimations')
   void unpauseAnimations() native "SVGSVGElement_unpauseAnimations_Callback";
 
-
-  /** @domName SVGSVGElement.unsuspendRedraw */
+  @DocsEditable
+  @DomName('SVGSVGElement.unsuspendRedraw')
   void unsuspendRedraw(int suspendHandleId) native "SVGSVGElement_unsuspendRedraw_Callback";
 
-
-  /** @domName SVGSVGElement.unsuspendRedrawAll */
+  @DocsEditable
+  @DomName('SVGSVGElement.unsuspendRedrawAll')
   void unsuspendRedrawAll() native "SVGSVGElement_unsuspendRedrawAll_Callback";
 
-
-  /** @domName SVGSVGElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGSVGElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGSVGElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGSVGElement.preserveAspectRatio */
+  @DocsEditable
+  @DomName('SVGSVGElement.preserveAspectRatio')
   AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGSVGElement_preserveAspectRatio_Getter";
 
-
-  /** @domName SVGSVGElement.viewBox */
+  @DocsEditable
+  @DomName('SVGSVGElement.viewBox')
   AnimatedRect get viewBox native "SVGSVGElement_viewBox_Getter";
 
-
-  /** @domName SVGSVGElement.xmllang */
+  @DocsEditable
+  @DomName('SVGSVGElement.xmllang')
   String get xmllang native "SVGSVGElement_xmllang_Getter";
 
-
-  /** @domName SVGSVGElement.xmllang */
+  @DocsEditable
+  @DomName('SVGSVGElement.xmllang')
   void set xmllang(String value) native "SVGSVGElement_xmllang_Setter";
 
-
-  /** @domName SVGSVGElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGSVGElement.xmlspace')
   String get xmlspace native "SVGSVGElement_xmlspace_Getter";
 
-
-  /** @domName SVGSVGElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGSVGElement.xmlspace')
   void set xmlspace(String value) native "SVGSVGElement_xmlspace_Setter";
 
-
-  /** @domName SVGSVGElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGSVGElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGSVGElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGSVGElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGSVGElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGSVGElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGSVGElement.getBBox */
+  @DocsEditable
+  @DomName('SVGSVGElement.getBBox')
   Rect getBBox() native "SVGSVGElement_getBBox_Callback";
 
-
-  /** @domName SVGSVGElement.getCTM */
+  @DocsEditable
+  @DomName('SVGSVGElement.getCTM')
   Matrix getCtm() native "SVGSVGElement_getCTM_Callback";
 
-
-  /** @domName SVGSVGElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGSVGElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGSVGElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGSVGElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGSVGElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGSVGElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGSVGElement.className */
+  @DocsEditable
+  @DomName('SVGSVGElement.className')
   AnimatedString get $dom_svgClassName native "SVGSVGElement_className_Getter";
 
-
-  /** @domName SVGSVGElement.style */
+  @DocsEditable
+  @DomName('SVGSVGElement.style')
   CssStyleDeclaration get style native "SVGSVGElement_style_Getter";
 
-
-  /** @domName SVGSVGElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGSVGElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGSVGElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGSVGElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGSVGElement.requiredExtensions')
   StringList get requiredExtensions native "SVGSVGElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGSVGElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGSVGElement.requiredFeatures')
   StringList get requiredFeatures native "SVGSVGElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGSVGElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGSVGElement.systemLanguage')
   StringList get systemLanguage native "SVGSVGElement_systemLanguage_Getter";
 
-
-  /** @domName SVGSVGElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGSVGElement.hasExtension')
   bool hasExtension(String extension) native "SVGSVGElement_hasExtension_Callback";
 
-
-  /** @domName SVGSVGElement.zoomAndPan */
+  @DocsEditable
+  @DomName('SVGSVGElement.zoomAndPan')
   int get zoomAndPan native "SVGSVGElement_zoomAndPan_Getter";
 
-
-  /** @domName SVGSVGElement.zoomAndPan */
+  @DocsEditable
+  @DomName('SVGSVGElement.zoomAndPan')
   void set zoomAndPan(int value) native "SVGSVGElement_zoomAndPan_Setter";
 
 }
@@ -7264,87 +7476,88 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGSwitchElement
+@DocsEditable
+@DomName('SVGSwitchElement')
 class SwitchElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
   SwitchElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory SwitchElement() => _SvgElementFactoryProvider.createSvgElement_tag("switch");
 
-
-  /** @domName SVGSwitchElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGSwitchElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGSwitchElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGSwitchElement.xmllang */
+  @DocsEditable
+  @DomName('SVGSwitchElement.xmllang')
   String get xmllang native "SVGSwitchElement_xmllang_Getter";
 
-
-  /** @domName SVGSwitchElement.xmllang */
+  @DocsEditable
+  @DomName('SVGSwitchElement.xmllang')
   void set xmllang(String value) native "SVGSwitchElement_xmllang_Setter";
 
-
-  /** @domName SVGSwitchElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGSwitchElement.xmlspace')
   String get xmlspace native "SVGSwitchElement_xmlspace_Getter";
 
-
-  /** @domName SVGSwitchElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGSwitchElement.xmlspace')
   void set xmlspace(String value) native "SVGSwitchElement_xmlspace_Setter";
 
-
-  /** @domName SVGSwitchElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGSwitchElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGSwitchElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGSwitchElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGSwitchElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGSwitchElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGSwitchElement.getBBox */
+  @DocsEditable
+  @DomName('SVGSwitchElement.getBBox')
   Rect getBBox() native "SVGSwitchElement_getBBox_Callback";
 
-
-  /** @domName SVGSwitchElement.getCTM */
+  @DocsEditable
+  @DomName('SVGSwitchElement.getCTM')
   Matrix getCtm() native "SVGSwitchElement_getCTM_Callback";
 
-
-  /** @domName SVGSwitchElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGSwitchElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGSwitchElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGSwitchElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGSwitchElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGSwitchElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGSwitchElement.className */
+  @DocsEditable
+  @DomName('SVGSwitchElement.className')
   AnimatedString get $dom_svgClassName native "SVGSwitchElement_className_Getter";
 
-
-  /** @domName SVGSwitchElement.style */
+  @DocsEditable
+  @DomName('SVGSwitchElement.style')
   CssStyleDeclaration get style native "SVGSwitchElement_style_Getter";
 
-
-  /** @domName SVGSwitchElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGSwitchElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGSwitchElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGSwitchElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGSwitchElement.requiredExtensions')
   StringList get requiredExtensions native "SVGSwitchElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGSwitchElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGSwitchElement.requiredFeatures')
   StringList get requiredFeatures native "SVGSwitchElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGSwitchElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGSwitchElement.systemLanguage')
   StringList get systemLanguage native "SVGSwitchElement_systemLanguage_Getter";
 
-
-  /** @domName SVGSwitchElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGSwitchElement.hasExtension')
   bool hasExtension(String extension) native "SVGSwitchElement_hasExtension_Callback";
 
-
-  /** @domName SVGSwitchElement.transform */
+  @DocsEditable
+  @DomName('SVGSwitchElement.transform')
   AnimatedTransformList get transform native "SVGSwitchElement_transform_Getter";
 
 }
@@ -7355,51 +7568,52 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGSymbolElement
+@DocsEditable
+@DomName('SVGSymbolElement')
 class SymbolElement extends SvgElement implements FitToViewBox, ExternalResourcesRequired, Stylable, LangSpace {
   SymbolElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory SymbolElement() => _SvgElementFactoryProvider.createSvgElement_tag("symbol");
 
-
-  /** @domName SVGSymbolElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGSymbolElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGSymbolElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGSymbolElement.preserveAspectRatio */
+  @DocsEditable
+  @DomName('SVGSymbolElement.preserveAspectRatio')
   AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGSymbolElement_preserveAspectRatio_Getter";
 
-
-  /** @domName SVGSymbolElement.viewBox */
+  @DocsEditable
+  @DomName('SVGSymbolElement.viewBox')
   AnimatedRect get viewBox native "SVGSymbolElement_viewBox_Getter";
 
-
-  /** @domName SVGSymbolElement.xmllang */
+  @DocsEditable
+  @DomName('SVGSymbolElement.xmllang')
   String get xmllang native "SVGSymbolElement_xmllang_Getter";
 
-
-  /** @domName SVGSymbolElement.xmllang */
+  @DocsEditable
+  @DomName('SVGSymbolElement.xmllang')
   void set xmllang(String value) native "SVGSymbolElement_xmllang_Setter";
 
-
-  /** @domName SVGSymbolElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGSymbolElement.xmlspace')
   String get xmlspace native "SVGSymbolElement_xmlspace_Getter";
 
-
-  /** @domName SVGSymbolElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGSymbolElement.xmlspace')
   void set xmlspace(String value) native "SVGSymbolElement_xmlspace_Setter";
 
-
-  /** @domName SVGSymbolElement.className */
+  @DocsEditable
+  @DomName('SVGSymbolElement.className')
   AnimatedString get $dom_svgClassName native "SVGSymbolElement_className_Getter";
 
-
-  /** @domName SVGSymbolElement.style */
+  @DocsEditable
+  @DomName('SVGSymbolElement.style')
   CssStyleDeclaration get style native "SVGSymbolElement_style_Getter";
 
-
-  /** @domName SVGSymbolElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGSymbolElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGSymbolElement_getPresentationAttribute_Callback";
 
 }
@@ -7410,15 +7624,16 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGTRefElement
+@DocsEditable
+@DomName('SVGTRefElement')
 class TRefElement extends TextPositioningElement implements UriReference {
   TRefElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory TRefElement() => _SvgElementFactoryProvider.createSvgElement_tag("tref");
 
-
-  /** @domName SVGTRefElement.href */
+  @DocsEditable
+  @DomName('SVGTRefElement.href')
   AnimatedString get href native "SVGTRefElement_href_Getter";
 
 }
@@ -7429,11 +7644,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGTSpanElement
+@DocsEditable
+@DomName('SVGTSpanElement')
 class TSpanElement extends TextPositioningElement {
   TSpanElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory TSpanElement() => _SvgElementFactoryProvider.createSvgElement_tag("tspan");
 
 }
@@ -7444,24 +7660,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGTests
+@DocsEditable
+@DomName('SVGTests')
 class Tests extends NativeFieldWrapperClass1 {
   Tests.internal();
 
-
-  /** @domName SVGTests.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGTests.requiredExtensions')
   StringList get requiredExtensions native "SVGTests_requiredExtensions_Getter";
 
-
-  /** @domName SVGTests.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGTests.requiredFeatures')
   StringList get requiredFeatures native "SVGTests_requiredFeatures_Getter";
 
-
-  /** @domName SVGTests.systemLanguage */
+  @DocsEditable
+  @DomName('SVGTests.systemLanguage')
   StringList get systemLanguage native "SVGTests_systemLanguage_Getter";
 
-
-  /** @domName SVGTests.hasExtension */
+  @DocsEditable
+  @DomName('SVGTests.hasExtension')
   bool hasExtension(String extension) native "SVGTests_hasExtension_Callback";
 
 }
@@ -7472,7 +7689,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGTextContentElement
+@DocsEditable
+@DomName('SVGTextContentElement')
 class TextContentElement extends SvgElement implements Tests, Stylable, ExternalResourcesRequired, LangSpace {
   TextContentElement.internal() : super.internal();
 
@@ -7482,96 +7700,96 @@
 
   static const int LENGTHADJUST_UNKNOWN = 0;
 
-
-  /** @domName SVGTextContentElement.lengthAdjust */
+  @DocsEditable
+  @DomName('SVGTextContentElement.lengthAdjust')
   AnimatedEnumeration get lengthAdjust native "SVGTextContentElement_lengthAdjust_Getter";
 
-
-  /** @domName SVGTextContentElement.textLength */
+  @DocsEditable
+  @DomName('SVGTextContentElement.textLength')
   AnimatedLength get textLength native "SVGTextContentElement_textLength_Getter";
 
-
-  /** @domName SVGTextContentElement.getCharNumAtPosition */
+  @DocsEditable
+  @DomName('SVGTextContentElement.getCharNumAtPosition')
   int getCharNumAtPosition(Point point) native "SVGTextContentElement_getCharNumAtPosition_Callback";
 
-
-  /** @domName SVGTextContentElement.getComputedTextLength */
+  @DocsEditable
+  @DomName('SVGTextContentElement.getComputedTextLength')
   num getComputedTextLength() native "SVGTextContentElement_getComputedTextLength_Callback";
 
-
-  /** @domName SVGTextContentElement.getEndPositionOfChar */
+  @DocsEditable
+  @DomName('SVGTextContentElement.getEndPositionOfChar')
   Point getEndPositionOfChar(int offset) native "SVGTextContentElement_getEndPositionOfChar_Callback";
 
-
-  /** @domName SVGTextContentElement.getExtentOfChar */
+  @DocsEditable
+  @DomName('SVGTextContentElement.getExtentOfChar')
   Rect getExtentOfChar(int offset) native "SVGTextContentElement_getExtentOfChar_Callback";
 
-
-  /** @domName SVGTextContentElement.getNumberOfChars */
+  @DocsEditable
+  @DomName('SVGTextContentElement.getNumberOfChars')
   int getNumberOfChars() native "SVGTextContentElement_getNumberOfChars_Callback";
 
-
-  /** @domName SVGTextContentElement.getRotationOfChar */
+  @DocsEditable
+  @DomName('SVGTextContentElement.getRotationOfChar')
   num getRotationOfChar(int offset) native "SVGTextContentElement_getRotationOfChar_Callback";
 
-
-  /** @domName SVGTextContentElement.getStartPositionOfChar */
+  @DocsEditable
+  @DomName('SVGTextContentElement.getStartPositionOfChar')
   Point getStartPositionOfChar(int offset) native "SVGTextContentElement_getStartPositionOfChar_Callback";
 
-
-  /** @domName SVGTextContentElement.getSubStringLength */
+  @DocsEditable
+  @DomName('SVGTextContentElement.getSubStringLength')
   num getSubStringLength(int offset, int length) native "SVGTextContentElement_getSubStringLength_Callback";
 
-
-  /** @domName SVGTextContentElement.selectSubString */
+  @DocsEditable
+  @DomName('SVGTextContentElement.selectSubString')
   void selectSubString(int offset, int length) native "SVGTextContentElement_selectSubString_Callback";
 
-
-  /** @domName SVGTextContentElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGTextContentElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGTextContentElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGTextContentElement.xmllang */
+  @DocsEditable
+  @DomName('SVGTextContentElement.xmllang')
   String get xmllang native "SVGTextContentElement_xmllang_Getter";
 
-
-  /** @domName SVGTextContentElement.xmllang */
+  @DocsEditable
+  @DomName('SVGTextContentElement.xmllang')
   void set xmllang(String value) native "SVGTextContentElement_xmllang_Setter";
 
-
-  /** @domName SVGTextContentElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGTextContentElement.xmlspace')
   String get xmlspace native "SVGTextContentElement_xmlspace_Getter";
 
-
-  /** @domName SVGTextContentElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGTextContentElement.xmlspace')
   void set xmlspace(String value) native "SVGTextContentElement_xmlspace_Setter";
 
-
-  /** @domName SVGTextContentElement.className */
+  @DocsEditable
+  @DomName('SVGTextContentElement.className')
   AnimatedString get $dom_svgClassName native "SVGTextContentElement_className_Getter";
 
-
-  /** @domName SVGTextContentElement.style */
+  @DocsEditable
+  @DomName('SVGTextContentElement.style')
   CssStyleDeclaration get style native "SVGTextContentElement_style_Getter";
 
-
-  /** @domName SVGTextContentElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGTextContentElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGTextContentElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGTextContentElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGTextContentElement.requiredExtensions')
   StringList get requiredExtensions native "SVGTextContentElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGTextContentElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGTextContentElement.requiredFeatures')
   StringList get requiredFeatures native "SVGTextContentElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGTextContentElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGTextContentElement.systemLanguage')
   StringList get systemLanguage native "SVGTextContentElement_systemLanguage_Getter";
 
-
-  /** @domName SVGTextContentElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGTextContentElement.hasExtension')
   bool hasExtension(String extension) native "SVGTextContentElement_hasExtension_Callback";
 
 }
@@ -7582,39 +7800,40 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGTextElement
+@DocsEditable
+@DomName('SVGTextElement')
 class TextElement extends TextPositioningElement implements Transformable {
   TextElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory TextElement() => _SvgElementFactoryProvider.createSvgElement_tag("text");
 
-
-  /** @domName SVGTextElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGTextElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGTextElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGTextElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGTextElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGTextElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGTextElement.getBBox */
+  @DocsEditable
+  @DomName('SVGTextElement.getBBox')
   Rect getBBox() native "SVGTextElement_getBBox_Callback";
 
-
-  /** @domName SVGTextElement.getCTM */
+  @DocsEditable
+  @DomName('SVGTextElement.getCTM')
   Matrix getCtm() native "SVGTextElement_getCTM_Callback";
 
-
-  /** @domName SVGTextElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGTextElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGTextElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGTextElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGTextElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGTextElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGTextElement.transform */
+  @DocsEditable
+  @DomName('SVGTextElement.transform')
   AnimatedTransformList get transform native "SVGTextElement_transform_Getter";
 
 }
@@ -7625,7 +7844,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGTextPathElement
+@DocsEditable
+@DomName('SVGTextPathElement')
 class TextPathElement extends TextContentElement implements UriReference {
   TextPathElement.internal() : super.internal();
 
@@ -7641,20 +7861,20 @@
 
   static const int TEXTPATH_SPACINGTYPE_UNKNOWN = 0;
 
-
-  /** @domName SVGTextPathElement.method */
+  @DocsEditable
+  @DomName('SVGTextPathElement.method')
   AnimatedEnumeration get method native "SVGTextPathElement_method_Getter";
 
-
-  /** @domName SVGTextPathElement.spacing */
+  @DocsEditable
+  @DomName('SVGTextPathElement.spacing')
   AnimatedEnumeration get spacing native "SVGTextPathElement_spacing_Getter";
 
-
-  /** @domName SVGTextPathElement.startOffset */
+  @DocsEditable
+  @DomName('SVGTextPathElement.startOffset')
   AnimatedLength get startOffset native "SVGTextPathElement_startOffset_Getter";
 
-
-  /** @domName SVGTextPathElement.href */
+  @DocsEditable
+  @DomName('SVGTextPathElement.href')
   AnimatedString get href native "SVGTextPathElement_href_Getter";
 
 }
@@ -7665,28 +7885,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGTextPositioningElement
+@DocsEditable
+@DomName('SVGTextPositioningElement')
 class TextPositioningElement extends TextContentElement {
   TextPositioningElement.internal() : super.internal();
 
-
-  /** @domName SVGTextPositioningElement.dx */
+  @DocsEditable
+  @DomName('SVGTextPositioningElement.dx')
   AnimatedLengthList get dx native "SVGTextPositioningElement_dx_Getter";
 
-
-  /** @domName SVGTextPositioningElement.dy */
+  @DocsEditable
+  @DomName('SVGTextPositioningElement.dy')
   AnimatedLengthList get dy native "SVGTextPositioningElement_dy_Getter";
 
-
-  /** @domName SVGTextPositioningElement.rotate */
+  @DocsEditable
+  @DomName('SVGTextPositioningElement.rotate')
   AnimatedNumberList get rotate native "SVGTextPositioningElement_rotate_Getter";
 
-
-  /** @domName SVGTextPositioningElement.x */
+  @DocsEditable
+  @DomName('SVGTextPositioningElement.x')
   AnimatedLengthList get x native "SVGTextPositioningElement_x_Getter";
 
-
-  /** @domName SVGTextPositioningElement.y */
+  @DocsEditable
+  @DomName('SVGTextPositioningElement.y')
   AnimatedLengthList get y native "SVGTextPositioningElement_y_Getter";
 
 }
@@ -7697,39 +7918,40 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGTitleElement
+@DocsEditable
+@DomName('SVGTitleElement')
 class TitleElement extends SvgElement implements Stylable, LangSpace {
   TitleElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory TitleElement() => _SvgElementFactoryProvider.createSvgElement_tag("title");
 
-
-  /** @domName SVGTitleElement.xmllang */
+  @DocsEditable
+  @DomName('SVGTitleElement.xmllang')
   String get xmllang native "SVGTitleElement_xmllang_Getter";
 
-
-  /** @domName SVGTitleElement.xmllang */
+  @DocsEditable
+  @DomName('SVGTitleElement.xmllang')
   void set xmllang(String value) native "SVGTitleElement_xmllang_Setter";
 
-
-  /** @domName SVGTitleElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGTitleElement.xmlspace')
   String get xmlspace native "SVGTitleElement_xmlspace_Getter";
 
-
-  /** @domName SVGTitleElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGTitleElement.xmlspace')
   void set xmlspace(String value) native "SVGTitleElement_xmlspace_Setter";
 
-
-  /** @domName SVGTitleElement.className */
+  @DocsEditable
+  @DomName('SVGTitleElement.className')
   AnimatedString get $dom_svgClassName native "SVGTitleElement_className_Getter";
 
-
-  /** @domName SVGTitleElement.style */
+  @DocsEditable
+  @DomName('SVGTitleElement.style')
   CssStyleDeclaration get style native "SVGTitleElement_style_Getter";
 
-
-  /** @domName SVGTitleElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGTitleElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGTitleElement_getPresentationAttribute_Callback";
 
 }
@@ -7740,7 +7962,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGTransform
+@DocsEditable
+@DomName('SVGTransform')
 class Transform extends NativeFieldWrapperClass1 {
   Transform.internal();
 
@@ -7758,40 +7981,40 @@
 
   static const int SVG_TRANSFORM_UNKNOWN = 0;
 
-
-  /** @domName SVGTransform.angle */
+  @DocsEditable
+  @DomName('SVGTransform.angle')
   num get angle native "SVGTransform_angle_Getter";
 
-
-  /** @domName SVGTransform.matrix */
+  @DocsEditable
+  @DomName('SVGTransform.matrix')
   Matrix get matrix native "SVGTransform_matrix_Getter";
 
-
-  /** @domName SVGTransform.type */
+  @DocsEditable
+  @DomName('SVGTransform.type')
   int get type native "SVGTransform_type_Getter";
 
-
-  /** @domName SVGTransform.setMatrix */
+  @DocsEditable
+  @DomName('SVGTransform.setMatrix')
   void setMatrix(Matrix matrix) native "SVGTransform_setMatrix_Callback";
 
-
-  /** @domName SVGTransform.setRotate */
+  @DocsEditable
+  @DomName('SVGTransform.setRotate')
   void setRotate(num angle, num cx, num cy) native "SVGTransform_setRotate_Callback";
 
-
-  /** @domName SVGTransform.setScale */
+  @DocsEditable
+  @DomName('SVGTransform.setScale')
   void setScale(num sx, num sy) native "SVGTransform_setScale_Callback";
 
-
-  /** @domName SVGTransform.setSkewX */
+  @DocsEditable
+  @DomName('SVGTransform.setSkewX')
   void setSkewX(num angle) native "SVGTransform_setSkewX_Callback";
 
-
-  /** @domName SVGTransform.setSkewY */
+  @DocsEditable
+  @DomName('SVGTransform.setSkewY')
   void setSkewY(num angle) native "SVGTransform_setSkewY_Callback";
 
-
-  /** @domName SVGTransform.setTranslate */
+  @DocsEditable
+  @DomName('SVGTransform.setTranslate')
   void setTranslate(num tx, num ty) native "SVGTransform_setTranslate_Callback";
 
 }
@@ -7802,12 +8025,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGTransformList
+@DocsEditable
+@DomName('SVGTransformList')
 class TransformList extends NativeFieldWrapperClass1 implements List<Transform> {
   TransformList.internal();
 
-
-  /** @domName SVGTransformList.numberOfItems */
+  @DocsEditable
+  @DomName('SVGTransformList.numberOfItems')
   int get numberOfItems native "SVGTransformList_numberOfItems_Getter";
 
   Transform operator[](int index) native "SVGTransformList_item_Callback";
@@ -7830,50 +8054,50 @@
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Transform)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(Transform element) => Collections.contains(this, element);
+  bool contains(Transform element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Transform element)) => Collections.forEach(this, f);
+  void forEach(void f(Transform element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(Transform element)) => new MappedList<Transform, dynamic>(this, f);
+  List mappedBy(f(Transform element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<Transform> where(bool f(Transform element)) => new WhereIterable<Transform>(this, f);
+  Iterable<Transform> where(bool f(Transform element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(Transform element)) => Collections.every(this, f);
+  bool every(bool f(Transform element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Transform element)) => Collections.any(this, f);
+  bool any(bool f(Transform element)) => IterableMixinWorkaround.any(this, f);
 
   List<Transform> toList() => new List<Transform>.from(this);
   Set<Transform> toSet() => new Set<Transform>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<Transform> take(int n) => new ListView<Transform>(this, 0, n);
+  List<Transform> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<Transform> takeWhile(bool test(Transform value)) {
-    return new TakeWhileIterable<Transform>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<Transform> skip(int n) => new ListView<Transform>(this, n, null);
+  List<Transform> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<Transform> skipWhile(bool test(Transform value)) {
-    return new SkipWhileIterable<Transform>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Transform firstMatching(bool test(Transform value), { Transform orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Transform lastMatching(bool test(Transform value), {Transform orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Transform singleMatching(bool test(Transform value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Transform elementAt(int index) {
@@ -7899,7 +8123,7 @@
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
-  // contains() defined by IDL.
+  // clear() defined by IDL.
 
   void sort([int compare(Transform a, Transform b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
@@ -7929,16 +8153,36 @@
     throw new StateError("More than one element");
   }
 
-  Transform min([int compare(Transform a, Transform b)]) => Collections.min(this, compare);
+  Transform min([int compare(Transform a, Transform b)]) => IterableMixinWorkaround.min(this, compare);
 
-  Transform max([int compare(Transform a, Transform b)]) => Collections.max(this, compare);
+  Transform max([int compare(Transform a, Transform b)]) => IterableMixinWorkaround.max(this, compare);
 
   Transform removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   Transform removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(Transform element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(Transform element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<Transform> from, [int startFrom]) {
@@ -7958,40 +8202,40 @@
 
   // -- end List<Transform> mixins.
 
-
-  /** @domName SVGTransformList.appendItem */
+  @DocsEditable
+  @DomName('SVGTransformList.appendItem')
   Transform appendItem(Transform item) native "SVGTransformList_appendItem_Callback";
 
-
-  /** @domName SVGTransformList.clear */
+  @DocsEditable
+  @DomName('SVGTransformList.clear')
   void clear() native "SVGTransformList_clear_Callback";
 
-
-  /** @domName SVGTransformList.consolidate */
+  @DocsEditable
+  @DomName('SVGTransformList.consolidate')
   Transform consolidate() native "SVGTransformList_consolidate_Callback";
 
-
-  /** @domName SVGTransformList.createSVGTransformFromMatrix */
+  @DocsEditable
+  @DomName('SVGTransformList.createSVGTransformFromMatrix')
   Transform createSvgTransformFromMatrix(Matrix matrix) native "SVGTransformList_createSVGTransformFromMatrix_Callback";
 
-
-  /** @domName SVGTransformList.getItem */
+  @DocsEditable
+  @DomName('SVGTransformList.getItem')
   Transform getItem(int index) native "SVGTransformList_getItem_Callback";
 
-
-  /** @domName SVGTransformList.initialize */
+  @DocsEditable
+  @DomName('SVGTransformList.initialize')
   Transform initialize(Transform item) native "SVGTransformList_initialize_Callback";
 
-
-  /** @domName SVGTransformList.insertItemBefore */
+  @DocsEditable
+  @DomName('SVGTransformList.insertItemBefore')
   Transform insertItemBefore(Transform item, int index) native "SVGTransformList_insertItemBefore_Callback";
 
-
-  /** @domName SVGTransformList.removeItem */
+  @DocsEditable
+  @DomName('SVGTransformList.removeItem')
   Transform removeItem(int index) native "SVGTransformList_removeItem_Callback";
 
-
-  /** @domName SVGTransformList.replaceItem */
+  @DocsEditable
+  @DomName('SVGTransformList.replaceItem')
   Transform replaceItem(Transform item, int index) native "SVGTransformList_replaceItem_Callback";
 
 }
@@ -8002,36 +8246,37 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGTransformable
+@DocsEditable
+@DomName('SVGTransformable')
 class Transformable extends NativeFieldWrapperClass1 implements Locatable {
   Transformable.internal();
 
-
-  /** @domName SVGTransformable.transform */
+  @DocsEditable
+  @DomName('SVGTransformable.transform')
   AnimatedTransformList get transform native "SVGTransformable_transform_Getter";
 
-
-  /** @domName SVGTransformable.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGTransformable.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGTransformable_farthestViewportElement_Getter";
 
-
-  /** @domName SVGTransformable.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGTransformable.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGTransformable_nearestViewportElement_Getter";
 
-
-  /** @domName SVGTransformable.getBBox */
+  @DocsEditable
+  @DomName('SVGTransformable.getBBox')
   Rect getBBox() native "SVGTransformable_getBBox_Callback";
 
-
-  /** @domName SVGTransformable.getCTM */
+  @DocsEditable
+  @DomName('SVGTransformable.getCTM')
   Matrix getCtm() native "SVGTransformable_getCTM_Callback";
 
-
-  /** @domName SVGTransformable.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGTransformable.getScreenCTM')
   Matrix getScreenCtm() native "SVGTransformable_getScreenCTM_Callback";
 
-
-  /** @domName SVGTransformable.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGTransformable.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGTransformable_getTransformToElement_Callback";
 
 }
@@ -8042,7 +8287,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGUnitTypes
+@DocsEditable
+@DomName('SVGUnitTypes')
 class UnitTypes extends NativeFieldWrapperClass1 {
   UnitTypes.internal();
 
@@ -8060,12 +8306,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGURIReference
+@DocsEditable
+@DomName('SVGURIReference')
 class UriReference extends NativeFieldWrapperClass1 {
   UriReference.internal();
 
-
-  /** @domName SVGURIReference.href */
+  @DocsEditable
+  @DomName('SVGURIReference.href')
   AnimatedString get href native "SVGURIReference_href_Getter";
 
 }
@@ -8076,115 +8323,116 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGUseElement
+@DocsEditable
+@DomName('SVGUseElement')
 class UseElement extends SvgElement implements Transformable, Tests, UriReference, Stylable, ExternalResourcesRequired, LangSpace {
   UseElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory UseElement() => _SvgElementFactoryProvider.createSvgElement_tag("use");
 
-
-  /** @domName SVGUseElement.animatedInstanceRoot */
+  @DocsEditable
+  @DomName('SVGUseElement.animatedInstanceRoot')
   ElementInstance get animatedInstanceRoot native "SVGUseElement_animatedInstanceRoot_Getter";
 
-
-  /** @domName SVGUseElement.height */
+  @DocsEditable
+  @DomName('SVGUseElement.height')
   AnimatedLength get height native "SVGUseElement_height_Getter";
 
-
-  /** @domName SVGUseElement.instanceRoot */
+  @DocsEditable
+  @DomName('SVGUseElement.instanceRoot')
   ElementInstance get instanceRoot native "SVGUseElement_instanceRoot_Getter";
 
-
-  /** @domName SVGUseElement.width */
+  @DocsEditable
+  @DomName('SVGUseElement.width')
   AnimatedLength get width native "SVGUseElement_width_Getter";
 
-
-  /** @domName SVGUseElement.x */
+  @DocsEditable
+  @DomName('SVGUseElement.x')
   AnimatedLength get x native "SVGUseElement_x_Getter";
 
-
-  /** @domName SVGUseElement.y */
+  @DocsEditable
+  @DomName('SVGUseElement.y')
   AnimatedLength get y native "SVGUseElement_y_Getter";
 
-
-  /** @domName SVGUseElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGUseElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGUseElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGUseElement.xmllang */
+  @DocsEditable
+  @DomName('SVGUseElement.xmllang')
   String get xmllang native "SVGUseElement_xmllang_Getter";
 
-
-  /** @domName SVGUseElement.xmllang */
+  @DocsEditable
+  @DomName('SVGUseElement.xmllang')
   void set xmllang(String value) native "SVGUseElement_xmllang_Setter";
 
-
-  /** @domName SVGUseElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGUseElement.xmlspace')
   String get xmlspace native "SVGUseElement_xmlspace_Getter";
 
-
-  /** @domName SVGUseElement.xmlspace */
+  @DocsEditable
+  @DomName('SVGUseElement.xmlspace')
   void set xmlspace(String value) native "SVGUseElement_xmlspace_Setter";
 
-
-  /** @domName SVGUseElement.farthestViewportElement */
+  @DocsEditable
+  @DomName('SVGUseElement.farthestViewportElement')
   SvgElement get farthestViewportElement native "SVGUseElement_farthestViewportElement_Getter";
 
-
-  /** @domName SVGUseElement.nearestViewportElement */
+  @DocsEditable
+  @DomName('SVGUseElement.nearestViewportElement')
   SvgElement get nearestViewportElement native "SVGUseElement_nearestViewportElement_Getter";
 
-
-  /** @domName SVGUseElement.getBBox */
+  @DocsEditable
+  @DomName('SVGUseElement.getBBox')
   Rect getBBox() native "SVGUseElement_getBBox_Callback";
 
-
-  /** @domName SVGUseElement.getCTM */
+  @DocsEditable
+  @DomName('SVGUseElement.getCTM')
   Matrix getCtm() native "SVGUseElement_getCTM_Callback";
 
-
-  /** @domName SVGUseElement.getScreenCTM */
+  @DocsEditable
+  @DomName('SVGUseElement.getScreenCTM')
   Matrix getScreenCtm() native "SVGUseElement_getScreenCTM_Callback";
 
-
-  /** @domName SVGUseElement.getTransformToElement */
+  @DocsEditable
+  @DomName('SVGUseElement.getTransformToElement')
   Matrix getTransformToElement(SvgElement element) native "SVGUseElement_getTransformToElement_Callback";
 
-
-  /** @domName SVGUseElement.className */
+  @DocsEditable
+  @DomName('SVGUseElement.className')
   AnimatedString get $dom_svgClassName native "SVGUseElement_className_Getter";
 
-
-  /** @domName SVGUseElement.style */
+  @DocsEditable
+  @DomName('SVGUseElement.style')
   CssStyleDeclaration get style native "SVGUseElement_style_Getter";
 
-
-  /** @domName SVGUseElement.getPresentationAttribute */
+  @DocsEditable
+  @DomName('SVGUseElement.getPresentationAttribute')
   CssValue getPresentationAttribute(String name) native "SVGUseElement_getPresentationAttribute_Callback";
 
-
-  /** @domName SVGUseElement.requiredExtensions */
+  @DocsEditable
+  @DomName('SVGUseElement.requiredExtensions')
   StringList get requiredExtensions native "SVGUseElement_requiredExtensions_Getter";
 
-
-  /** @domName SVGUseElement.requiredFeatures */
+  @DocsEditable
+  @DomName('SVGUseElement.requiredFeatures')
   StringList get requiredFeatures native "SVGUseElement_requiredFeatures_Getter";
 
-
-  /** @domName SVGUseElement.systemLanguage */
+  @DocsEditable
+  @DomName('SVGUseElement.systemLanguage')
   StringList get systemLanguage native "SVGUseElement_systemLanguage_Getter";
 
-
-  /** @domName SVGUseElement.hasExtension */
+  @DocsEditable
+  @DomName('SVGUseElement.hasExtension')
   bool hasExtension(String extension) native "SVGUseElement_hasExtension_Callback";
 
-
-  /** @domName SVGUseElement.transform */
+  @DocsEditable
+  @DomName('SVGUseElement.transform')
   AnimatedTransformList get transform native "SVGUseElement_transform_Getter";
 
-
-  /** @domName SVGUseElement.href */
+  @DocsEditable
+  @DomName('SVGUseElement.href')
   AnimatedString get href native "SVGUseElement_href_Getter";
 
 }
@@ -8195,11 +8443,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGVKernElement
+@DocsEditable
+@DomName('SVGVKernElement')
 class VKernElement extends SvgElement {
   VKernElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory VKernElement() => _SvgElementFactoryProvider.createSvgElement_tag("vkern");
 
 }
@@ -8210,35 +8459,36 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGViewElement
+@DocsEditable
+@DomName('SVGViewElement')
 class ViewElement extends SvgElement implements FitToViewBox, ExternalResourcesRequired, ZoomAndPan {
   ViewElement.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory ViewElement() => _SvgElementFactoryProvider.createSvgElement_tag("view");
 
-
-  /** @domName SVGViewElement.viewTarget */
+  @DocsEditable
+  @DomName('SVGViewElement.viewTarget')
   StringList get viewTarget native "SVGViewElement_viewTarget_Getter";
 
-
-  /** @domName SVGViewElement.externalResourcesRequired */
+  @DocsEditable
+  @DomName('SVGViewElement.externalResourcesRequired')
   AnimatedBoolean get externalResourcesRequired native "SVGViewElement_externalResourcesRequired_Getter";
 
-
-  /** @domName SVGViewElement.preserveAspectRatio */
+  @DocsEditable
+  @DomName('SVGViewElement.preserveAspectRatio')
   AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGViewElement_preserveAspectRatio_Getter";
 
-
-  /** @domName SVGViewElement.viewBox */
+  @DocsEditable
+  @DomName('SVGViewElement.viewBox')
   AnimatedRect get viewBox native "SVGViewElement_viewBox_Getter";
 
-
-  /** @domName SVGViewElement.zoomAndPan */
+  @DocsEditable
+  @DomName('SVGViewElement.zoomAndPan')
   int get zoomAndPan native "SVGViewElement_zoomAndPan_Getter";
 
-
-  /** @domName SVGViewElement.zoomAndPan */
+  @DocsEditable
+  @DomName('SVGViewElement.zoomAndPan')
   void set zoomAndPan(int value) native "SVGViewElement_zoomAndPan_Setter";
 
 }
@@ -8249,48 +8499,49 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGViewSpec
+@DocsEditable
+@DomName('SVGViewSpec')
 class ViewSpec extends NativeFieldWrapperClass1 {
   ViewSpec.internal();
 
-
-  /** @domName SVGViewSpec.preserveAspectRatio */
+  @DocsEditable
+  @DomName('SVGViewSpec.preserveAspectRatio')
   AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGViewSpec_preserveAspectRatio_Getter";
 
-
-  /** @domName SVGViewSpec.preserveAspectRatioString */
+  @DocsEditable
+  @DomName('SVGViewSpec.preserveAspectRatioString')
   String get preserveAspectRatioString native "SVGViewSpec_preserveAspectRatioString_Getter";
 
-
-  /** @domName SVGViewSpec.transform */
+  @DocsEditable
+  @DomName('SVGViewSpec.transform')
   TransformList get transform native "SVGViewSpec_transform_Getter";
 
-
-  /** @domName SVGViewSpec.transformString */
+  @DocsEditable
+  @DomName('SVGViewSpec.transformString')
   String get transformString native "SVGViewSpec_transformString_Getter";
 
-
-  /** @domName SVGViewSpec.viewBox */
+  @DocsEditable
+  @DomName('SVGViewSpec.viewBox')
   AnimatedRect get viewBox native "SVGViewSpec_viewBox_Getter";
 
-
-  /** @domName SVGViewSpec.viewBoxString */
+  @DocsEditable
+  @DomName('SVGViewSpec.viewBoxString')
   String get viewBoxString native "SVGViewSpec_viewBoxString_Getter";
 
-
-  /** @domName SVGViewSpec.viewTarget */
+  @DocsEditable
+  @DomName('SVGViewSpec.viewTarget')
   SvgElement get viewTarget native "SVGViewSpec_viewTarget_Getter";
 
-
-  /** @domName SVGViewSpec.viewTargetString */
+  @DocsEditable
+  @DomName('SVGViewSpec.viewTargetString')
   String get viewTargetString native "SVGViewSpec_viewTargetString_Getter";
 
-
-  /** @domName SVGViewSpec.zoomAndPan */
+  @DocsEditable
+  @DomName('SVGViewSpec.zoomAndPan')
   int get zoomAndPan native "SVGViewSpec_zoomAndPan_Getter";
 
-
-  /** @domName SVGViewSpec.zoomAndPan */
+  @DocsEditable
+  @DomName('SVGViewSpec.zoomAndPan')
   void set zoomAndPan(int value) native "SVGViewSpec_zoomAndPan_Setter";
 
 }
@@ -8301,7 +8552,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGZoomAndPan
+@DocsEditable
+@DomName('SVGZoomAndPan')
 class ZoomAndPan extends NativeFieldWrapperClass1 {
   ZoomAndPan.internal();
 
@@ -8311,12 +8563,12 @@
 
   static const int SVG_ZOOMANDPAN_UNKNOWN = 0;
 
-
-  /** @domName SVGZoomAndPan.zoomAndPan */
+  @DocsEditable
+  @DomName('SVGZoomAndPan.zoomAndPan')
   int get zoomAndPan native "SVGZoomAndPan_zoomAndPan_Getter";
 
-
-  /** @domName SVGZoomAndPan.zoomAndPan */
+  @DocsEditable
+  @DomName('SVGZoomAndPan.zoomAndPan')
   void set zoomAndPan(int value) native "SVGZoomAndPan_zoomAndPan_Setter";
 
 }
@@ -8327,28 +8579,29 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGZoomEvent
+@DocsEditable
+@DomName('SVGZoomEvent')
 class ZoomEvent extends UIEvent {
   ZoomEvent.internal() : super.internal();
 
-
-  /** @domName SVGZoomEvent.newScale */
+  @DocsEditable
+  @DomName('SVGZoomEvent.newScale')
   num get newScale native "SVGZoomEvent_newScale_Getter";
 
-
-  /** @domName SVGZoomEvent.newTranslate */
+  @DocsEditable
+  @DomName('SVGZoomEvent.newTranslate')
   Point get newTranslate native "SVGZoomEvent_newTranslate_Getter";
 
-
-  /** @domName SVGZoomEvent.previousScale */
+  @DocsEditable
+  @DomName('SVGZoomEvent.previousScale')
   num get previousScale native "SVGZoomEvent_previousScale_Getter";
 
-
-  /** @domName SVGZoomEvent.previousTranslate */
+  @DocsEditable
+  @DomName('SVGZoomEvent.previousTranslate')
   Point get previousTranslate native "SVGZoomEvent_previousTranslate_Getter";
 
-
-  /** @domName SVGZoomEvent.zoomRectScreen */
+  @DocsEditable
+  @DomName('SVGZoomEvent.zoomRectScreen')
   Rect get zoomRectScreen native "SVGZoomEvent_zoomRectScreen_Getter";
 
 }
@@ -8359,12 +8612,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGElementInstanceList
+@DocsEditable
+@DomName('SVGElementInstanceList')
 class _ElementInstanceList extends NativeFieldWrapperClass1 implements List<ElementInstance> {
   _ElementInstanceList.internal();
 
-
-  /** @domName SVGElementInstanceList.length */
+  @DocsEditable
+  @DomName('SVGElementInstanceList.length')
   int get length native "SVGElementInstanceList_length_Getter";
 
   ElementInstance operator[](int index) native "SVGElementInstanceList_item_Callback";
@@ -8385,50 +8639,50 @@
   }
 
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, ElementInstance)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
-  bool contains(ElementInstance element) => Collections.contains(this, element);
+  bool contains(ElementInstance element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(ElementInstance element)) => Collections.forEach(this, f);
+  void forEach(void f(ElementInstance element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f(ElementInstance element)) => new MappedList<ElementInstance, dynamic>(this, f);
+  List mappedBy(f(ElementInstance element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<ElementInstance> where(bool f(ElementInstance element)) => new WhereIterable<ElementInstance>(this, f);
+  Iterable<ElementInstance> where(bool f(ElementInstance element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f(ElementInstance element)) => Collections.every(this, f);
+  bool every(bool f(ElementInstance element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(ElementInstance element)) => Collections.any(this, f);
+  bool any(bool f(ElementInstance element)) => IterableMixinWorkaround.any(this, f);
 
   List<ElementInstance> toList() => new List<ElementInstance>.from(this);
   Set<ElementInstance> toSet() => new Set<ElementInstance>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<ElementInstance> take(int n) => new ListView<ElementInstance>(this, 0, n);
+  List<ElementInstance> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<ElementInstance> takeWhile(bool test(ElementInstance value)) {
-    return new TakeWhileIterable<ElementInstance>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<ElementInstance> skip(int n) => new ListView<ElementInstance>(this, n, null);
+  List<ElementInstance> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<ElementInstance> skipWhile(bool test(ElementInstance value)) {
-    return new SkipWhileIterable<ElementInstance>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   ElementInstance firstMatching(bool test(ElementInstance value), { ElementInstance orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   ElementInstance lastMatching(bool test(ElementInstance value), {ElementInstance orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   ElementInstance singleMatching(bool test(ElementInstance value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   ElementInstance elementAt(int index) {
@@ -8486,16 +8740,36 @@
     throw new StateError("More than one element");
   }
 
-  ElementInstance min([int compare(ElementInstance a, ElementInstance b)]) => Collections.min(this, compare);
+  ElementInstance min([int compare(ElementInstance a, ElementInstance b)]) => IterableMixinWorkaround.min(this, compare);
 
-  ElementInstance max([int compare(ElementInstance a, ElementInstance b)]) => Collections.max(this, compare);
+  ElementInstance max([int compare(ElementInstance a, ElementInstance b)]) => IterableMixinWorkaround.max(this, compare);
 
   ElementInstance removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   ElementInstance removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test(ElementInstance element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test(ElementInstance element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<ElementInstance> from, [int startFrom]) {
@@ -8515,8 +8789,8 @@
 
   // -- end List<ElementInstance> mixins.
 
-
-  /** @domName SVGElementInstanceList.item */
+  @DocsEditable
+  @DomName('SVGElementInstanceList.item')
   ElementInstance item(int index) native "SVGElementInstanceList_item_Callback";
 
 }
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index b016061..e684d70 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -2,6 +2,7 @@
 
 import 'dart:async';
 import 'dart:html';
+import 'dart:html_common';
 // DO NOT EDIT
 // Auto-generated dart:audio library.
 
@@ -13,31 +14,33 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AnalyserNode; @docsEditable true
+
+@DocsEditable
+@DomName('AnalyserNode')
 class AnalyserNode extends AudioNode native "*AnalyserNode" {
 
-  /// @domName AnalyserNode.fftSize; @docsEditable true
+  @DocsEditable @DomName('AnalyserNode.fftSize')
   int fftSize;
 
-  /// @domName AnalyserNode.frequencyBinCount; @docsEditable true
+  @DocsEditable @DomName('AnalyserNode.frequencyBinCount')
   final int frequencyBinCount;
 
-  /// @domName AnalyserNode.maxDecibels; @docsEditable true
+  @DocsEditable @DomName('AnalyserNode.maxDecibels')
   num maxDecibels;
 
-  /// @domName AnalyserNode.minDecibels; @docsEditable true
+  @DocsEditable @DomName('AnalyserNode.minDecibels')
   num minDecibels;
 
-  /// @domName AnalyserNode.smoothingTimeConstant; @docsEditable true
+  @DocsEditable @DomName('AnalyserNode.smoothingTimeConstant')
   num smoothingTimeConstant;
 
-  /// @domName AnalyserNode.getByteFrequencyData; @docsEditable true
+  @DocsEditable @DomName('AnalyserNode.getByteFrequencyData')
   void getByteFrequencyData(Uint8Array array) native;
 
-  /// @domName AnalyserNode.getByteTimeDomainData; @docsEditable true
+  @DocsEditable @DomName('AnalyserNode.getByteTimeDomainData')
   void getByteTimeDomainData(Uint8Array array) native;
 
-  /// @domName AnalyserNode.getFloatFrequencyData; @docsEditable true
+  @DocsEditable @DomName('AnalyserNode.getFloatFrequencyData')
   void getFloatFrequencyData(Float32Array array) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -45,25 +48,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioBuffer; @docsEditable true
+
+@DocsEditable
+@DomName('AudioBuffer')
 class AudioBuffer native "*AudioBuffer" {
 
-  /// @domName AudioBuffer.duration; @docsEditable true
+  @DocsEditable @DomName('AudioBuffer.duration')
   final num duration;
 
-  /// @domName AudioBuffer.gain; @docsEditable true
+  @DocsEditable @DomName('AudioBuffer.gain')
   num gain;
 
-  /// @domName AudioBuffer.length; @docsEditable true
+  @DocsEditable @DomName('AudioBuffer.length')
   final int length;
 
-  /// @domName AudioBuffer.numberOfChannels; @docsEditable true
+  @DocsEditable @DomName('AudioBuffer.numberOfChannels')
   final int numberOfChannels;
 
-  /// @domName AudioBuffer.sampleRate; @docsEditable true
+  @DocsEditable @DomName('AudioBuffer.sampleRate')
   final num sampleRate;
 
-  /// @domName AudioBuffer.getChannelData; @docsEditable true
+  @DocsEditable @DomName('AudioBuffer.getChannelData')
   Float32Array getChannelData(int channelIndex) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -79,7 +84,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioBufferSourceNode
+@DocsEditable
+@DomName('AudioBufferSourceNode')
 class AudioBufferSourceNode extends AudioSourceNode native "*AudioBufferSourceNode" {
 
   // TODO(efortuna): Remove these methods when Chrome stable also uses start
@@ -120,25 +126,25 @@
 
   static const int UNSCHEDULED_STATE = 0;
 
-  /// @domName AudioBufferSourceNode.buffer; @docsEditable true
+  @DocsEditable @DomName('AudioBufferSourceNode.buffer')
   AudioBuffer buffer;
 
-  /// @domName AudioBufferSourceNode.gain; @docsEditable true
+  @DocsEditable @DomName('AudioBufferSourceNode.gain')
   final AudioGain gain;
 
-  /// @domName AudioBufferSourceNode.loop; @docsEditable true
+  @DocsEditable @DomName('AudioBufferSourceNode.loop')
   bool loop;
 
-  /// @domName AudioBufferSourceNode.loopEnd; @docsEditable true
+  @DocsEditable @DomName('AudioBufferSourceNode.loopEnd')
   num loopEnd;
 
-  /// @domName AudioBufferSourceNode.loopStart; @docsEditable true
+  @DocsEditable @DomName('AudioBufferSourceNode.loopStart')
   num loopStart;
 
-  /// @domName AudioBufferSourceNode.playbackRate; @docsEditable true
+  @DocsEditable @DomName('AudioBufferSourceNode.playbackRate')
   final AudioParam playbackRate;
 
-  /// @domName AudioBufferSourceNode.playbackState; @docsEditable true
+  @DocsEditable @DomName('AudioBufferSourceNode.playbackState')
   final int playbackState;
 
 }
@@ -147,85 +153,87 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioContext
+@DocsEditable
+@DomName('AudioContext')
 class AudioContext extends EventTarget native "*AudioContext" {
 
   static const EventStreamProvider<Event> completeEvent = const EventStreamProvider<Event>('complete');
 
-  ///@docsEditable true
+  @DocsEditable
   factory AudioContext() => AudioContext._create();
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   AudioContextEvents get on =>
     new AudioContextEvents(this);
 
-  /// @domName AudioContext.activeSourceCount; @docsEditable true
+  @DocsEditable @DomName('AudioContext.activeSourceCount')
   final int activeSourceCount;
 
-  /// @domName AudioContext.currentTime; @docsEditable true
+  @DocsEditable @DomName('AudioContext.currentTime')
   final num currentTime;
 
-  /// @domName AudioContext.destination; @docsEditable true
+  @DocsEditable @DomName('AudioContext.destination')
   final AudioDestinationNode destination;
 
-  /// @domName AudioContext.listener; @docsEditable true
+  @DocsEditable @DomName('AudioContext.listener')
   final AudioListener listener;
 
-  /// @domName AudioContext.sampleRate; @docsEditable true
+  @DocsEditable @DomName('AudioContext.sampleRate')
   final num sampleRate;
 
-  /// @domName AudioContext.createAnalyser; @docsEditable true
+  @DocsEditable @DomName('AudioContext.createAnalyser')
   AnalyserNode createAnalyser() native;
 
-  /// @domName AudioContext.createBiquadFilter; @docsEditable true
+  @DocsEditable @DomName('AudioContext.createBiquadFilter')
   BiquadFilterNode createBiquadFilter() native;
 
-  /// @domName AudioContext.createBuffer; @docsEditable true
+  @DocsEditable @DomName('AudioContext.createBuffer')
   AudioBuffer createBuffer(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, [num sampleRate]) native;
 
-  /// @domName AudioContext.createBufferSource; @docsEditable true
+  @DocsEditable @DomName('AudioContext.createBufferSource')
   AudioBufferSourceNode createBufferSource() native;
 
-  /// @domName AudioContext.createChannelMerger; @docsEditable true
+  @DocsEditable @DomName('AudioContext.createChannelMerger')
   ChannelMergerNode createChannelMerger([int numberOfInputs]) native;
 
-  /// @domName AudioContext.createChannelSplitter; @docsEditable true
+  @DocsEditable @DomName('AudioContext.createChannelSplitter')
   ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) native;
 
-  /// @domName AudioContext.createConvolver; @docsEditable true
+  @DocsEditable @DomName('AudioContext.createConvolver')
   ConvolverNode createConvolver() native;
 
-  /// @domName AudioContext.createDelay; @docsEditable true
+  @DocsEditable @DomName('AudioContext.createDelay')
   DelayNode createDelay([num maxDelayTime]) native;
 
-  /// @domName AudioContext.createDynamicsCompressor; @docsEditable true
+  @DocsEditable @DomName('AudioContext.createDynamicsCompressor')
   DynamicsCompressorNode createDynamicsCompressor() native;
 
-  /// @domName AudioContext.createMediaElementSource; @docsEditable true
+  @DocsEditable @DomName('AudioContext.createMediaElementSource')
   MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) native;
 
-  /// @domName AudioContext.createMediaStreamDestination; @docsEditable true
+  @DocsEditable @DomName('AudioContext.createMediaStreamDestination')
   MediaStreamAudioDestinationNode createMediaStreamDestination() native;
 
-  /// @domName AudioContext.createMediaStreamSource; @docsEditable true
+  @DocsEditable @DomName('AudioContext.createMediaStreamSource')
   MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) native;
 
-  /// @domName AudioContext.createOscillator; @docsEditable true
+  @DocsEditable @DomName('AudioContext.createOscillator')
   OscillatorNode createOscillator() native;
 
-  /// @domName AudioContext.createPanner; @docsEditable true
+  @DocsEditable @DomName('AudioContext.createPanner')
   PannerNode createPanner() native;
 
-  /// @domName AudioContext.createWaveShaper; @docsEditable true
+  @DocsEditable @DomName('AudioContext.createWaveShaper')
   WaveShaperNode createWaveShaper() native;
 
-  /// @domName AudioContext.createWaveTable; @docsEditable true
+  @DocsEditable @DomName('AudioContext.createWaveTable')
   WaveTable createWaveTable(Float32Array real, Float32Array imag) native;
 
-  /// @domName AudioContext.decodeAudioData; @docsEditable true
+  @DocsEditable @DomName('AudioContext.decodeAudioData')
   void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native;
 
-  /// @domName AudioContext.startRendering; @docsEditable true
+  @DocsEditable @DomName('AudioContext.startRendering')
   void startRendering() native;
 
   Stream<Event> get onComplete => completeEvent.forTarget(this);
@@ -258,12 +266,12 @@
   }
 }
 
-/// @docsEditable true
+@DocsEditable
 class AudioContextEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   AudioContextEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get complete => this['complete'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -271,10 +279,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioDestinationNode; @docsEditable true
+
+@DocsEditable
+@DomName('AudioDestinationNode')
 class AudioDestinationNode extends AudioNode native "*AudioDestinationNode" {
 
-  /// @domName AudioDestinationNode.numberOfChannels; @docsEditable true
+  @DocsEditable @DomName('AudioDestinationNode.numberOfChannels')
   final int numberOfChannels;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -282,7 +292,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioGain; @docsEditable true
+
+@DocsEditable
+@DomName('AudioGain')
 class AudioGain extends AudioParam native "*AudioGain" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -290,22 +302,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioListener; @docsEditable true
+
+@DocsEditable
+@DomName('AudioListener')
 class AudioListener native "*AudioListener" {
 
-  /// @domName AudioListener.dopplerFactor; @docsEditable true
+  @DocsEditable @DomName('AudioListener.dopplerFactor')
   num dopplerFactor;
 
-  /// @domName AudioListener.speedOfSound; @docsEditable true
+  @DocsEditable @DomName('AudioListener.speedOfSound')
   num speedOfSound;
 
-  /// @domName AudioListener.setOrientation; @docsEditable true
+  @DocsEditable @DomName('AudioListener.setOrientation')
   void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) native;
 
-  /// @domName AudioListener.setPosition; @docsEditable true
+  @DocsEditable @DomName('AudioListener.setPosition')
   void setPosition(num x, num y, num z) native;
 
-  /// @domName AudioListener.setVelocity; @docsEditable true
+  @DocsEditable @DomName('AudioListener.setVelocity')
   void setVelocity(num x, num y, num z) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -313,22 +327,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioNode; @docsEditable true
+
+@DocsEditable
+@DomName('AudioNode')
 class AudioNode native "*AudioNode" {
 
-  /// @domName AudioNode.context; @docsEditable true
+  @DocsEditable @DomName('AudioNode.context')
   final AudioContext context;
 
-  /// @domName AudioNode.numberOfInputs; @docsEditable true
+  @DocsEditable @DomName('AudioNode.numberOfInputs')
   final int numberOfInputs;
 
-  /// @domName AudioNode.numberOfOutputs; @docsEditable true
+  @DocsEditable @DomName('AudioNode.numberOfOutputs')
   final int numberOfOutputs;
 
-  /// @domName AudioNode.connect; @docsEditable true
+  @DocsEditable @DomName('AudioNode.connect')
   void connect(destination, int output, [int input]) native;
 
-  /// @domName AudioNode.disconnect; @docsEditable true
+  @DocsEditable @DomName('AudioNode.disconnect')
   void disconnect(int output) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -336,43 +352,45 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioParam; @docsEditable true
+
+@DocsEditable
+@DomName('AudioParam')
 class AudioParam native "*AudioParam" {
 
-  /// @domName AudioParam.defaultValue; @docsEditable true
+  @DocsEditable @DomName('AudioParam.defaultValue')
   final num defaultValue;
 
-  /// @domName AudioParam.maxValue; @docsEditable true
+  @DocsEditable @DomName('AudioParam.maxValue')
   final num maxValue;
 
-  /// @domName AudioParam.minValue; @docsEditable true
+  @DocsEditable @DomName('AudioParam.minValue')
   final num minValue;
 
-  /// @domName AudioParam.name; @docsEditable true
+  @DocsEditable @DomName('AudioParam.name')
   final String name;
 
-  /// @domName AudioParam.units; @docsEditable true
+  @DocsEditable @DomName('AudioParam.units')
   final int units;
 
-  /// @domName AudioParam.value; @docsEditable true
+  @DocsEditable @DomName('AudioParam.value')
   num value;
 
-  /// @domName AudioParam.cancelScheduledValues; @docsEditable true
+  @DocsEditable @DomName('AudioParam.cancelScheduledValues')
   void cancelScheduledValues(num startTime) native;
 
-  /// @domName AudioParam.exponentialRampToValueAtTime; @docsEditable true
+  @DocsEditable @DomName('AudioParam.exponentialRampToValueAtTime')
   void exponentialRampToValueAtTime(num value, num time) native;
 
-  /// @domName AudioParam.linearRampToValueAtTime; @docsEditable true
+  @DocsEditable @DomName('AudioParam.linearRampToValueAtTime')
   void linearRampToValueAtTime(num value, num time) native;
 
-  /// @domName AudioParam.setTargetAtTime; @docsEditable true
+  @DocsEditable @DomName('AudioParam.setTargetAtTime')
   void setTargetAtTime(num target, num time, num timeConstant) native;
 
-  /// @domName AudioParam.setValueAtTime; @docsEditable true
+  @DocsEditable @DomName('AudioParam.setValueAtTime')
   void setValueAtTime(num value, num time) native;
 
-  /// @domName AudioParam.setValueCurveAtTime; @docsEditable true
+  @DocsEditable @DomName('AudioParam.setValueCurveAtTime')
   void setValueCurveAtTime(Float32Array values, num time, num duration) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -380,13 +398,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioProcessingEvent; @docsEditable true
+
+@DocsEditable
+@DomName('AudioProcessingEvent')
 class AudioProcessingEvent extends Event native "*AudioProcessingEvent" {
 
-  /// @domName AudioProcessingEvent.inputBuffer; @docsEditable true
+  @DocsEditable @DomName('AudioProcessingEvent.inputBuffer')
   final AudioBuffer inputBuffer;
 
-  /// @domName AudioProcessingEvent.outputBuffer; @docsEditable true
+  @DocsEditable @DomName('AudioProcessingEvent.outputBuffer')
   final AudioBuffer outputBuffer;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -394,7 +414,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioSourceNode; @docsEditable true
+
+@DocsEditable
+@DomName('AudioSourceNode')
 class AudioSourceNode extends AudioNode native "*AudioSourceNode" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -402,7 +424,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName BiquadFilterNode; @docsEditable true
+
+@DocsEditable
+@DomName('BiquadFilterNode')
 class BiquadFilterNode extends AudioNode native "*BiquadFilterNode" {
 
   static const int ALLPASS = 7;
@@ -421,22 +445,22 @@
 
   static const int PEAKING = 5;
 
-  /// @domName BiquadFilterNode.Q; @docsEditable true
+  @DocsEditable @DomName('BiquadFilterNode.Q')
   final AudioParam Q;
 
-  /// @domName BiquadFilterNode.detune; @docsEditable true
+  @DocsEditable @DomName('BiquadFilterNode.detune')
   final AudioParam detune;
 
-  /// @domName BiquadFilterNode.frequency; @docsEditable true
+  @DocsEditable @DomName('BiquadFilterNode.frequency')
   final AudioParam frequency;
 
-  /// @domName BiquadFilterNode.gain; @docsEditable true
+  @DocsEditable @DomName('BiquadFilterNode.gain')
   final AudioParam gain;
 
-  /// @domName BiquadFilterNode.type; @docsEditable true
-  int type;
+  @DocsEditable @DomName('BiquadFilterNode.type')
+  String type;
 
-  /// @domName BiquadFilterNode.getFrequencyResponse; @docsEditable true
+  @DocsEditable @DomName('BiquadFilterNode.getFrequencyResponse')
   void getFrequencyResponse(Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -444,7 +468,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ChannelMergerNode; @docsEditable true
+
+@DocsEditable
+@DomName('ChannelMergerNode')
 class ChannelMergerNode extends AudioNode native "*ChannelMergerNode" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -452,7 +478,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ChannelSplitterNode; @docsEditable true
+
+@DocsEditable
+@DomName('ChannelSplitterNode')
 class ChannelSplitterNode extends AudioNode native "*ChannelSplitterNode" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -460,13 +488,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ConvolverNode; @docsEditable true
+
+@DocsEditable
+@DomName('ConvolverNode')
 class ConvolverNode extends AudioNode native "*ConvolverNode" {
 
-  /// @domName ConvolverNode.buffer; @docsEditable true
+  @DocsEditable @DomName('ConvolverNode.buffer')
   AudioBuffer buffer;
 
-  /// @domName ConvolverNode.normalize; @docsEditable true
+  @DocsEditable @DomName('ConvolverNode.normalize')
   bool normalize;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -474,10 +504,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DelayNode; @docsEditable true
+
+@DocsEditable
+@DomName('DelayNode')
 class DelayNode extends AudioNode native "*DelayNode" {
 
-  /// @domName DelayNode.delayTime; @docsEditable true
+  @DocsEditable @DomName('DelayNode.delayTime')
   final AudioParam delayTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -485,25 +517,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DynamicsCompressorNode; @docsEditable true
+
+@DocsEditable
+@DomName('DynamicsCompressorNode')
 class DynamicsCompressorNode extends AudioNode native "*DynamicsCompressorNode" {
 
-  /// @domName DynamicsCompressorNode.attack; @docsEditable true
+  @DocsEditable @DomName('DynamicsCompressorNode.attack')
   final AudioParam attack;
 
-  /// @domName DynamicsCompressorNode.knee; @docsEditable true
+  @DocsEditable @DomName('DynamicsCompressorNode.knee')
   final AudioParam knee;
 
-  /// @domName DynamicsCompressorNode.ratio; @docsEditable true
+  @DocsEditable @DomName('DynamicsCompressorNode.ratio')
   final AudioParam ratio;
 
-  /// @domName DynamicsCompressorNode.reduction; @docsEditable true
+  @DocsEditable @DomName('DynamicsCompressorNode.reduction')
   final AudioParam reduction;
 
-  /// @domName DynamicsCompressorNode.release; @docsEditable true
+  @DocsEditable @DomName('DynamicsCompressorNode.release')
   final AudioParam release;
 
-  /// @domName DynamicsCompressorNode.threshold; @docsEditable true
+  @DocsEditable @DomName('DynamicsCompressorNode.threshold')
   final AudioParam threshold;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -511,10 +545,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName GainNode; @docsEditable true
+
+@DocsEditable
+@DomName('GainNode')
 class GainNode extends AudioNode native "*GainNode" {
 
-  /// @domName GainNode.gain; @docsEditable true
+  @DocsEditable @DomName('GainNode.gain')
   final AudioGain gain;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -522,10 +558,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaElementAudioSourceNode; @docsEditable true
+
+@DocsEditable
+@DomName('MediaElementAudioSourceNode')
 class MediaElementAudioSourceNode extends AudioSourceNode native "*MediaElementAudioSourceNode" {
 
-  /// @domName MediaElementAudioSourceNode.mediaElement; @docsEditable true
+  @DocsEditable @DomName('MediaElementAudioSourceNode.mediaElement')
   final MediaElement mediaElement;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -533,10 +571,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaStreamAudioDestinationNode; @docsEditable true
+
+@DocsEditable
+@DomName('MediaStreamAudioDestinationNode')
 class MediaStreamAudioDestinationNode extends AudioSourceNode native "*MediaStreamAudioDestinationNode" {
 
-  /// @domName MediaStreamAudioDestinationNode.stream; @docsEditable true
+  @DocsEditable @DomName('MediaStreamAudioDestinationNode.stream')
   final MediaStream stream;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -544,10 +584,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaStreamAudioSourceNode; @docsEditable true
+
+@DocsEditable
+@DomName('MediaStreamAudioSourceNode')
 class MediaStreamAudioSourceNode extends AudioSourceNode native "*MediaStreamAudioSourceNode" {
 
-  /// @domName MediaStreamAudioSourceNode.mediaStream; @docsEditable true
+  @DocsEditable @DomName('MediaStreamAudioSourceNode.mediaStream')
   final MediaStream mediaStream;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -555,10 +597,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OfflineAudioCompletionEvent; @docsEditable true
+
+@DocsEditable
+@DomName('OfflineAudioCompletionEvent')
 class OfflineAudioCompletionEvent extends Event native "*OfflineAudioCompletionEvent" {
 
-  /// @domName OfflineAudioCompletionEvent.renderedBuffer; @docsEditable true
+  @DocsEditable @DomName('OfflineAudioCompletionEvent.renderedBuffer')
   final AudioBuffer renderedBuffer;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -566,10 +610,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OfflineAudioContext; @docsEditable true
+
+@DocsEditable
+@DomName('OfflineAudioContext')
 class OfflineAudioContext extends AudioContext implements EventTarget native "*OfflineAudioContext" {
 
-  ///@docsEditable true
+  @DocsEditable
   factory OfflineAudioContext(int numberOfChannels, int numberOfFrames, num sampleRate) => OfflineAudioContext._create(numberOfChannels, numberOfFrames, sampleRate);
   static OfflineAudioContext _create(int numberOfChannels, int numberOfFrames, num sampleRate) => JS('OfflineAudioContext', 'new OfflineAudioContext(#,#,#)', numberOfChannels, numberOfFrames, sampleRate);
 }
@@ -578,7 +624,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OscillatorNode; @docsEditable true
+
+@DocsEditable
+@DomName('OscillatorNode')
 class OscillatorNode extends AudioSourceNode native "*OscillatorNode" {
 
   static const int CUSTOM = 4;
@@ -599,25 +647,25 @@
 
   static const int UNSCHEDULED_STATE = 0;
 
-  /// @domName OscillatorNode.detune; @docsEditable true
+  @DocsEditable @DomName('OscillatorNode.detune')
   final AudioParam detune;
 
-  /// @domName OscillatorNode.frequency; @docsEditable true
+  @DocsEditable @DomName('OscillatorNode.frequency')
   final AudioParam frequency;
 
-  /// @domName OscillatorNode.playbackState; @docsEditable true
+  @DocsEditable @DomName('OscillatorNode.playbackState')
   final int playbackState;
 
-  /// @domName OscillatorNode.type; @docsEditable true
-  int type;
+  @DocsEditable @DomName('OscillatorNode.type')
+  String type;
 
-  /// @domName OscillatorNode.setWaveTable; @docsEditable true
+  @DocsEditable @DomName('OscillatorNode.setWaveTable')
   void setWaveTable(WaveTable waveTable) native;
 
-  /// @domName OscillatorNode.start; @docsEditable true
+  @DocsEditable @DomName('OscillatorNode.start')
   void start(num when) native;
 
-  /// @domName OscillatorNode.stop; @docsEditable true
+  @DocsEditable @DomName('OscillatorNode.stop')
   void stop(num when) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -625,7 +673,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PannerNode; @docsEditable true
+
+@DocsEditable
+@DomName('PannerNode')
 class PannerNode extends AudioNode native "*PannerNode" {
 
   static const int EQUALPOWER = 0;
@@ -640,37 +690,37 @@
 
   static const int SOUNDFIELD = 2;
 
-  /// @domName PannerNode.coneInnerAngle; @docsEditable true
+  @DocsEditable @DomName('PannerNode.coneInnerAngle')
   num coneInnerAngle;
 
-  /// @domName PannerNode.coneOuterAngle; @docsEditable true
+  @DocsEditable @DomName('PannerNode.coneOuterAngle')
   num coneOuterAngle;
 
-  /// @domName PannerNode.coneOuterGain; @docsEditable true
+  @DocsEditable @DomName('PannerNode.coneOuterGain')
   num coneOuterGain;
 
-  /// @domName PannerNode.distanceModel; @docsEditable true
-  int distanceModel;
+  @DocsEditable @DomName('PannerNode.distanceModel')
+  String distanceModel;
 
-  /// @domName PannerNode.maxDistance; @docsEditable true
+  @DocsEditable @DomName('PannerNode.maxDistance')
   num maxDistance;
 
-  /// @domName PannerNode.panningModel; @docsEditable true
-  int panningModel;
+  @DocsEditable @DomName('PannerNode.panningModel')
+  String panningModel;
 
-  /// @domName PannerNode.refDistance; @docsEditable true
+  @DocsEditable @DomName('PannerNode.refDistance')
   num refDistance;
 
-  /// @domName PannerNode.rolloffFactor; @docsEditable true
+  @DocsEditable @DomName('PannerNode.rolloffFactor')
   num rolloffFactor;
 
-  /// @domName PannerNode.setOrientation; @docsEditable true
+  @DocsEditable @DomName('PannerNode.setOrientation')
   void setOrientation(num x, num y, num z) native;
 
-  /// @domName PannerNode.setPosition; @docsEditable true
+  @DocsEditable @DomName('PannerNode.setPosition')
   void setPosition(num x, num y, num z) native;
 
-  /// @domName PannerNode.setVelocity; @docsEditable true
+  @DocsEditable @DomName('PannerNode.setVelocity')
   void setVelocity(num x, num y, num z) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -678,10 +728,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ScriptProcessorNode; @docsEditable true
+
+@DocsEditable
+@DomName('ScriptProcessorNode')
 class ScriptProcessorNode extends AudioNode implements EventTarget native "*ScriptProcessorNode" {
 
-  /// @domName ScriptProcessorNode.bufferSize; @docsEditable true
+  @DocsEditable @DomName('ScriptProcessorNode.bufferSize')
   final int bufferSize;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -689,10 +741,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WaveShaperNode; @docsEditable true
+
+@DocsEditable
+@DomName('WaveShaperNode')
 class WaveShaperNode extends AudioNode native "*WaveShaperNode" {
 
-  /// @domName WaveShaperNode.curve; @docsEditable true
+  @DocsEditable @DomName('WaveShaperNode.curve')
   Float32Array curve;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -700,6 +754,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WaveTable; @docsEditable true
+
+@DocsEditable
+@DomName('WaveTable')
 class WaveTable native "*WaveTable" {
 }
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index 22e287f..c37f538 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -16,56 +16,57 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName AnalyserNode
+@DocsEditable
+@DomName('AnalyserNode')
 class AnalyserNode extends AudioNode {
   AnalyserNode.internal() : super.internal();
 
-
-  /** @domName AnalyserNode.fftSize */
+  @DocsEditable
+  @DomName('AnalyserNode.fftSize')
   int get fftSize native "AnalyserNode_fftSize_Getter";
 
-
-  /** @domName AnalyserNode.fftSize */
+  @DocsEditable
+  @DomName('AnalyserNode.fftSize')
   void set fftSize(int value) native "AnalyserNode_fftSize_Setter";
 
-
-  /** @domName AnalyserNode.frequencyBinCount */
+  @DocsEditable
+  @DomName('AnalyserNode.frequencyBinCount')
   int get frequencyBinCount native "AnalyserNode_frequencyBinCount_Getter";
 
-
-  /** @domName AnalyserNode.maxDecibels */
+  @DocsEditable
+  @DomName('AnalyserNode.maxDecibels')
   num get maxDecibels native "AnalyserNode_maxDecibels_Getter";
 
-
-  /** @domName AnalyserNode.maxDecibels */
+  @DocsEditable
+  @DomName('AnalyserNode.maxDecibels')
   void set maxDecibels(num value) native "AnalyserNode_maxDecibels_Setter";
 
-
-  /** @domName AnalyserNode.minDecibels */
+  @DocsEditable
+  @DomName('AnalyserNode.minDecibels')
   num get minDecibels native "AnalyserNode_minDecibels_Getter";
 
-
-  /** @domName AnalyserNode.minDecibels */
+  @DocsEditable
+  @DomName('AnalyserNode.minDecibels')
   void set minDecibels(num value) native "AnalyserNode_minDecibels_Setter";
 
-
-  /** @domName AnalyserNode.smoothingTimeConstant */
+  @DocsEditable
+  @DomName('AnalyserNode.smoothingTimeConstant')
   num get smoothingTimeConstant native "AnalyserNode_smoothingTimeConstant_Getter";
 
-
-  /** @domName AnalyserNode.smoothingTimeConstant */
+  @DocsEditable
+  @DomName('AnalyserNode.smoothingTimeConstant')
   void set smoothingTimeConstant(num value) native "AnalyserNode_smoothingTimeConstant_Setter";
 
-
-  /** @domName AnalyserNode.getByteFrequencyData */
+  @DocsEditable
+  @DomName('AnalyserNode.getByteFrequencyData')
   void getByteFrequencyData(Uint8Array array) native "AnalyserNode_getByteFrequencyData_Callback";
 
-
-  /** @domName AnalyserNode.getByteTimeDomainData */
+  @DocsEditable
+  @DomName('AnalyserNode.getByteTimeDomainData')
   void getByteTimeDomainData(Uint8Array array) native "AnalyserNode_getByteTimeDomainData_Callback";
 
-
-  /** @domName AnalyserNode.getFloatFrequencyData */
+  @DocsEditable
+  @DomName('AnalyserNode.getFloatFrequencyData')
   void getFloatFrequencyData(Float32Array array) native "AnalyserNode_getFloatFrequencyData_Callback";
 
 }
@@ -76,36 +77,37 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName AudioBuffer
+@DocsEditable
+@DomName('AudioBuffer')
 class AudioBuffer extends NativeFieldWrapperClass1 {
   AudioBuffer.internal();
 
-
-  /** @domName AudioBuffer.duration */
+  @DocsEditable
+  @DomName('AudioBuffer.duration')
   num get duration native "AudioBuffer_duration_Getter";
 
-
-  /** @domName AudioBuffer.gain */
+  @DocsEditable
+  @DomName('AudioBuffer.gain')
   num get gain native "AudioBuffer_gain_Getter";
 
-
-  /** @domName AudioBuffer.gain */
+  @DocsEditable
+  @DomName('AudioBuffer.gain')
   void set gain(num value) native "AudioBuffer_gain_Setter";
 
-
-  /** @domName AudioBuffer.length */
+  @DocsEditable
+  @DomName('AudioBuffer.length')
   int get length native "AudioBuffer_length_Getter";
 
-
-  /** @domName AudioBuffer.numberOfChannels */
+  @DocsEditable
+  @DomName('AudioBuffer.numberOfChannels')
   int get numberOfChannels native "AudioBuffer_numberOfChannels_Getter";
 
-
-  /** @domName AudioBuffer.sampleRate */
+  @DocsEditable
+  @DomName('AudioBuffer.sampleRate')
   num get sampleRate native "AudioBuffer_sampleRate_Getter";
 
-
-  /** @domName AudioBuffer.getChannelData */
+  @DocsEditable
+  @DomName('AudioBuffer.getChannelData')
   Float32Array getChannelData(int channelIndex) native "AudioBuffer_getChannelData_Callback";
 
 }
@@ -124,7 +126,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName AudioBufferSourceNode
+@DocsEditable
+@DomName('AudioBufferSourceNode')
 class AudioBufferSourceNode extends AudioSourceNode {
   AudioBufferSourceNode.internal() : super.internal();
 
@@ -136,51 +139,51 @@
 
   static const int UNSCHEDULED_STATE = 0;
 
-
-  /** @domName AudioBufferSourceNode.buffer */
+  @DocsEditable
+  @DomName('AudioBufferSourceNode.buffer')
   AudioBuffer get buffer native "AudioBufferSourceNode_buffer_Getter";
 
-
-  /** @domName AudioBufferSourceNode.buffer */
+  @DocsEditable
+  @DomName('AudioBufferSourceNode.buffer')
   void set buffer(AudioBuffer value) native "AudioBufferSourceNode_buffer_Setter";
 
-
-  /** @domName AudioBufferSourceNode.gain */
+  @DocsEditable
+  @DomName('AudioBufferSourceNode.gain')
   AudioGain get gain native "AudioBufferSourceNode_gain_Getter";
 
-
-  /** @domName AudioBufferSourceNode.loop */
+  @DocsEditable
+  @DomName('AudioBufferSourceNode.loop')
   bool get loop native "AudioBufferSourceNode_loop_Getter";
 
-
-  /** @domName AudioBufferSourceNode.loop */
+  @DocsEditable
+  @DomName('AudioBufferSourceNode.loop')
   void set loop(bool value) native "AudioBufferSourceNode_loop_Setter";
 
-
-  /** @domName AudioBufferSourceNode.loopEnd */
+  @DocsEditable
+  @DomName('AudioBufferSourceNode.loopEnd')
   num get loopEnd native "AudioBufferSourceNode_loopEnd_Getter";
 
-
-  /** @domName AudioBufferSourceNode.loopEnd */
+  @DocsEditable
+  @DomName('AudioBufferSourceNode.loopEnd')
   void set loopEnd(num value) native "AudioBufferSourceNode_loopEnd_Setter";
 
-
-  /** @domName AudioBufferSourceNode.loopStart */
+  @DocsEditable
+  @DomName('AudioBufferSourceNode.loopStart')
   num get loopStart native "AudioBufferSourceNode_loopStart_Getter";
 
-
-  /** @domName AudioBufferSourceNode.loopStart */
+  @DocsEditable
+  @DomName('AudioBufferSourceNode.loopStart')
   void set loopStart(num value) native "AudioBufferSourceNode_loopStart_Setter";
 
-
-  /** @domName AudioBufferSourceNode.playbackRate */
+  @DocsEditable
+  @DomName('AudioBufferSourceNode.playbackRate')
   AudioParam get playbackRate native "AudioBufferSourceNode_playbackRate_Getter";
 
-
-  /** @domName AudioBufferSourceNode.playbackState */
+  @DocsEditable
+  @DomName('AudioBufferSourceNode.playbackState')
   int get playbackState native "AudioBufferSourceNode_playbackState_Getter";
 
-  void start(/*double*/ when, [/*double*/ grainOffset, /*double*/ grainDuration]) {
+  void start(num when, [num grainOffset, num grainDuration]) {
     if ((when is num || when == null) && !?grainOffset && !?grainDuration) {
       _start_1(when);
       return;
@@ -196,20 +199,20 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName AudioBufferSourceNode.start_1 */
+  @DocsEditable
+  @DomName('AudioBufferSourceNode.start_1')
   void _start_1(when) native "AudioBufferSourceNode_start_1_Callback";
 
-
-  /** @domName AudioBufferSourceNode.start_2 */
+  @DocsEditable
+  @DomName('AudioBufferSourceNode.start_2')
   void _start_2(when, grainOffset) native "AudioBufferSourceNode_start_2_Callback";
 
-
-  /** @domName AudioBufferSourceNode.start_3 */
+  @DocsEditable
+  @DomName('AudioBufferSourceNode.start_3')
   void _start_3(when, grainOffset, grainDuration) native "AudioBufferSourceNode_start_3_Callback";
 
-
-  /** @domName AudioBufferSourceNode.stop */
+  @DocsEditable
+  @DomName('AudioBufferSourceNode.stop')
   void stop(num when) native "AudioBufferSourceNode_stop_Callback";
 
 }
@@ -218,49 +221,51 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioContext
+@DocsEditable
+@DomName('AudioContext')
 class AudioContext extends EventTarget {
   AudioContext.internal() : super.internal();
 
   static const EventStreamProvider<Event> completeEvent = const EventStreamProvider<Event>('complete');
 
-  ///@docsEditable true
+  @DocsEditable
   factory AudioContext() => AudioContext._create();
   static AudioContext _create() native "AudioContext_constructor_Callback";
 
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  @DocsEditable
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   AudioContextEvents get on =>
     new AudioContextEvents(this);
 
-
-  /** @domName AudioContext.activeSourceCount */
+  @DocsEditable
+  @DomName('AudioContext.activeSourceCount')
   int get activeSourceCount native "AudioContext_activeSourceCount_Getter";
 
-
-  /** @domName AudioContext.currentTime */
+  @DocsEditable
+  @DomName('AudioContext.currentTime')
   num get currentTime native "AudioContext_currentTime_Getter";
 
-
-  /** @domName AudioContext.destination */
+  @DocsEditable
+  @DomName('AudioContext.destination')
   AudioDestinationNode get destination native "AudioContext_destination_Getter";
 
-
-  /** @domName AudioContext.listener */
+  @DocsEditable
+  @DomName('AudioContext.listener')
   AudioListener get listener native "AudioContext_listener_Getter";
 
-
-  /** @domName AudioContext.sampleRate */
+  @DocsEditable
+  @DomName('AudioContext.sampleRate')
   num get sampleRate native "AudioContext_sampleRate_Getter";
 
-
-  /** @domName AudioContext.createAnalyser */
+  @DocsEditable
+  @DomName('AudioContext.createAnalyser')
   AnalyserNode createAnalyser() native "AudioContext_createAnalyser_Callback";
 
-
-  /** @domName AudioContext.createBiquadFilter */
+  @DocsEditable
+  @DomName('AudioContext.createBiquadFilter')
   BiquadFilterNode createBiquadFilter() native "AudioContext_createBiquadFilter_Callback";
 
-  AudioBuffer createBuffer(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, [/*float*/ sampleRate]) {
+  AudioBuffer createBuffer(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, [num sampleRate]) {
     if ((buffer_OR_numberOfChannels is int || buffer_OR_numberOfChannels == null) && (mixToMono_OR_numberOfFrames is int || mixToMono_OR_numberOfFrames == null) && (sampleRate is num || sampleRate == null)) {
       return _createBuffer_1(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, sampleRate);
     }
@@ -270,96 +275,96 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName AudioContext.createBuffer_1 */
+  @DocsEditable
+  @DomName('AudioContext.createBuffer_1')
   AudioBuffer _createBuffer_1(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, sampleRate) native "AudioContext_createBuffer_1_Callback";
 
-
-  /** @domName AudioContext.createBuffer_2 */
+  @DocsEditable
+  @DomName('AudioContext.createBuffer_2')
   AudioBuffer _createBuffer_2(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames) native "AudioContext_createBuffer_2_Callback";
 
-
-  /** @domName AudioContext.createBufferSource */
+  @DocsEditable
+  @DomName('AudioContext.createBufferSource')
   AudioBufferSourceNode createBufferSource() native "AudioContext_createBufferSource_Callback";
 
-  ChannelMergerNode createChannelMerger([/*unsigned long*/ numberOfInputs]) {
+  ChannelMergerNode createChannelMerger([int numberOfInputs]) {
     if (?numberOfInputs) {
       return _createChannelMerger_1(numberOfInputs);
     }
     return _createChannelMerger_2();
   }
 
-
-  /** @domName AudioContext.createChannelMerger_1 */
+  @DocsEditable
+  @DomName('AudioContext.createChannelMerger_1')
   ChannelMergerNode _createChannelMerger_1(numberOfInputs) native "AudioContext_createChannelMerger_1_Callback";
 
-
-  /** @domName AudioContext.createChannelMerger_2 */
+  @DocsEditable
+  @DomName('AudioContext.createChannelMerger_2')
   ChannelMergerNode _createChannelMerger_2() native "AudioContext_createChannelMerger_2_Callback";
 
-  ChannelSplitterNode createChannelSplitter([/*unsigned long*/ numberOfOutputs]) {
+  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) {
     if (?numberOfOutputs) {
       return _createChannelSplitter_1(numberOfOutputs);
     }
     return _createChannelSplitter_2();
   }
 
-
-  /** @domName AudioContext.createChannelSplitter_1 */
+  @DocsEditable
+  @DomName('AudioContext.createChannelSplitter_1')
   ChannelSplitterNode _createChannelSplitter_1(numberOfOutputs) native "AudioContext_createChannelSplitter_1_Callback";
 
-
-  /** @domName AudioContext.createChannelSplitter_2 */
+  @DocsEditable
+  @DomName('AudioContext.createChannelSplitter_2')
   ChannelSplitterNode _createChannelSplitter_2() native "AudioContext_createChannelSplitter_2_Callback";
 
-
-  /** @domName AudioContext.createConvolver */
+  @DocsEditable
+  @DomName('AudioContext.createConvolver')
   ConvolverNode createConvolver() native "AudioContext_createConvolver_Callback";
 
-  DelayNode createDelay([/*double*/ maxDelayTime]) {
+  DelayNode createDelay([num maxDelayTime]) {
     if (?maxDelayTime) {
       return _createDelay_1(maxDelayTime);
     }
     return _createDelay_2();
   }
 
-
-  /** @domName AudioContext.createDelay_1 */
+  @DocsEditable
+  @DomName('AudioContext.createDelay_1')
   DelayNode _createDelay_1(maxDelayTime) native "AudioContext_createDelay_1_Callback";
 
-
-  /** @domName AudioContext.createDelay_2 */
+  @DocsEditable
+  @DomName('AudioContext.createDelay_2')
   DelayNode _createDelay_2() native "AudioContext_createDelay_2_Callback";
 
-
-  /** @domName AudioContext.createDynamicsCompressor */
+  @DocsEditable
+  @DomName('AudioContext.createDynamicsCompressor')
   DynamicsCompressorNode createDynamicsCompressor() native "AudioContext_createDynamicsCompressor_Callback";
 
-
-  /** @domName AudioContext.createGain */
+  @DocsEditable
+  @DomName('AudioContext.createGain')
   GainNode createGain() native "AudioContext_createGain_Callback";
 
-
-  /** @domName AudioContext.createMediaElementSource */
+  @DocsEditable
+  @DomName('AudioContext.createMediaElementSource')
   MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) native "AudioContext_createMediaElementSource_Callback";
 
-
-  /** @domName AudioContext.createMediaStreamDestination */
+  @DocsEditable
+  @DomName('AudioContext.createMediaStreamDestination')
   MediaStreamAudioDestinationNode createMediaStreamDestination() native "AudioContext_createMediaStreamDestination_Callback";
 
-
-  /** @domName AudioContext.createMediaStreamSource */
+  @DocsEditable
+  @DomName('AudioContext.createMediaStreamSource')
   MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) native "AudioContext_createMediaStreamSource_Callback";
 
-
-  /** @domName AudioContext.createOscillator */
+  @DocsEditable
+  @DomName('AudioContext.createOscillator')
   OscillatorNode createOscillator() native "AudioContext_createOscillator_Callback";
 
-
-  /** @domName AudioContext.createPanner */
+  @DocsEditable
+  @DomName('AudioContext.createPanner')
   PannerNode createPanner() native "AudioContext_createPanner_Callback";
 
-  ScriptProcessorNode createScriptProcessor(/*unsigned long*/ bufferSize, [/*unsigned long*/ numberOfInputChannels, /*unsigned long*/ numberOfOutputChannels]) {
+  ScriptProcessorNode createScriptProcessor(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]) {
     if (?numberOfOutputChannels) {
       return _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels);
     }
@@ -369,44 +374,44 @@
     return _createScriptProcessor_3(bufferSize);
   }
 
-
-  /** @domName AudioContext.createScriptProcessor_1 */
+  @DocsEditable
+  @DomName('AudioContext.createScriptProcessor_1')
   ScriptProcessorNode _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext_createScriptProcessor_1_Callback";
 
-
-  /** @domName AudioContext.createScriptProcessor_2 */
+  @DocsEditable
+  @DomName('AudioContext.createScriptProcessor_2')
   ScriptProcessorNode _createScriptProcessor_2(bufferSize, numberOfInputChannels) native "AudioContext_createScriptProcessor_2_Callback";
 
-
-  /** @domName AudioContext.createScriptProcessor_3 */
+  @DocsEditable
+  @DomName('AudioContext.createScriptProcessor_3')
   ScriptProcessorNode _createScriptProcessor_3(bufferSize) native "AudioContext_createScriptProcessor_3_Callback";
 
-
-  /** @domName AudioContext.createWaveShaper */
+  @DocsEditable
+  @DomName('AudioContext.createWaveShaper')
   WaveShaperNode createWaveShaper() native "AudioContext_createWaveShaper_Callback";
 
-
-  /** @domName AudioContext.createWaveTable */
+  @DocsEditable
+  @DomName('AudioContext.createWaveTable')
   WaveTable createWaveTable(Float32Array real, Float32Array imag) native "AudioContext_createWaveTable_Callback";
 
-
-  /** @domName AudioContext.decodeAudioData */
+  @DocsEditable
+  @DomName('AudioContext.decodeAudioData')
   void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native "AudioContext_decodeAudioData_Callback";
 
-
-  /** @domName AudioContext.startRendering */
+  @DocsEditable
+  @DomName('AudioContext.startRendering')
   void startRendering() native "AudioContext_startRendering_Callback";
 
   Stream<Event> get onComplete => completeEvent.forTarget(this);
 
 }
 
-/// @docsEditable true
+@DocsEditable
 class AudioContextEvents extends Events {
-  /// @docsEditable true
+  @DocsEditable
   AudioContextEvents(EventTarget _ptr) : super(_ptr);
 
-  /// @docsEditable true
+  @DocsEditable
   EventListenerList get complete => this['complete'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -416,12 +421,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName AudioDestinationNode
+@DocsEditable
+@DomName('AudioDestinationNode')
 class AudioDestinationNode extends AudioNode {
   AudioDestinationNode.internal() : super.internal();
 
-
-  /** @domName AudioDestinationNode.numberOfChannels */
+  @DocsEditable
+  @DomName('AudioDestinationNode.numberOfChannels')
   int get numberOfChannels native "AudioDestinationNode_numberOfChannels_Getter";
 
 }
@@ -432,7 +438,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName AudioGain
+@DocsEditable
+@DomName('AudioGain')
 class AudioGain extends AudioParam {
   AudioGain.internal() : super.internal();
 
@@ -444,36 +451,37 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName AudioListener
+@DocsEditable
+@DomName('AudioListener')
 class AudioListener extends NativeFieldWrapperClass1 {
   AudioListener.internal();
 
-
-  /** @domName AudioListener.dopplerFactor */
+  @DocsEditable
+  @DomName('AudioListener.dopplerFactor')
   num get dopplerFactor native "AudioListener_dopplerFactor_Getter";
 
-
-  /** @domName AudioListener.dopplerFactor */
+  @DocsEditable
+  @DomName('AudioListener.dopplerFactor')
   void set dopplerFactor(num value) native "AudioListener_dopplerFactor_Setter";
 
-
-  /** @domName AudioListener.speedOfSound */
+  @DocsEditable
+  @DomName('AudioListener.speedOfSound')
   num get speedOfSound native "AudioListener_speedOfSound_Getter";
 
-
-  /** @domName AudioListener.speedOfSound */
+  @DocsEditable
+  @DomName('AudioListener.speedOfSound')
   void set speedOfSound(num value) native "AudioListener_speedOfSound_Setter";
 
-
-  /** @domName AudioListener.setOrientation */
+  @DocsEditable
+  @DomName('AudioListener.setOrientation')
   void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) native "AudioListener_setOrientation_Callback";
 
-
-  /** @domName AudioListener.setPosition */
+  @DocsEditable
+  @DomName('AudioListener.setPosition')
   void setPosition(num x, num y, num z) native "AudioListener_setPosition_Callback";
 
-
-  /** @domName AudioListener.setVelocity */
+  @DocsEditable
+  @DomName('AudioListener.setVelocity')
   void setVelocity(num x, num y, num z) native "AudioListener_setVelocity_Callback";
 
 }
@@ -484,23 +492,24 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName AudioNode
+@DocsEditable
+@DomName('AudioNode')
 class AudioNode extends NativeFieldWrapperClass1 {
   AudioNode.internal();
 
-
-  /** @domName AudioNode.context */
+  @DocsEditable
+  @DomName('AudioNode.context')
   AudioContext get context native "AudioNode_context_Getter";
 
-
-  /** @domName AudioNode.numberOfInputs */
+  @DocsEditable
+  @DomName('AudioNode.numberOfInputs')
   int get numberOfInputs native "AudioNode_numberOfInputs_Getter";
 
-
-  /** @domName AudioNode.numberOfOutputs */
+  @DocsEditable
+  @DomName('AudioNode.numberOfOutputs')
   int get numberOfOutputs native "AudioNode_numberOfOutputs_Getter";
 
-  void connect(destination, /*unsigned long*/ output, [/*unsigned long*/ input]) {
+  void connect(destination, int output, [int input]) {
     if ((destination is AudioNode || destination == null) && (output is int || output == null) && (input is int || input == null)) {
       _connect_1(destination, output, input);
       return;
@@ -512,16 +521,16 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-
-  /** @domName AudioNode.connect_1 */
+  @DocsEditable
+  @DomName('AudioNode.connect_1')
   void _connect_1(destination, output, input) native "AudioNode_connect_1_Callback";
 
-
-  /** @domName AudioNode.connect_2 */
+  @DocsEditable
+  @DomName('AudioNode.connect_2')
   void _connect_2(destination, output) native "AudioNode_connect_2_Callback";
 
-
-  /** @domName AudioNode.disconnect */
+  @DocsEditable
+  @DomName('AudioNode.disconnect')
   void disconnect(int output) native "AudioNode_disconnect_Callback";
 
 }
@@ -532,60 +541,61 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName AudioParam
+@DocsEditable
+@DomName('AudioParam')
 class AudioParam extends NativeFieldWrapperClass1 {
   AudioParam.internal();
 
-
-  /** @domName AudioParam.defaultValue */
+  @DocsEditable
+  @DomName('AudioParam.defaultValue')
   num get defaultValue native "AudioParam_defaultValue_Getter";
 
-
-  /** @domName AudioParam.maxValue */
+  @DocsEditable
+  @DomName('AudioParam.maxValue')
   num get maxValue native "AudioParam_maxValue_Getter";
 
-
-  /** @domName AudioParam.minValue */
+  @DocsEditable
+  @DomName('AudioParam.minValue')
   num get minValue native "AudioParam_minValue_Getter";
 
-
-  /** @domName AudioParam.name */
+  @DocsEditable
+  @DomName('AudioParam.name')
   String get name native "AudioParam_name_Getter";
 
-
-  /** @domName AudioParam.units */
+  @DocsEditable
+  @DomName('AudioParam.units')
   int get units native "AudioParam_units_Getter";
 
-
-  /** @domName AudioParam.value */
+  @DocsEditable
+  @DomName('AudioParam.value')
   num get value native "AudioParam_value_Getter";
 
-
-  /** @domName AudioParam.value */
+  @DocsEditable
+  @DomName('AudioParam.value')
   void set value(num value) native "AudioParam_value_Setter";
 
-
-  /** @domName AudioParam.cancelScheduledValues */
+  @DocsEditable
+  @DomName('AudioParam.cancelScheduledValues')
   void cancelScheduledValues(num startTime) native "AudioParam_cancelScheduledValues_Callback";
 
-
-  /** @domName AudioParam.exponentialRampToValueAtTime */
+  @DocsEditable
+  @DomName('AudioParam.exponentialRampToValueAtTime')
   void exponentialRampToValueAtTime(num value, num time) native "AudioParam_exponentialRampToValueAtTime_Callback";
 
-
-  /** @domName AudioParam.linearRampToValueAtTime */
+  @DocsEditable
+  @DomName('AudioParam.linearRampToValueAtTime')
   void linearRampToValueAtTime(num value, num time) native "AudioParam_linearRampToValueAtTime_Callback";
 
-
-  /** @domName AudioParam.setTargetAtTime */
+  @DocsEditable
+  @DomName('AudioParam.setTargetAtTime')
   void setTargetAtTime(num target, num time, num timeConstant) native "AudioParam_setTargetAtTime_Callback";
 
-
-  /** @domName AudioParam.setValueAtTime */
+  @DocsEditable
+  @DomName('AudioParam.setValueAtTime')
   void setValueAtTime(num value, num time) native "AudioParam_setValueAtTime_Callback";
 
-
-  /** @domName AudioParam.setValueCurveAtTime */
+  @DocsEditable
+  @DomName('AudioParam.setValueCurveAtTime')
   void setValueCurveAtTime(Float32Array values, num time, num duration) native "AudioParam_setValueCurveAtTime_Callback";
 
 }
@@ -596,16 +606,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName AudioProcessingEvent
+@DocsEditable
+@DomName('AudioProcessingEvent')
 class AudioProcessingEvent extends Event {
   AudioProcessingEvent.internal() : super.internal();
 
-
-  /** @domName AudioProcessingEvent.inputBuffer */
+  @DocsEditable
+  @DomName('AudioProcessingEvent.inputBuffer')
   AudioBuffer get inputBuffer native "AudioProcessingEvent_inputBuffer_Getter";
 
-
-  /** @domName AudioProcessingEvent.outputBuffer */
+  @DocsEditable
+  @DomName('AudioProcessingEvent.outputBuffer')
   AudioBuffer get outputBuffer native "AudioProcessingEvent_outputBuffer_Getter";
 
 }
@@ -616,7 +627,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName AudioSourceNode
+@DocsEditable
+@DomName('AudioSourceNode')
 class AudioSourceNode extends AudioNode {
   AudioSourceNode.internal() : super.internal();
 
@@ -628,7 +640,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName BiquadFilterNode
+@DocsEditable
+@DomName('BiquadFilterNode')
 class BiquadFilterNode extends AudioNode {
   BiquadFilterNode.internal() : super.internal();
 
@@ -648,32 +661,32 @@
 
   static const int PEAKING = 5;
 
-
-  /** @domName BiquadFilterNode.Q */
+  @DocsEditable
+  @DomName('BiquadFilterNode.Q')
   AudioParam get Q native "BiquadFilterNode_Q_Getter";
 
-
-  /** @domName BiquadFilterNode.detune */
+  @DocsEditable
+  @DomName('BiquadFilterNode.detune')
   AudioParam get detune native "BiquadFilterNode_detune_Getter";
 
-
-  /** @domName BiquadFilterNode.frequency */
+  @DocsEditable
+  @DomName('BiquadFilterNode.frequency')
   AudioParam get frequency native "BiquadFilterNode_frequency_Getter";
 
-
-  /** @domName BiquadFilterNode.gain */
+  @DocsEditable
+  @DomName('BiquadFilterNode.gain')
   AudioParam get gain native "BiquadFilterNode_gain_Getter";
 
+  @DocsEditable
+  @DomName('BiquadFilterNode.type')
+  String get type native "BiquadFilterNode_type_Getter";
 
-  /** @domName BiquadFilterNode.type */
-  int get type native "BiquadFilterNode_type_Getter";
+  @DocsEditable
+  @DomName('BiquadFilterNode.type')
+  void set type(String value) native "BiquadFilterNode_type_Setter";
 
-
-  /** @domName BiquadFilterNode.type */
-  void set type(int value) native "BiquadFilterNode_type_Setter";
-
-
-  /** @domName BiquadFilterNode.getFrequencyResponse */
+  @DocsEditable
+  @DomName('BiquadFilterNode.getFrequencyResponse')
   void getFrequencyResponse(Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse) native "BiquadFilterNode_getFrequencyResponse_Callback";
 
 }
@@ -684,7 +697,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ChannelMergerNode
+@DocsEditable
+@DomName('ChannelMergerNode')
 class ChannelMergerNode extends AudioNode {
   ChannelMergerNode.internal() : super.internal();
 
@@ -696,7 +710,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ChannelSplitterNode
+@DocsEditable
+@DomName('ChannelSplitterNode')
 class ChannelSplitterNode extends AudioNode {
   ChannelSplitterNode.internal() : super.internal();
 
@@ -708,24 +723,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ConvolverNode
+@DocsEditable
+@DomName('ConvolverNode')
 class ConvolverNode extends AudioNode {
   ConvolverNode.internal() : super.internal();
 
-
-  /** @domName ConvolverNode.buffer */
+  @DocsEditable
+  @DomName('ConvolverNode.buffer')
   AudioBuffer get buffer native "ConvolverNode_buffer_Getter";
 
-
-  /** @domName ConvolverNode.buffer */
+  @DocsEditable
+  @DomName('ConvolverNode.buffer')
   void set buffer(AudioBuffer value) native "ConvolverNode_buffer_Setter";
 
-
-  /** @domName ConvolverNode.normalize */
+  @DocsEditable
+  @DomName('ConvolverNode.normalize')
   bool get normalize native "ConvolverNode_normalize_Getter";
 
-
-  /** @domName ConvolverNode.normalize */
+  @DocsEditable
+  @DomName('ConvolverNode.normalize')
   void set normalize(bool value) native "ConvolverNode_normalize_Setter";
 
 }
@@ -736,12 +752,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DelayNode
+@DocsEditable
+@DomName('DelayNode')
 class DelayNode extends AudioNode {
   DelayNode.internal() : super.internal();
 
-
-  /** @domName DelayNode.delayTime */
+  @DocsEditable
+  @DomName('DelayNode.delayTime')
   AudioParam get delayTime native "DelayNode_delayTime_Getter";
 
 }
@@ -752,32 +769,33 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DynamicsCompressorNode
+@DocsEditable
+@DomName('DynamicsCompressorNode')
 class DynamicsCompressorNode extends AudioNode {
   DynamicsCompressorNode.internal() : super.internal();
 
-
-  /** @domName DynamicsCompressorNode.attack */
+  @DocsEditable
+  @DomName('DynamicsCompressorNode.attack')
   AudioParam get attack native "DynamicsCompressorNode_attack_Getter";
 
-
-  /** @domName DynamicsCompressorNode.knee */
+  @DocsEditable
+  @DomName('DynamicsCompressorNode.knee')
   AudioParam get knee native "DynamicsCompressorNode_knee_Getter";
 
-
-  /** @domName DynamicsCompressorNode.ratio */
+  @DocsEditable
+  @DomName('DynamicsCompressorNode.ratio')
   AudioParam get ratio native "DynamicsCompressorNode_ratio_Getter";
 
-
-  /** @domName DynamicsCompressorNode.reduction */
+  @DocsEditable
+  @DomName('DynamicsCompressorNode.reduction')
   AudioParam get reduction native "DynamicsCompressorNode_reduction_Getter";
 
-
-  /** @domName DynamicsCompressorNode.release */
+  @DocsEditable
+  @DomName('DynamicsCompressorNode.release')
   AudioParam get release native "DynamicsCompressorNode_release_Getter";
 
-
-  /** @domName DynamicsCompressorNode.threshold */
+  @DocsEditable
+  @DomName('DynamicsCompressorNode.threshold')
   AudioParam get threshold native "DynamicsCompressorNode_threshold_Getter";
 
 }
@@ -788,12 +806,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName GainNode
+@DocsEditable
+@DomName('GainNode')
 class GainNode extends AudioNode {
   GainNode.internal() : super.internal();
 
-
-  /** @domName GainNode.gain */
+  @DocsEditable
+  @DomName('GainNode.gain')
   AudioGain get gain native "GainNode_gain_Getter";
 
 }
@@ -804,12 +823,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaElementAudioSourceNode
+@DocsEditable
+@DomName('MediaElementAudioSourceNode')
 class MediaElementAudioSourceNode extends AudioSourceNode {
   MediaElementAudioSourceNode.internal() : super.internal();
 
-
-  /** @domName MediaElementAudioSourceNode.mediaElement */
+  @DocsEditable
+  @DomName('MediaElementAudioSourceNode.mediaElement')
   MediaElement get mediaElement native "MediaElementAudioSourceNode_mediaElement_Getter";
 
 }
@@ -820,12 +840,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaStreamAudioDestinationNode
+@DocsEditable
+@DomName('MediaStreamAudioDestinationNode')
 class MediaStreamAudioDestinationNode extends AudioSourceNode {
   MediaStreamAudioDestinationNode.internal() : super.internal();
 
-
-  /** @domName MediaStreamAudioDestinationNode.stream */
+  @DocsEditable
+  @DomName('MediaStreamAudioDestinationNode.stream')
   MediaStream get stream native "MediaStreamAudioDestinationNode_stream_Getter";
 
 }
@@ -836,12 +857,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaStreamAudioSourceNode
+@DocsEditable
+@DomName('MediaStreamAudioSourceNode')
 class MediaStreamAudioSourceNode extends AudioSourceNode {
   MediaStreamAudioSourceNode.internal() : super.internal();
 
-
-  /** @domName MediaStreamAudioSourceNode.mediaStream */
+  @DocsEditable
+  @DomName('MediaStreamAudioSourceNode.mediaStream')
   MediaStream get mediaStream native "MediaStreamAudioSourceNode_mediaStream_Getter";
 
 }
@@ -852,12 +874,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName OfflineAudioCompletionEvent
+@DocsEditable
+@DomName('OfflineAudioCompletionEvent')
 class OfflineAudioCompletionEvent extends Event {
   OfflineAudioCompletionEvent.internal() : super.internal();
 
-
-  /** @domName OfflineAudioCompletionEvent.renderedBuffer */
+  @DocsEditable
+  @DomName('OfflineAudioCompletionEvent.renderedBuffer')
   AudioBuffer get renderedBuffer native "OfflineAudioCompletionEvent_renderedBuffer_Getter";
 
 }
@@ -868,11 +891,12 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName OfflineAudioContext
+@DocsEditable
+@DomName('OfflineAudioContext')
 class OfflineAudioContext extends AudioContext implements EventTarget {
   OfflineAudioContext.internal() : super.internal();
 
-  ///@docsEditable true
+  @DocsEditable
   factory OfflineAudioContext(int numberOfChannels, int numberOfFrames, num sampleRate) => OfflineAudioContext._create(numberOfChannels, numberOfFrames, sampleRate);
   static OfflineAudioContext _create(int numberOfChannels, int numberOfFrames, num sampleRate) native "OfflineAudioContext_constructor_Callback";
 
@@ -884,7 +908,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName OscillatorNode
+@DocsEditable
+@DomName('OscillatorNode')
 class OscillatorNode extends AudioSourceNode {
   OscillatorNode.internal() : super.internal();
 
@@ -906,36 +931,36 @@
 
   static const int UNSCHEDULED_STATE = 0;
 
-
-  /** @domName OscillatorNode.detune */
+  @DocsEditable
+  @DomName('OscillatorNode.detune')
   AudioParam get detune native "OscillatorNode_detune_Getter";
 
-
-  /** @domName OscillatorNode.frequency */
+  @DocsEditable
+  @DomName('OscillatorNode.frequency')
   AudioParam get frequency native "OscillatorNode_frequency_Getter";
 
-
-  /** @domName OscillatorNode.playbackState */
+  @DocsEditable
+  @DomName('OscillatorNode.playbackState')
   int get playbackState native "OscillatorNode_playbackState_Getter";
 
+  @DocsEditable
+  @DomName('OscillatorNode.type')
+  String get type native "OscillatorNode_type_Getter";
 
-  /** @domName OscillatorNode.type */
-  int get type native "OscillatorNode_type_Getter";
+  @DocsEditable
+  @DomName('OscillatorNode.type')
+  void set type(String value) native "OscillatorNode_type_Setter";
 
-
-  /** @domName OscillatorNode.type */
-  void set type(int value) native "OscillatorNode_type_Setter";
-
-
-  /** @domName OscillatorNode.setWaveTable */
+  @DocsEditable
+  @DomName('OscillatorNode.setWaveTable')
   void setWaveTable(WaveTable waveTable) native "OscillatorNode_setWaveTable_Callback";
 
-
-  /** @domName OscillatorNode.start */
+  @DocsEditable
+  @DomName('OscillatorNode.start')
   void start(num when) native "OscillatorNode_start_Callback";
 
-
-  /** @domName OscillatorNode.stop */
+  @DocsEditable
+  @DomName('OscillatorNode.stop')
   void stop(num when) native "OscillatorNode_stop_Callback";
 
 }
@@ -946,7 +971,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName PannerNode
+@DocsEditable
+@DomName('PannerNode')
 class PannerNode extends AudioNode {
   PannerNode.internal() : super.internal();
 
@@ -962,80 +988,80 @@
 
   static const int SOUNDFIELD = 2;
 
-
-  /** @domName PannerNode.coneInnerAngle */
+  @DocsEditable
+  @DomName('PannerNode.coneInnerAngle')
   num get coneInnerAngle native "PannerNode_coneInnerAngle_Getter";
 
-
-  /** @domName PannerNode.coneInnerAngle */
+  @DocsEditable
+  @DomName('PannerNode.coneInnerAngle')
   void set coneInnerAngle(num value) native "PannerNode_coneInnerAngle_Setter";
 
-
-  /** @domName PannerNode.coneOuterAngle */
+  @DocsEditable
+  @DomName('PannerNode.coneOuterAngle')
   num get coneOuterAngle native "PannerNode_coneOuterAngle_Getter";
 
-
-  /** @domName PannerNode.coneOuterAngle */
+  @DocsEditable
+  @DomName('PannerNode.coneOuterAngle')
   void set coneOuterAngle(num value) native "PannerNode_coneOuterAngle_Setter";
 
-
-  /** @domName PannerNode.coneOuterGain */
+  @DocsEditable
+  @DomName('PannerNode.coneOuterGain')
   num get coneOuterGain native "PannerNode_coneOuterGain_Getter";
 
-
-  /** @domName PannerNode.coneOuterGain */
+  @DocsEditable
+  @DomName('PannerNode.coneOuterGain')
   void set coneOuterGain(num value) native "PannerNode_coneOuterGain_Setter";
 
+  @DocsEditable
+  @DomName('PannerNode.distanceModel')
+  String get distanceModel native "PannerNode_distanceModel_Getter";
 
-  /** @domName PannerNode.distanceModel */
-  int get distanceModel native "PannerNode_distanceModel_Getter";
+  @DocsEditable
+  @DomName('PannerNode.distanceModel')
+  void set distanceModel(String value) native "PannerNode_distanceModel_Setter";
 
-
-  /** @domName PannerNode.distanceModel */
-  void set distanceModel(int value) native "PannerNode_distanceModel_Setter";
-
-
-  /** @domName PannerNode.maxDistance */
+  @DocsEditable
+  @DomName('PannerNode.maxDistance')
   num get maxDistance native "PannerNode_maxDistance_Getter";
 
-
-  /** @domName PannerNode.maxDistance */
+  @DocsEditable
+  @DomName('PannerNode.maxDistance')
   void set maxDistance(num value) native "PannerNode_maxDistance_Setter";
 
+  @DocsEditable
+  @DomName('PannerNode.panningModel')
+  String get panningModel native "PannerNode_panningModel_Getter";
 
-  /** @domName PannerNode.panningModel */
-  int get panningModel native "PannerNode_panningModel_Getter";
+  @DocsEditable
+  @DomName('PannerNode.panningModel')
+  void set panningModel(String value) native "PannerNode_panningModel_Setter";
 
-
-  /** @domName PannerNode.panningModel */
-  void set panningModel(int value) native "PannerNode_panningModel_Setter";
-
-
-  /** @domName PannerNode.refDistance */
+  @DocsEditable
+  @DomName('PannerNode.refDistance')
   num get refDistance native "PannerNode_refDistance_Getter";
 
-
-  /** @domName PannerNode.refDistance */
+  @DocsEditable
+  @DomName('PannerNode.refDistance')
   void set refDistance(num value) native "PannerNode_refDistance_Setter";
 
-
-  /** @domName PannerNode.rolloffFactor */
+  @DocsEditable
+  @DomName('PannerNode.rolloffFactor')
   num get rolloffFactor native "PannerNode_rolloffFactor_Getter";
 
-
-  /** @domName PannerNode.rolloffFactor */
+  @DocsEditable
+  @DomName('PannerNode.rolloffFactor')
   void set rolloffFactor(num value) native "PannerNode_rolloffFactor_Setter";
 
-
-  /** @domName PannerNode.setOrientation */
+  @DocsEditable
+  @DomName('PannerNode.setOrientation')
   void setOrientation(num x, num y, num z) native "PannerNode_setOrientation_Callback";
 
-
-  /** @domName PannerNode.setPosition */
+  @DocsEditable
+  @DomName('PannerNode.setPosition')
   void setPosition(num x, num y, num z) native "PannerNode_setPosition_Callback";
 
-
-  /** @domName PannerNode.setVelocity */
+  @DocsEditable
+  @DomName('PannerNode.setVelocity')
   void setVelocity(num x, num y, num z) native "PannerNode_setVelocity_Callback";
 
 }
@@ -1046,12 +1072,13 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ScriptProcessorNode
+@DocsEditable
+@DomName('ScriptProcessorNode')
 class ScriptProcessorNode extends AudioNode implements EventTarget {
   ScriptProcessorNode.internal() : super.internal();
 
-
-  /** @domName ScriptProcessorNode.bufferSize */
+  @DocsEditable
+  @DomName('ScriptProcessorNode.bufferSize')
   int get bufferSize native "ScriptProcessorNode_bufferSize_Getter";
 
 }
@@ -1062,16 +1089,17 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WaveShaperNode
+@DocsEditable
+@DomName('WaveShaperNode')
 class WaveShaperNode extends AudioNode {
   WaveShaperNode.internal() : super.internal();
 
-
-  /** @domName WaveShaperNode.curve */
+  @DocsEditable
+  @DomName('WaveShaperNode.curve')
   Float32Array get curve native "WaveShaperNode_curve_Getter";
 
-
-  /** @domName WaveShaperNode.curve */
+  @DocsEditable
+  @DomName('WaveShaperNode.curve')
   void set curve(Float32Array value) native "WaveShaperNode_curve_Setter";
 
 }
@@ -1082,7 +1110,8 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WaveTable
+@DocsEditable
+@DomName('WaveTable')
 class WaveTable extends NativeFieldWrapperClass1 {
   WaveTable.internal();
 
diff --git a/tests/chrome/chrome.status b/tests/chrome/chrome.status
new file mode 100644
index 0000000..077c8b2
--- /dev/null
+++ b/tests/chrome/chrome.status
@@ -0,0 +1,11 @@
+# Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+[ $runtime == vm ]
+# Not supported on the VM
+*: Skip
+
+[ $compiler == none]
+# Not supported on Dartium right now
+*: Skip
diff --git a/tests/chrome/sample_test.dart b/tests/chrome/sample_test.dart
new file mode 100644
index 0000000..219a600
--- /dev/null
+++ b/tests/chrome/sample_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library sample_test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:chrome' as chrome;
+
+main() {
+  useHtmlConfiguration();
+  test('access', () {
+    var window = chrome.app.window;
+    expect(window is chrome.WindowModule, true);
+  });
+
+  test('fails from browser', () {
+    // APIs should not work in standard browser apps.
+    expect(() {
+      chrome.app.window.create('foo.html');
+    }, throws);
+  });
+}
diff --git a/tests/co19/co19-compiler.status b/tests/co19/co19-compiler.status
index 553417a..9ab3b3c 100644
--- a/tests/co19/co19-compiler.status
+++ b/tests/co19/co19-compiler.status
@@ -27,9 +27,6 @@
 Language/06_Functions/2_Formal_Parameters/1_Required_Formals_A02_t05: Fail
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t06: Fail
 
-# issue 7095
-Language/12_Statements/02_Expression_Statements_A01_t12: Fail
-
 # co19 issue 344 ('null' is constant, so can be used in 'case')
 Language/12_Statements/09_Switch_A02_t03: Fail
 
@@ -127,7 +124,6 @@
 
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t02: Fail, OK # deprecated parameter syntax
 
-Language/03_Overview/1_Scoping_A02_t28: Fail # language change 1031
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A15_t07: Fail # Issue 3323
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: Fail # Issue 2477
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: Fail # Issue 2477
@@ -148,5 +144,294 @@
 LibTest/math/parseInt_A02_t01: Fail, OK # co19 issue 317
 
 
+Language/03_Overview/1_Scoping_A02_t30: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/03_Overview/2_Privacy_A01_t06: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/05_Variables/05_Variables_A11_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t05: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/07_Classes_A01_t20: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/07_Classes_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/07_Classes_A02_t34: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/07_Classes_A03_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/07_Classes_A03_t04: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/07_Classes_A03_t05: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/07_Classes_A03_t06: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/1_Instance_Methods/2_Operators_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/3_Setters_A04_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/3_Setters_A04_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/3_Setters_A04_t04: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/3_Setters_A04_t05: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/4_Abstract_Instance_Members_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/4_Abstract_Instance_Members_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/4_Abstract_Instance_Members_A04_t04: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/4_Abstract_Instance_Members_A07_t07: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/4_Abstract_Instance_Members_A07_t09: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A18_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/08_Interfaces/5_Superinterfaces/1_Inheritance_and_Overriding_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/08_Interfaces/5_Superinterfaces/1_Inheritance_and_Overriding_A02_t05: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t13: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/11_Instance_Creation/1_New_A06_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/11_Instance_Creation/1_New_A06_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/11_Instance_Creation/1_New_A06_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/11_Instance_Creation/1_New_A06_t07: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/11_Instance_Creation/1_New_A06_t08: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/11_Instance_Creation/1_New_A06_t09: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/11_Instance_Creation/1_New_A11_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/11_Instance_Creation/1_New_A12_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A01_t19: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/18_Assignment_A08_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/18_Assignment_A08_t04: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/19_Conditional_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/19_Conditional_A01_t10: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/19_Conditional_A01_t12: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/19_Conditional_A01_t14: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t10: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t11: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t12: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t13: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t14: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t15: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t12: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t13: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t14: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t15: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t16: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t17: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/22_Equality_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/23_Relational_Expressions_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/23_Relational_Expressions_A01_t18: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/23_Relational_Expressions_A01_t19: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/23_Relational_Expressions_A01_t20: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/23_Relational_Expressions_A01_t21: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/23_Relational_Expressions_A01_t22: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/23_Relational_Expressions_A01_t23: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/24_Shift_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/24_Shift_A01_t09: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/24_Shift_A01_t10: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/24_Shift_A01_t11: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/24_Shift_A01_t12: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/24_Shift_A01_t13: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/24_Shift_A01_t14: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/25_Additive_Expressions_A01_t07: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/25_Additive_Expressions_A01_t08: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/25_Additive_Expressions_A01_t11: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/25_Additive_Expressions_A01_t12: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/25_Additive_Expressions_A01_t13: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/25_Additive_Expressions_A01_t14: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t10: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t11: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t14: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t15: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t16: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t17: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/27_Unary_Expressions_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/27_Unary_Expressions_A01_t04: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/27_Unary_Expressions_A01_t05: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/27_Unary_Expressions_A01_t11: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/27_Unary_Expressions_A01_t12: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/27_Unary_Expressions_A01_t13: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/27_Unary_Expressions_A01_t17: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/27_Unary_Expressions_A01_t18: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/27_Unary_Expressions_A01_t19: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/27_Unary_Expressions_A01_t20: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/27_Unary_Expressions_A01_t21: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/27_Unary_Expressions_A01_t22: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/27_Unary_Expressions_A01_t27: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/28_Postfix_Expressions_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/28_Postfix_Expressions_A01_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/28_Postfix_Expressions_A01_t05: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/29_Assignable_Expressions_A01_t06: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/29_Assignable_Expressions_A01_t08: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/29_Assignable_Expressions_A01_t09: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/29_Assignable_Expressions_A01_t26: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/30_Identifier_Reference_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/30_Identifier_Reference_A07_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/11_Expressions/30_Identifier_Reference_A08_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/12_Statements/04_Local_Function_Declaration_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/12_Statements/06_For/1_For_Loop_A01_t07: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/12_Statements/06_For/2_For_in_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/12_Statements/07_While_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/12_Statements/08_Do_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/12_Statements/09_Switch_A02_t04: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/1_Imports_A01_t51: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/1_Imports_A01_t52: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/1_Imports_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/1_Imports_A02_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/1_Imports_A02_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/1_Imports_A02_t04: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/1_Imports_A02_t05: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/1_Imports_A02_t06: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/1_Imports_A02_t11: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/1_Imports_A02_t13: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/1_Imports_A02_t14: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/1_Imports_A02_t20: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/2_Exports_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/2_Exports_A01_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/2_Exports_A01_t17: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/2_Exports_A03_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/2_Exports_A03_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/13_Libraries_and_Scripts/3_Parts_A03_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/14_Types/1_Static_Types_A02_t09: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/14_Types/2_Dynamic_Type_System_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/14_Types/4_Interface_Types_A08_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+Language/14_Types/5_Function_Types_A06_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/AssertionError/column_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/AssertionError/failedAssertion_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/AssertionError/line_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/AssertionError/url_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Completer/Completer_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Completer/completeException_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Completer/completeException_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Completer/completeException_A03_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Completer/completeException_A03_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Completer/complete_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Completer/complete_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Completer/complete_A02_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Completer/future_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A03_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Date/subtract_A06_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/Future.immediate_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/chain_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/chain_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/chain_A01_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/chain_A01_t04: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/chain_A01_t05: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/chain_A01_t06: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/chain_A01_t07: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/chain_A01_t08: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/chain_A01_t09: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/chain_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/chain_A02_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/chain_A02_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/chain_A03_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/exception_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/exception_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/exception_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/handleException_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/handleException_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/handleException_A01_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/handleException_A01_t04: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/handleException_A01_t05: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/handleException_A01_t06: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/handleException_A01_t07: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/hasValue_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/isComplete_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/then_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/then_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/then_A01_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/then_A01_t04: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/then_A01_t05: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/transform_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/transform_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/transform_A01_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/transform_A01_t04: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/transform_A01_t05: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/transform_A01_t06: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/transform_A01_t07: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/transform_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/transform_A02_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/transform_A03_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/value_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/value_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Future/value_A01_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Futures/wait_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Futures/wait_A01_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Futures/wait_A01_t04: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Futures/wait_A01_t05: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Futures/wait_A01_t06: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Futures/wait_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Futures/wait_A02_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Futures/wait_A03_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/LinkedHashMap/LinkedHashMap_class_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/List/every_A03_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/List/filter_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/List/filter_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/List/filter_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/List/filter_A03_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/List/iterator_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/List/iterator_hasNext_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/List/iterator_next_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/List/iterator_next_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/List/setRange_A05_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/List/some_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/List/some_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/List/some_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/List/some_A03_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Map/getKeys_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Map/getKeys_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Map/getValues_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Map/getValues_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Match/end_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Match/groupCount_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Match/group_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Match/group_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Match/groups_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Match/groups_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Match/operator_subscript_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Match/operator_subscript_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Match/pattern_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Match/start_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Match/str_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/filter_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/filter_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/filter_A01_t04: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/filter_A01_t05: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/filter_A01_t06: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/iterator_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/iterator_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/iterator_hasNext_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/iterator_hasNext_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/iterator_next_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/iterator_next_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/iterator_next_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/some_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/some_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/some_A01_t04: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/some_A01_t05: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Queue/some_A01_t06: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/Pattern_semantics/firstMatch_Assertion_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/Pattern_semantics/firstMatch_Assertion_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/Pattern_semantics/firstMatch_Assertion_A03_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/Pattern_semantics/firstMatch_Assertion_A04_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A06_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/Pattern_semantics/firstMatch_Disjunction_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/RegExp_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/RegExp_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/allMatches_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/allMatches_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/firstMatch_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/firstMatch_A03_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/hasMatch_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/hasMatch_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/ignoreCase_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/multiLine_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/pattern_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/stringMatch_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/RegExp/stringMatch_A02_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Set/filter_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Set/filter_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Set/filter_A01_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Set/some_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Set/some_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/Set/some_A01_t03: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/String/contains_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/String/contains_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/String/replaceAll_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/String/replaceFirst_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/String/split_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/String/split_A01_t02: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/core/StringBuffer/isEmpty_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/isolate/SendPort/call_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+LibTest/math/Random/nextDouble_A01_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
+
+
 [ $runtime == drt && ($compiler == none || $compiler == frog) ]
 *: Skip
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index 2025cb9..a23d5db 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -129,10 +129,7 @@
 Language/07_Classes/1_Instance_Methods_A06_t01: Fail # Inherited from dart2js
 Language/07_Classes/1_Instance_Methods_A06_t02: Fail # Inherited from dart2js
 Language/07_Classes/2_Getters_A01_t03: Fail # inherited from VM
-Language/07_Classes/2_Getters_A01_t04: Fail # http://dartbug.com/5519
 Language/07_Classes/2_Getters_A01_t05: Fail # inherited from VM
-Language/07_Classes/2_Getters_A01_t06: Fail # http://dartbug.com/5519
-Language/07_Classes/2_Getters_A01_t07: Fail # http://dartbug.com/5519
 Language/07_Classes/3_Setters_A04_t01: Fail # inherited from VM
 Language/07_Classes/3_Setters_A04_t02: Fail # inherited from VM
 Language/07_Classes/3_Setters_A04_t03: Fail # inherited from VM
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index b044efcd..4671c53 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -235,7 +235,6 @@
 LibTest/core/AssertionError/failedAssertion_A01_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/AssertionError/line_A01_t02: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/AssertionError/url_A01_t01: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/List/operator_subscripted_assignment_A03_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/Map/putIfAbsent_A01_t04: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/Queue/iterator_hasNext_A01_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/String/contains_A01_t01: Fail # TODO(ahe): Please triage this failure.
@@ -662,10 +661,7 @@
 Language/07_Classes/1_Instance_Methods_A02_t02: Fail # Checks that a compile-time error is produced if m1 has fewer named parameters than m2 (1 vs. 0) and neither have any required parameters.
 Language/07_Classes/1_Instance_Methods_A02_t05: Fail # Checks that a compile-time error is produced if m1 has almost the same set of named  parameters as m2 except for one of them having a different name.
 Language/07_Classes/2_Getters_A01_t03: Fail # Checks that a compile-time error is produced if empty formal parameter list is present.
-Language/07_Classes/2_Getters_A01_t04: Fail # Checks that a compile-time error is produced if non-empty formal parameter list is present.
 Language/07_Classes/2_Getters_A01_t05: Fail # Checks that a compile-time error is produced if an static getter has empty formal parameter list.
-Language/07_Classes/2_Getters_A01_t06: Fail # Checks that a compile-time error is produced if an arbitrary static getter specifies a single formal parameter.
-Language/07_Classes/2_Getters_A01_t07: Fail # Checks that a compile-time error is produced if an arbitrary instance getter specifies a single formal parameter.
 Language/07_Classes/4_Abstract_Instance_Members_A04_t01: Fail # Checks that a compile-time error is produced when the overriding abstract method has fewer named parameters than the instance method being overridden (2 vs 3) and neither  have any required parameters.
 Language/07_Classes/4_Abstract_Instance_Members_A04_t05: Fail # Checks that a compile-time error is produced when the overriding non-abstract  instance method has the same set of named parameters as the abstract method being overriden,  but in a different order.
 Language/07_Classes/4_Abstract_Instance_Members_A04_t06: Fail # Checks that a compile-time error is produced when the overriding non-abstract  instance method has almost the same set of named parameters as the abstract method being overriden,  except for one that has a different name.
diff --git a/tests/compiler/dart2js/cpa_inference_test.dart b/tests/compiler/dart2js/cpa_inference_test.dart
index 99558b7..5d4ffff 100644
--- a/tests/compiler/dart2js/cpa_inference_test.dart
+++ b/tests/compiler/dart2js/cpa_inference_test.dart
@@ -511,22 +511,158 @@
                             result.double]);  // dynamic.y = double
 }
 
-testNamedParameters() {
+testOptionalNamedParameters() {
   final String source = r"""
       class A {
         var x, y, z, w;
         A(this.x, {this.y, this.z, this.w});
       }
+      class B {
+        var x, y;
+        B(this.x, {this.y});
+      }
+      class C {
+        var x, y;
+        C(this.x, {this.y});
+      }
+      class Test {
+        var a, b, c, d;
+        var e, f;
+        var g, h;
+
+        Test(this.a, this.b, this.c, this.d,
+             this.e, this.f,
+             this.g, this.h);
+
+        f1(x, {y, z, w}) {
+          a = x;
+          b = y;
+          c = z;
+          d = w;
+        }
+        f2(x, {y}) {
+          e = x;
+          f = y;
+        }
+        f3(x, {y}) {
+          g = x;
+          h = y;
+        }
+      }
+      class Foo {
+      }
       main() {
+        // We want to test expiclitely for null later so we initialize all the
+        // fields of Test with a placeholder type: Foo.
+        var foo = new Foo();
+        var test = new Test(foo, foo, foo, foo, foo, foo, foo, foo);
+
         new A(42);
         new A('abc', w: true, z: 42.0);
+        test.f1(42);
+        test.f1('abc', w: true, z: 42.0);
+
+        new B('abc', y: true);
+        new B(1, 2);  // too many positional arguments
+        test.f2('abc', y: true);
+        test.f2(1, 2);  // too many positional arguments
+
+        new C('abc', y: true);
+        new C(1, z: 2);  // non-existing named parameter
+        test.f3('abc', y: true);
+        test.f3(1, z: 2);  // non-existing named parameter
       }
       """;
   AnalysisResult result = analyze(source);
+
+  final foo = result.base('Foo');
+  final nil = new NullBaseType();
+
   result.checkFieldHasType('A', 'x', [result.int, result.string]);
-  result.checkFieldHasType('A', 'y', [new NullBaseType()]);
-  result.checkFieldHasType('A', 'z', [new NullBaseType(), result.double]);
-  result.checkFieldHasType('A', 'w', [new NullBaseType(), result.bool]);
+  result.checkFieldHasType('A', 'y', [nil]);
+  result.checkFieldHasType('A', 'z', [nil, result.double]);
+  result.checkFieldHasType('A', 'w', [nil, result.bool]);
+  result.checkFieldHasType('Test', 'a', [foo, result.int, result.string]);
+  result.checkFieldHasType('Test', 'b', [foo, nil]);
+  result.checkFieldHasType('Test', 'c', [foo, nil, result.double]);
+  result.checkFieldHasType('Test', 'd', [foo, nil, result.bool]);
+
+  result.checkFieldHasType('B', 'x', [result.string]);
+  result.checkFieldHasType('B', 'y', [result.bool]);
+  result.checkFieldHasType('Test', 'e', [foo, result.string]);
+  result.checkFieldHasType('Test', 'f', [foo, result.bool]);
+
+  result.checkFieldHasType('C', 'x', [result.string]);
+  result.checkFieldHasType('C', 'y', [result.bool]);
+  result.checkFieldHasType('Test', 'g', [foo, result.string]);
+  result.checkFieldHasType('Test', 'h', [foo, result.bool]);
+}
+
+testOptionalPositionalParameters() {
+  final String source = r"""
+    class A {
+      var x, y, z, w;
+      A(this.x, [this.y, this.z, this.w]);
+    }
+    class B {
+      var x, y;
+      B(this.x, [this.y]);
+    }
+    class Test {
+      var a, b, c, d;
+      var e, f;
+
+      Test(this.a, this.b, this.c, this.d,
+           this.e, this.f);
+
+      f1(x, [y, z, w]) {
+        a = x;
+        b = y;
+        c = z;
+        d = w;
+      }
+      f2(x, [y]) {
+        e = x;
+        f = y;
+      }
+    }
+    class Foo {
+    }
+    main() {
+      // We want to test expiclitely for null later so we initialize all the
+      // fields of Test with a placeholder type: Foo.
+      var foo = new Foo();
+      var test = new Test(foo, foo, foo, foo, foo, foo);
+
+      new A(42);
+      new A('abc', true, 42.0);
+      test.f1(42);
+      test.f1('abc', true, 42.0);
+
+      new B('a', true);
+      new B(1, 2, 3);  // too many arguments
+      test.f2('a', true);
+      test.f2(1, 2, 3);  // too many arguments
+    }
+  """;
+  AnalysisResult result = analyze(source);
+
+  final foo = result.base('Foo');
+  final nil = new NullBaseType();
+
+  result.checkFieldHasType('A', 'x', [result.int, result.string]);
+  result.checkFieldHasType('A', 'y', [nil, result.bool]);
+  result.checkFieldHasType('A', 'z', [nil, result.double]);
+  result.checkFieldHasType('A', 'w', [nil]);
+  result.checkFieldHasType('Test', 'a', [foo, result.int, result.string]);
+  result.checkFieldHasType('Test', 'b', [foo, nil, result.bool]);
+  result.checkFieldHasType('Test', 'c', [foo, nil, result.double]);
+  result.checkFieldHasType('Test', 'd', [foo, nil]);
+
+  result.checkFieldHasType('B', 'x', [result.string]);
+  result.checkFieldHasType('B', 'y', [result.bool]);
+  result.checkFieldHasType('Test', 'e', [foo, result.string]);
+  result.checkFieldHasType('Test', 'f', [foo, result.bool]);
 }
 
 testListLiterals() {
@@ -861,7 +997,8 @@
   testConstructor();
   testGetters();
   testSetters();
-  testNamedParameters();
+  testOptionalNamedParameters();
+  testOptionalPositionalParameters();
   testListLiterals();
   testMapLiterals();
   testReturn();
diff --git a/tests/compiler/dart2js/dead_bailout_target_test.dart b/tests/compiler/dart2js/dead_bailout_target_test.dart
new file mode 100644
index 0000000..aa3c865
--- /dev/null
+++ b/tests/compiler/dart2js/dead_bailout_target_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This unit test of dart2js checks that a SSA bailout target
+// instruction gets removed from the graph when it's not used.
+
+import 'compiler_helper.dart';
+
+String TEST = r'''
+main() {
+  foo(1);
+  foo([]);
+}
+
+foo(a) {
+  // Make the method recursive to always enable bailouts
+  // and force a list instantiation.
+  foo([]);
+  // Force bailout on [a].
+  for (int i = 0; i < 100; i++) a[0] = 42;
+  // Force bailout on [:a.length:].
+  for (int i = 0; i < 200; i++) a[0] = -a.length;
+}
+''';
+
+main() {
+  String generated = compile(TEST, entry: 'foo');
+
+  // Check that we only have one bailout call. The second bailout call
+  // is dead code because we know [:a.length:] is an int.
+  checkNumberOfMatches(new RegExp('bailout').allMatches(generated).iterator, 1);
+
+  // Check that the foo method does not have any call to
+  // 'getInterceptor'. The environment for the second bailout contains
+  // the interceptor of [:a.length:], but since the bailout is
+  // removed, the interceptor is removed too.
+  Expect.isTrue(!generated.contains('getInterceptor'));
+
+  generated = compileAll(TEST);
+  
+  // Check that the foo bailout method is generated.
+  checkNumberOfMatches(
+      new RegExp('foo\\\$bailout').allMatches(generated).iterator, 2);
+
+  // Check that it's the only bailout method.
+  checkNumberOfMatches(new RegExp('bailout').allMatches(generated).iterator, 2);
+
+  // Check that the bailout method has a case 2 for the state, which
+  // is the second bailout in foo.
+  RegExp state = new RegExp('case 2:[ \n]+state0 = 0;');
+  checkNumberOfMatches(state.allMatches(generated).iterator, 1);
+
+  // Finally, make sure that the reason foo does not contain
+  // 'getInterceptor' is not because the compiler renamed it.
+  Expect.isTrue(generated.contains('getInterceptor'));
+}
diff --git a/tests/compiler/dart2js/minify_many_locals_test.dart b/tests/compiler/dart2js/minify_many_locals_test.dart
index 98260b9..510d46f 100644
--- a/tests/compiler/dart2js/minify_many_locals_test.dart
+++ b/tests/compiler/dart2js/minify_many_locals_test.dart
@@ -20,7 +20,8 @@
   RegExp re = new RegExp(r"\(a,b,c");
   Expect.isTrue(re.hasMatch(generated));
 
-  re = new RegExp(r"x,y,z,A,B,C");
+  // 'z' will be used as a local.
+  re = new RegExp(r"x,y,A,B,C");
   Expect.isTrue(re.hasMatch(generated));
   
   re = new RegExp(r"Y,Z,a0,a1,a2,a3,a4,a5,a6");
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 88a9206..bb71b40 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -58,6 +58,7 @@
   class JSArray {
     var length;
     operator[](index) {}
+    operator[]=(index, value) {}
     var add;
   }
   class JSString {
@@ -65,6 +66,17 @@
     operator[](index) {}
   }
   class JSNumber {
+    operator-() {}
+    operator +(other) {}
+    operator -(other) {}
+    operator ~/(other) {}
+    operator /(other) {}
+    operator *(other) {}
+    operator <<(other) {}
+    operator >>(other) {}
+    operator |(other) {}
+    operator &(other) {}
+    operator ^(other) {}
   }
   class JSInt {
   }
@@ -140,6 +152,18 @@
     // the interfaces of the Object class which would be 'null' if the class
     // wasn't resolved.
     objectClass.ensureResolved(this);
+
+    // Our unit tests check code generation output that is affected by
+    // inlining support.
+    disableInlining = true;
+  }
+
+  /**
+   * Registers the [source] with [uri] making it possible load [source] as a
+   * library.
+   */
+  void registerSource(Uri uri, String source) {
+    sourceFiles[uri.toString()] = new MockFile(source);
   }
 
   /**
diff --git a/tests/compiler/dart2js/reexport_handled_test.dart b/tests/compiler/dart2js/reexport_handled_test.dart
new file mode 100644
index 0000000..766d1a7
--- /dev/null
+++ b/tests/compiler/dart2js/reexport_handled_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library reexport_handled_test;
+
+import 'dart:uri';
+import 'mock_compiler.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
+    show Element,
+         LibraryElement;
+
+final exportingLibraryUri = new Uri('exporting.dart');
+const String EXPORTING_LIBRARY_SOURCE = '''
+library exporting;
+var foo;
+''';
+
+final reexportingLibraryUri = new Uri('reexporting.dart');
+const String REEXPORTING_LIBRARY_SOURCE = '''
+library reexporting;
+export 'exporting.dart';
+''';
+
+void main() {
+  var compiler = new MockCompiler();
+  compiler.registerSource(exportingLibraryUri, EXPORTING_LIBRARY_SOURCE);
+  compiler.registerSource(reexportingLibraryUri, REEXPORTING_LIBRARY_SOURCE);
+
+  // Load exporting library before the reexporting library.
+  var exportingLibrary = compiler.libraryLoader.loadLibrary(
+      exportingLibraryUri, null, exportingLibraryUri);
+  Expect.isTrue(exportingLibrary.exportsHandled);
+  var foo = findInExports(exportingLibrary, 'foo');
+  Expect.isNotNull(foo);
+  Expect.isTrue(foo.isField());
+
+  // Load reexporting library when exports are handled on the exporting library.
+  var reexportingLibrary = compiler.libraryLoader.loadLibrary(
+      reexportingLibraryUri, null, reexportingLibraryUri);
+  foo = findInExports(reexportingLibrary, 'foo');
+  Expect.isNotNull(foo);
+  Expect.isTrue(foo.isField());
+}
+
+Element findInExports(LibraryElement library, String name) {
+  for (var export in library.exports) {
+    if (export.name.slowToString() == name) {
+      return export;
+    }
+  }
+  return null;
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/unparser_test.dart b/tests/compiler/dart2js/unparser_test.dart
index 441269e..cecb766 100644
--- a/tests/compiler/dart2js/unparser_test.dart
+++ b/tests/compiler/dart2js/unparser_test.dart
@@ -287,6 +287,23 @@
   testUnparseTopLevelWithMetadata('class Fisk{operator-(x){}}');
 }
 
+testMixinApplications() {
+  testUnparseTopLevelWithMetadata('typedef C = S with M;');
+  testUnparseTopLevelWithMetadata('typedef C = S with M1,M2;');
+  testUnparseTopLevelWithMetadata('typedef C = S with M1,M2,M3;');
+
+  testUnparseTopLevelWithMetadata('typedef C<A> = S with M;');
+  testUnparseTopLevelWithMetadata('typedef C<A,B> = S with M;');
+
+  testUnparseTopLevelWithMetadata('typedef C = S<A> with M;');
+  testUnparseTopLevelWithMetadata('typedef C = S<A,B> with M;');
+
+  testUnparseTopLevelWithMetadata('typedef C = S with M<A>;');
+  testUnparseTopLevelWithMetadata('typedef C = S with M<A,B>;');
+  testUnparseTopLevelWithMetadata('typedef C = S with M1<A>,M2;');
+  testUnparseTopLevelWithMetadata('typedef C = S with M1,M2<A,B>;');
+}
+
 main() {
   testSignedConstants();
   testGenericTypes();
@@ -306,4 +323,5 @@
   testCombinators();
   testRedirectingFactoryConstructors();
   testClassDeclarations();
+  testMixinApplications();
 }
diff --git a/tests/compiler/dart2js/value_range_test.dart b/tests/compiler/dart2js/value_range_test.dart
index d23e933..03f91f7 100644
--- a/tests/compiler/dart2js/value_range_test.dart
+++ b/tests/compiler/dart2js/value_range_test.dart
@@ -231,6 +231,16 @@
     var length;
   }
   class JSNumber {
+    operator +(other) {}
+    operator -(other) {}
+    operator ~/(other) {}
+    operator /(other) {}
+    operator *(other) {}
+    operator <<(other) {}
+    operator >>(other) {}
+    operator |(other) {}
+    operator &(other) {}
+    operator ^(other) {}
   }
   class JSInt {
   }
diff --git a/tests/corelib/iterable_min_max_test.dart b/tests/corelib/iterable_min_max_test.dart
index 9d7ca90..1a8c4fd 100644
--- a/tests/corelib/iterable_min_max_test.dart
+++ b/tests/corelib/iterable_min_max_test.dart
@@ -26,14 +26,14 @@
 testMinMax(iterable, min, max) {
   Expect.equals(min, iterable.min());
   Expect.equals(min, iterable.min(Comparable.compare));
-  Expect.equals(min, Collections.min(iterable));
-  Expect.equals(min, Collections.min(iterable, Comparable.compare));
+  Expect.equals(min, IterableMixinWorkaround.min(iterable));
+  Expect.equals(min, IterableMixinWorkaround.min(iterable, Comparable.compare));
   Expect.equals(max, iterable.min((a, b) => Comparable.compare(b, a)));
 
   Expect.equals(max, iterable.max());
   Expect.equals(max, iterable.max(Comparable.compare));
-  Expect.equals(max, Collections.max(iterable));
-  Expect.equals(max, Collections.max(iterable, Comparable.compare));
+  Expect.equals(max, IterableMixinWorkaround.max(iterable));
+  Expect.equals(max, IterableMixinWorkaround.max(iterable, Comparable.compare));
   Expect.equals(min, iterable.max((a, b) => Comparable.compare(b, a)));
 }
 
@@ -57,18 +57,18 @@
 
   // Objects that are not Comparable.
   Expect.equals(const C(0), cList.min(compareC));
-  Expect.equals(const C(0), Collections.min(cList, compareC));
+  Expect.equals(const C(0), IterableMixinWorkaround.min(cList, compareC));
   Expect.equals(const C(0), new List.from(cList).min(compareC));
-  Expect.equals(const C(0), Collections.min(new List.from(cList), compareC));
+  Expect.equals(const C(0), IterableMixinWorkaround.min(new List.from(cList), compareC));
   Expect.equals(const C(0), new Set.from(cList).min(compareC));
-  Expect.equals(const C(0), Collections.min(new Set.from(cList), compareC));
+  Expect.equals(const C(0), IterableMixinWorkaround.min(new Set.from(cList), compareC));
 
   Expect.equals(const C(10), cList.max(compareC));
-  Expect.equals(const C(10), Collections.max(cList, compareC));
+  Expect.equals(const C(10), IterableMixinWorkaround.max(cList, compareC));
   Expect.equals(const C(10), new List.from(cList).max(compareC));
-  Expect.equals(const C(10), Collections.max(new List.from(cList), compareC));
+  Expect.equals(const C(10), IterableMixinWorkaround.max(new List.from(cList), compareC));
   Expect.equals(const C(10), new Set.from(cList).max(compareC));
-  Expect.equals(const C(10), Collections.max(new Set.from(cList), compareC));
+  Expect.equals(const C(10), IterableMixinWorkaround.max(new Set.from(cList), compareC));
 
   bool checkedMode = false;
   assert(checkedMode = true);
diff --git a/tests/corelib/maps_test.dart b/tests/corelib/maps_test.dart
index dd521e6..6d51939 100644
--- a/tests/corelib/maps_test.dart
+++ b/tests/corelib/maps_test.dart
@@ -110,7 +110,7 @@
   void testForEachCollection(value) {
     other_map[value] = value;
   }
-  Collection values = Maps.getValues(map);
+  Iterable values = Maps.getValues(map);
   other_map = new Map();
   values.forEach(testForEachCollection);
   Expect.equals(true, !other_map.containsKey(key1));
diff --git a/tests/html/audiocontext_test.dart b/tests/html/audiocontext_test.dart
index e2b471e..33a7907 100644
--- a/tests/html/audiocontext_test.dart
+++ b/tests/html/audiocontext_test.dart
@@ -21,10 +21,10 @@
       ArrayBufferView arrayBufferView = new Float32Array.fromList([]);
       try {
         // Test that native overload is chosen correctly. Native implementation
-        // should throw 'SYNTAX_ERR' DomException because the buffer is empty.
+        // should throw 'SyntaxError' DomException because the buffer is empty.
         AudioBuffer buffer = ctx.createBuffer(arrayBufferView.buffer, false);
       } catch (e) {
-        expect(e.code, equals(DomException.SYNTAX_ERR));
+        expect(e.name, DomException.SYNTAX);
       }
   });
 
diff --git a/tests/html/cache_test.dart b/tests/html/cache_test.dart
index d70a287..5f110b2 100644
--- a/tests/html/cache_test.dart
+++ b/tests/html/cache_test.dart
@@ -1,14 +1,28 @@
 library CacheTest;
 import '../../pkg/unittest/lib/unittest.dart';
-import '../../pkg/unittest/lib/html_config.dart';
+import '../../pkg/unittest/lib/html_individual_config.dart';
 import 'dart:html';
 
 main() {
-  useHtmlConfiguration();
-  test('ApplicationCache', () {
-    ApplicationCache appCache = window.applicationCache;
-    expect(cacheStatusToString(appCache.status), equals("UNCACHED"));
+  useHtmlIndividualConfiguration();
+
+  group('supported', () {
+    test('supported', () {
+      expect(ApplicationCache.supported, true);
+    });
   });
+
+  group('ApplicationCache', () {
+    test('ApplicationCache', () {
+      var expectation = ApplicationCache.supported ? returnsNormally : throws;
+      expect(() {
+        ApplicationCache appCache = window.applicationCache;
+        expect(cacheStatusToString(appCache.status), "UNCACHED");
+      }, expectation);
+
+    });
+  });
+
 }
 
 String cacheStatusToString(int status) {
diff --git a/tests/html/element_test.dart b/tests/html/element_test.dart
index bdcf12d..d849731 100644
--- a/tests/html/element_test.dart
+++ b/tests/html/element_test.dart
@@ -105,6 +105,129 @@
 
     test('.html has no parent', () =>
         expect(new Element.html('<br/>').parent, isNull));
+
+    test('.html table', () {
+      // http://developers.whatwg.org/tabular-data.html#tabular-data
+      var node = new Element.html('''
+<table>
+ <caption>Characteristics with positive and negative sides</caption>
+ <thead>
+  <tr>
+   <th id="n"> Negative
+   <th> Characteristic
+   <th> Positive
+ <tbody>
+  <tr>
+   <td headers="n r1"> Sad
+   <th id="r1"> Mood
+   <td> Happy
+  <tr>
+   <td headers="n r2"> Failing
+   <th id="r2"> Grade
+   <td> Passing
+</table>''');
+      expect(node, predicate((x) => x is TableElement, 'is a TableElement'));
+      expect(node.tagName, 'TABLE');
+      expect(node.parent, isNull);
+      expect(node.caption.innerHtml,
+          'Characteristics with positive and negative sides');
+      expect(node.tHead.rows.length, 1);
+      expect(node.tHead.rows[0].cells.length, 3);
+      expect(node.tBodies.length, 1);
+      expect(node.tBodies[0].rows.length, 2);
+      expect(node.tBodies[0].rows[1].cells.mappedBy((c) => c.innerHtml),
+          [' Failing\n   ', ' Grade\n   ', ' Passing\n']);
+    });
+
+    test('.html caption', () {
+      var node = new Element.html('<caption><p>Table 1.');
+      expect(node, predicate((x) => x is TableCaptionElement,
+          'is a TableCaptionElement'));
+      expect(node.tagName, 'CAPTION');
+      expect(node.parent, isNull);
+      expect(node.innerHtml, '<p>Table 1.</p>');
+    });
+
+    test('.html colgroup', () {
+      var node = new Element.html('<colgroup> <col> <col> <col>');
+      expect(node, predicate((x) => x is TableColElement,
+          'is a TableColElement'));
+      expect(node.tagName, 'COLGROUP');
+      expect(node.parent, isNull);
+      expect(node.innerHtml, ' <col> <col> <col>');
+    });
+
+    test('.html col', () {
+      var node = new Element.html('<col span="2">');
+      expect(node, predicate((x) => x is TableColElement,
+          'is a TableColElement'));
+      expect(node.tagName, 'COL');
+      expect(node.parent, isNull);
+      expect(node.outerHtml, '<col span="2">');
+    });
+
+    test('.html tbody', () {
+      var innerHtml = '<tr><td headers="n r1">Sad</td><td>Happy</td></tr>';
+      var node = new Element.html('<tbody>$innerHtml');
+      expect(node, predicate((x) => x is TableSectionElement,
+          'is a TableSectionElement'));
+      expect(node.tagName, 'TBODY');
+      expect(node.parent, isNull);
+      expect(node.rows.length, 1);
+      expect(node.rows[0].cells.length, 2);
+      expect(node.innerHtml, innerHtml);
+    });
+
+    test('.html thead', () {
+      var innerHtml = '<tr><th id="n">Negative</th><th>Positive</th></tr>';
+      var node = new Element.html('<thead>$innerHtml');
+      expect(node, predicate((x) => x is TableSectionElement,
+          'is a TableSectionElement'));
+      expect(node.tagName, 'THEAD');
+      expect(node.parent, isNull);
+      expect(node.rows.length, 1);
+      expect(node.rows[0].cells.length, 2);
+      expect(node.innerHtml, innerHtml);
+    });
+
+    test('.html tfoot', () {
+      var innerHtml = '<tr><th>percentage</th><td>34.3%</td></tr>';
+      var node = new Element.html('<tfoot>$innerHtml');
+      expect(node, predicate((x) => x is TableSectionElement,
+          'is a TableSectionElement'));
+      expect(node.tagName, 'TFOOT');
+      expect(node.parent, isNull);
+      expect(node.rows.length, 1);
+      expect(node.rows[0].cells.length, 2);
+      expect(node.innerHtml, innerHtml);
+    });
+
+    test('.html tr', () {
+      var node = new Element.html('<tr><td>foo<td>bar');
+      expect(node, predicate((x) => x is TableRowElement,
+          'is a TableRowElement'));
+      expect(node.tagName, 'TR');
+      expect(node.parent, isNull);
+      expect(node.cells.mappedBy((c) => c.innerHtml), ['foo', 'bar']);
+    });
+
+    test('.html td', () {
+      var node = new Element.html('<td>foobar');
+      expect(node, predicate((x) => x is TableCellElement,
+          'is a TableCellElement'));
+      expect(node.tagName, 'TD');
+      expect(node.parent, isNull);
+      expect(node.innerHtml, 'foobar');
+    });
+
+    test('.html th', () {
+      var node = new Element.html('<th>foobar');
+      expect(node, predicate((x) => x is TableCellElement,
+          'is a TableCellElement'));
+      expect(node.tagName, 'TH');
+      expect(node.parent, isNull);
+      expect(node.innerHtml, 'foobar');
+    });
   });
 
   group('eventListening', () {
diff --git a/tests/html/element_types_test.dart b/tests/html/element_types_test.dart
index acc20b1..9ef2449 100644
--- a/tests/html/element_types_test.dart
+++ b/tests/html/element_types_test.dart
@@ -128,18 +128,9 @@
     test('fieldset', () {
       expect((new FieldSetElement()) is FieldSetElement, true);
     });
-    test('font', () {
-      expect((new Element.tag('font')) is FontElement, true);
-    });
     test('form', () {
       expect((new FormElement()) is FormElement, true);
     });
-    test('frame', () {
-      expect((new Element.tag('frame')) is FrameElement, true);
-    });
-    test('frameset', () {
-      expect((new Element.tag('frameset')) is FrameSetElement, true);
-    });
     test('head', () {
       expect((new HeadElement()) is HeadElement, true);
     });
@@ -200,10 +191,6 @@
     test('map', () {
       expect((new MapElement()) is MapElement, true);
     });
-    test('marquee', () {
-      expect((new Element.tag('marquee')) is MarqueeElement,
-          MarqueeElement.supported);
-    });
     test('menu', () {
       expect((new MenuElement()) is MenuElement, true);
     });
diff --git a/tests/html/exceptions_test.dart b/tests/html/exceptions_test.dart
index 01fcd7c..e4bbe6b 100644
--- a/tests/html/exceptions_test.dart
+++ b/tests/html/exceptions_test.dart
@@ -5,24 +5,14 @@
 
 main() {
   useHtmlConfiguration();
-  test('DomException', () {
-    try {
-      window.webkitNotifications.createNotification('', '', '');
-    } on DomException catch (e) {
-      expect(e.code, DomException.SECURITY_ERR);
-      expect(e.name, 'SecurityError');
-      expect(e.message, 'SecurityError: DOM Exception 18');
-    }
-  });
+
   test('EventException', () {
     final event = new Event('Event');
     // Intentionally do not initialize it!
     try {
       document.$dom_dispatchEvent(event);
     } on EventException catch (e) {
-      expect(e.code, EventException.UNSPECIFIED_EVENT_TYPE_ERR);
-      expect(e.name, 'UNSPECIFIED_EVENT_TYPE_ERR');
-      expect(e.message, 'UNSPECIFIED_EVENT_TYPE_ERR: DOM Events Exception 0');
+      expect(e.name, DomException.UNSPECIFIED_EVENT_TYPE);
     }
   });
 }
diff --git a/tests/html/html.status b/tests/html/html.status
index 6738764..150e3b4 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -20,10 +20,10 @@
 input_element_test/supported_month: Fail
 input_element_test/supported_week: Fail
 shadow_dom_test/supported: Fail
+css_test: Pass, Fail # Issue 7978
 
 [ $runtime == chrome || $runtime == drt]
 audiobuffersourcenode_test: Pass, Fail  # AudiobufferSourceNode is flaky on Chrome and Dartium.
-audiocontext_test: Skip # Need to adjust to new API.
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium) ]
 request_animation_frame_test: Skip   # drt hangs; requestAnimationFrame not implemented
@@ -54,7 +54,6 @@
 element_types_test/supported_object: Fail
 element_types_test/supported_output: Fail
 element_types_test/supported_shadow: Fail
-exceptions_test: Fail
 form_data_test: Fail # TODO(efortuna): Issue 7875.
 fileapi_test/supported: Fail
 inner_frame_test: Skip
@@ -66,13 +65,14 @@
 input_element_test/supported_week: Fail
 isolates_test: Skip
 measurement_test: Fail, Pass
+media_stream_test/supported: Fail
 messageevent_test: Fail
 mutationobserver_test/supported: Fail
 native_gc_test: Fail, Pass # BUG(7774): Untriaged.
+notifications_test/supported: Fail
 serialized_script_value_test: Fail
 shadow_dom_test/supported: Fail
 storage_test: Fail, Pass
-streams_test: Fail # Bug 7888
 svgelement_test/additionalConstructors: Fail
 svgelement2_test: Fail
 svg_3_test: Fail
@@ -107,11 +107,10 @@
 audiobuffersourcenode_test: Fail
 audiocontext_test: Fail
 blob_constructor_test: Fail
-cache_test: fail              # IE9 does not support ApplicationCache, but IE 10 does (and should work).
+cache_test/supported: Fail
 css_test: Fail
 dom_constructors_test: Fail
 element_test/matches: Fail # IE9 does not support matches
-exceptions_test: Fail
 fileapi_test/supported: Fail
 history_test/supported_state: Fail
 indexeddb_1_test/supported: Fail
@@ -127,12 +126,13 @@
 input_element_test/supported_time: Fail
 input_element_test/supported_url: Fail
 input_element_test/supported_week: Fail
+media_stream_test/supported: Fail
 messageevent_test: Fail
 mutationobserver_test/supported: Fail
+notifications_test/supported: Fail
 postmessage_structured_test: Skip   # BUG(5685): times out.
 serialized_script_value_test: Fail
 shadow_dom_test/supported: Fail
-streams_test: Fail # Bug 7888
 svg_3_test: Fail
 svgelement_test/additionalConstructors: Fail
 svgelement2_test: Fail
@@ -162,6 +162,7 @@
 input_element_test/supported_time: Fail, Crash
 input_element_test/supported_week: Fail, Crash
 fileapi_test/supported: Fail
+media_stream_test/supported: Fail
 node_test: Skip # Issue 6457
 shadow_dom_test/supported: Fail
 
@@ -173,7 +174,6 @@
 element_test/eventListening: Fail # Issue: 7413
 element_test/children: Fail # Issue: 7413
 audiobuffersourcenode_test: Fail
-cache_test: Fail
 canvas_test: Pass,Fail
 audiocontext_test: Fail
 blob_constructor_test: Fail
@@ -188,10 +188,10 @@
 element_test/eventListening: Crash
 element_test/queryAll: Fail
 element_webkit_test: Fail
-exceptions_test: Fail
 htmlelement_test: Fail
 indexeddb_1_test/supported: Fail
 mutationobserver_test/supported: Fail
+notifications_test/supported: Fail
 performance_api_test/supported: Fail
 serialized_script_value_test: Fail
 svg_3_test: Fail
@@ -218,7 +218,6 @@
 element_types_test/supported_keygen: Fail
 element_types_test/supported_shadow: Fail
 element_types_test/supported_track: Fail
-exceptions_test: Fail      # Uses webkitotifications, no analogue in moz
 fileapi_test/supported: Fail
 # setup code fails. prepare. (DOM callback has errors) Caught [object Event]
 inner_frame_test: Skip
@@ -230,14 +229,15 @@
 input_element_test/supported_week: Fail
 input_element_test/supported_number: Fail
 input_element_test/supported_range: Fail
+notifications_test/supported: Fail
 shadow_dom_test/supported: Fail
-streams_test: Fail # Bug 7888
 # Interfaces not implemented: SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable
 svg_3_test: Fail
 svgelement_test/additionalConstructors: Fail
 svgelement2_test: Fail
 transferables_test: Fail   # Issue 3392.
 websql_test: Fail # FF does not support web SQL
+wheelevent_test: Skip # Times out on FF 16. Issue 7943
 
 [ $runtime == ie9 && ($system == linux || $system == macos) ]
 *: Skip
diff --git a/tests/html/media_stream_test.dart b/tests/html/media_stream_test.dart
new file mode 100644
index 0000000..1e97511
--- /dev/null
+++ b/tests/html/media_stream_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library media_stream_test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_individual_config.dart';
+import 'dart:html';
+
+main() {
+  useHtmlIndividualConfiguration();
+
+  group('supported', () {
+    test('supported', () {
+      expect(MediaStream.supported, true);
+    });
+  });
+
+  // No additional tests right now since this API prompts for user input to
+  // continue.
+}
diff --git a/tests/html/native_gc_test.dart b/tests/html/native_gc_test.dart
index 87251be..e85acfb 100644
--- a/tests/html/native_gc_test.dart
+++ b/tests/html/native_gc_test.dart
@@ -32,17 +32,21 @@
   });
 
   test('WindowEventListener', () {
+    String message = 'WindowEventListenerTestPingMessage';
+
     Element testDiv = new DivElement();
     testDiv.id = '#TestDiv';
     document.body.nodes.add(testDiv);
-    window.on.message.add((e) => testDiv.click());
+    window.on.message.add((e) {
+      if (e.data == message) testDiv.click();
+    });
 
     for (int i = 0; i < 100; ++i) {
       triggerMajorGC();
     }
 
     testDiv.on.click.add(expectAsync1((e) {}));
-    window.postMessage('test', '*');
+    window.postMessage(message, '*');
   });
 }
 
diff --git a/tests/html/notifications_test.dart b/tests/html/notifications_test.dart
new file mode 100644
index 0000000..8561257
--- /dev/null
+++ b/tests/html/notifications_test.dart
@@ -0,0 +1,34 @@
+library NotificationsTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_individual_config.dart';
+import 'dart:html';
+
+main() {
+  useHtmlIndividualConfiguration();
+
+  group('supported', () {
+    test('supported', () {
+      expect(NotificationCenter.supported, true);
+    });
+  });
+
+  group('unsupported throws', () {
+    test('createNotification', () {
+      var expectation = NotificationCenter.supported ? returnsNormally : throws;
+      expect(() { window.notifications.createNotification; }, expectation);
+    });
+  });
+
+  group('webkitNotifications', () {
+    if (NotificationCenter.supported) {
+      test('DomException', () {
+        try {
+          window.notifications.createNotification('', '', '');
+        } on DomException catch (e) {
+          expect(e.name, DomException.SECURITY);
+        }
+      });
+    }
+  });
+}
+
diff --git a/tests/html/streams_test.dart b/tests/html/streams_test.dart
index 8d76320..a0f3a71 100644
--- a/tests/html/streams_test.dart
+++ b/tests/html/streams_test.dart
@@ -6,20 +6,18 @@
 
 class StreamHelper {
   var _a;
-  var _b;
   StreamHelper() {
     _a = new TextInputElement();
     document.body.append(_a);
-    _b = new TextInputElement();
-    document.body.append(_b);
   }
 
+  Element get element => _a;
   Stream<Event> get stream => _a.onFocus;
 
   // Causes an event on a to be fired.
   void pulse() {
-    _b.focus();
-    _a.focus();
+    var event = new Event('focus');
+    _a.$dom_dispatchEvent(event);
   }
 }
 
@@ -27,15 +25,14 @@
   useHtmlConfiguration();
 
   test('simple', () {
-    var a = new TextInputElement();
-    document.body.append(a);
+    var helper = new StreamHelper();
 
     var callCount = 0;
-    a.onFocus.listen((Event e) {
+    helper.stream.listen((Event e) {
       ++callCount;
     });
 
-    a.focus();
+    helper.pulse();
     expect(callCount, 1);
   });
 
@@ -44,8 +41,8 @@
     var parent = new DivElement();
     document.body.append(parent);
 
-    var child = new TextInputElement();
-    parent.append(child);
+    var helper = new StreamHelper();
+    parent.append(helper.element);
 
     var childCallCount = 0;
     var parentCallCount = 0;
@@ -54,12 +51,13 @@
       expect(childCallCount, 0);
     });
 
-    Element.focusEvent.forTarget(child, useCapture: true).listen((Event e) {
-      ++childCallCount;
-      expect(parentCallCount, 1);
-    });
+    Element.focusEvent.forTarget(helper.element, useCapture: true).listen(
+        (Event e) {
+          ++childCallCount;
+          expect(parentCallCount, 1);
+        });
 
-    child.focus();
+    helper.pulse();
     expect(childCallCount, 1);
     expect(parentCallCount, 1);
   });
diff --git a/tests/html/wheelevent_test.dart b/tests/html/wheelevent_test.dart
new file mode 100644
index 0000000..fed10deb
--- /dev/null
+++ b/tests/html/wheelevent_test.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library wheel_event_test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
+
+
+main() {
+
+  useHtmlConfiguration();
+
+  var userAgent = window.navigator.userAgent;
+
+  // Lame platform-dependent check to validate that our assumptions about
+  // which event is being used is correct.
+  var wheelEvent = 'wheel';
+  if (userAgent.contains("Opera", 0)) {
+    wheelEvent = 'mousewheel';
+  } else if (userAgent.contains("MSIE", 0)) {
+    wheelEvent = 'mousewheel';
+  } else if (userAgent.contains('Firefox')) {
+    // FF appears to have recently added support for wheel.
+    wheelEvent = 'wheel';
+  } else if (userAgent.contains('WebKit', 0)) {
+    wheelEvent = 'mousewheel';
+  }
+
+  test('wheelEvent', () {
+    var element = new DivElement();
+    element.on.mouseWheel.add(expectAsync1((e) {
+      expect(e.screenX, 100);
+      expect(e.deltaX, 0);
+      expect(e.deltaY, 240);
+    }));
+    var event = new WheelEvent(wheelEvent,
+      window,
+      0,
+      240,
+      0,
+      100,
+      200,
+      10,
+      20,
+      0);
+    element.$dom_dispatchEvent(event);
+  });
+
+  test('wheelEvent Stream', () {
+    var element = new DivElement();
+    element.onMouseWheel.listen(expectAsync1((e) {
+      expect(e.screenX, 100);
+      expect(e.deltaX, 0);
+      expect(e.deltaY, 240);
+    }));
+    var event = new WheelEvent(wheelEvent,
+      window,
+      0,
+      240,
+      0,
+      100,
+      200,
+      10,
+      20,
+      0);
+    element.$dom_dispatchEvent(event);
+  });
+}
diff --git a/tests/isolate/count_test.dart b/tests/isolate/count_test.dart
index be1d65a..7ad82d6 100644
--- a/tests/isolate/count_test.dart
+++ b/tests/isolate/count_test.dart
@@ -30,6 +30,12 @@
 
     local.receive(expectAsync2((int message, SendPort replyTo) {
       if (message == -1) {
+        // [count] is '11' because when we sent '9' to [remote],
+        // the other isolate will send another message '18', that this
+        // isolate will receive. Then this isolate will send '10' to
+        // [remote] and increment [count]. Note that this last '10'
+        // message will not be received by the other isolate, since it
+        // received '-1' before.
         expect(count, 11);
         local.close();
         return;
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index edf1b8b..5d3f8f1 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -89,6 +89,7 @@
 spawn_uri_vm_negative_test: Skip # ditto above.
 timer_not_available_test: Fail, OK # only meant to test when there is no way to
                                    # implement timer (currently only in d8)
+isolate2_negative_test: Fail, Pass # Issue 7769
 
 [ $compiler == dart2js && $jscl ]
 multiple_timer_test: Fail,OK # Needs Timer to run.
@@ -113,3 +114,6 @@
 # TODO(ajohnsen): Fix this as part of library changes.
 [ $compiler == none ]
 isolate_negative_test: Skip # Bug 6890
+
+[ $compiler == dart2js && $runtime == ff && $system == windows ]
+mandel_isolate_test: Pass, Fail, Timeout # Issue 7952
diff --git a/tests/language/arithmetic_test.dart b/tests/language/arithmetic_test.dart
index c55409f..f230b3c 100644
--- a/tests/language/arithmetic_test.dart
+++ b/tests/language/arithmetic_test.dart
@@ -209,11 +209,14 @@
     Expect.equals(0.0, (0.0).ceil());
     Expect.equals(false, (0.0).ceil().isNegative);
     Expect.equals(1.0, (0.1).ceil());
+    Expect.equals(1.0, double.MIN_POSITIVE.ceil());
+    Expect.equals(1.0, (0.49999999999999994).ceil());
     Expect.equals(-0.0, (-0.0).ceil());
     Expect.equals(-0.0, (-0.3).ceil());
-    // TODO(srdjan): enable the following tests once isNegative works.
-    // Expect.equals(true, (-0.0).ceil().isNegative);
-    // Expect.equals(true, (-0.3).ceil().isNegative);
+    Expect.isTrue((-0.0).ceil().isNegative);
+    Expect.isTrue((-0.3).ceil().isNegative);
+    Expect.equals(-0.0, (-0.49999999999999994).ceil());
+    Expect.isTrue((-0.49999999999999994).ceil().isNegative);
     Expect.equals(3.0, (2.1).ceil());
     Expect.equals(-2.0, (-2.1).ceil());
 
@@ -228,14 +231,18 @@
     // Double.
     Expect.equals(0.0, (0.0).floor());
     Expect.equals(0.0, (0.1).floor());
+    Expect.equals(0.0, (0.49999999999999994).floor());
+    Expect.equals(0.0, double.MIN_POSITIVE.floor());
     Expect.equals(false, (0.0).floor().isNegative);
     Expect.equals(false, (0.1).floor().isNegative);
     Expect.equals(-0.0, (-0.0).floor());
-    // TODO(srdjan): enable the following tests once isNegative works.
-    // Expect.equals(true, (-0.0).floor().isNegative);
+    Expect.equals(true, (-0.0).floor().isNegative);
     Expect.equals(-1.0, (-0.1).floor());
+    Expect.equals(-1.0, (-0.49999999999999994).floor());
     Expect.equals(2.0, (2.1).floor());
     Expect.equals(-3.0, (-2.1).floor());
+    Expect.equals(-3.0, (-2.1).floor());
+
 
     // -- truncate --.
     // Smi.
@@ -252,9 +259,8 @@
     Expect.equals(false, (0.1).truncate().isNegative);
     Expect.equals(-0.0, (-0.0).truncate());
     Expect.equals(-0.0, (-0.3).truncate());
-    // TODO(srdjan): enable the following tests once isNegative works.
-    // Expect.equals(true, (-0.0).truncate().isNegative);
-    // Expect.equals(true, (-0.3).truncate().isNegative);
+    Expect.equals(true, (-0.0).truncate().isNegative);
+    Expect.equals(true, (-0.3).truncate().isNegative);
     Expect.equals(2.0, (2.1).truncate());
     Expect.equals(-2.0, (-2.1).truncate());
 
@@ -419,10 +425,19 @@
     for (var i = 0; i < 10; i++) Expect.equals(0x40000000, div(a, b));
   }
 
+  static mySqrt(var x) => sqrt(x);
+
+  static testSqrtDeopt() {
+    for (var i = 0; i < 10; i++) mySqrt(4.0);
+    Expect.equals(2.0, mySqrt(4.0));
+    Expect.throws(() => mySqrt("abc"));
+  }
+
   static testMain() {
     for (int i = 0; i < 1500; i++) {
       runOne();
       testSmiDivDeopt();
+      testSqrtDeopt();
     }
   }
 }
diff --git a/tests/language/closure_parameter_types_test.dart b/tests/language/closure_parameter_types_test.dart
new file mode 100644
index 0000000..a9fa956
--- /dev/null
+++ b/tests/language/closure_parameter_types_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for dart2js, where the optimizer was too agressive
+// about parameter types of closures.
+
+class A {
+  Function f;
+  A(this.f);
+  _do() => f(1);
+}
+
+main() {
+  int invokeCount = 0;
+  closure(a) {
+    if (invokeCount++ == 1) {
+      Expect.isTrue(a is int);
+    }
+  }
+  closure('s');
+  new A(closure)._do();
+  Expect.equals(2, invokeCount);
+}
diff --git a/tests/language/fast_method_extraction_test.dart b/tests/language/fast_method_extraction_test.dart
new file mode 100644
index 0000000..22177c7
--- /dev/null
+++ b/tests/language/fast_method_extraction_test.dart
@@ -0,0 +1,104 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test that fast method extraction returns correct closure.
+
+class A {
+  var f;
+  A(this.f);
+  foo() => 40 + f;
+}
+
+class B {
+  var f;
+  B(this.f);
+  foo() => -40 - f;
+}
+
+class X { }
+
+class C<T> {
+  foo(v) => v is T;
+}
+
+class ChaA {
+  final magic;
+  ChaA(magic) : this.magic = magic;
+
+  foo() {
+    Expect.isTrue(this is ChaA);
+    Expect.equals("magicA", magic);
+    return "A";
+  }
+
+  bar() => foo;
+}
+
+class ChaB extends ChaA {
+  ChaB(magic) : super(magic);
+
+  foo() {
+    Expect.isTrue(this is ChaB);
+    Expect.equals("magicB", magic);
+    return "B";
+  }
+}
+
+mono(a) {
+  var f = a.foo;
+  return f();
+}
+
+poly(a) {
+  var f = a.foo;
+  return f();
+}
+
+types(a, b) {
+  var f = a.foo;
+  Expect.isTrue(f(b));
+}
+
+cha(a) {
+  var f = a.bar();
+  return f();
+}
+
+extractFromNull() {
+  var f = (null).toString;
+  Expect.equals("null", f());
+}
+
+main() {
+  var a = new A(2);
+  var b = new B(2);
+  for (var i = 0; i < 10000; i++) {
+    Expect.equals(42, mono(a));
+  }
+
+  for (var i = 0; i < 10000; i++) {
+    Expect.equals(42, poly(a));
+    Expect.equals(-42, poly(b));
+  }
+
+  var c = new C<X>();
+  var x = new X();
+  for (var i = 0; i < 10000; i++) {
+    types(c, x);
+  }
+
+  var chaA = new ChaA("magicA");
+  for (var i = 0; i < 10000; i++) {
+    Expect.equals("A", cha(chaA));
+  }
+
+  var chaB = new ChaB("magicB");
+  for (var i = 0; i < 10000; i++) {
+    Expect.equals("B", cha(chaB));
+  }
+
+  for (var i = 0; i < 10000; i++) {
+    extractFromNull();
+  }
+}
+
diff --git a/tests/language/language.status b/tests/language/language.status
index f96dc1f..99653af 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -56,6 +56,15 @@
 
 type_parameter_literal_test: Fail # Issue 7551
 
+mixin_field_test: Fail
+mixin_is_test: Fail
+mixin_method_test: Fail
+mixin_naming_test: Fail
+
+mixin_extends_field_test: Fail
+mixin_extends_is_test: Fail
+mixin_extends_method_test: Fail
+
 [ $compiler == none && ($system == macos || $system == linux) && $arch == ia32 && $checked ]
 gc_test: Skip  # Issue 1487, flaky.
 
@@ -90,9 +99,6 @@
 list_literal1_negative_test: Fail
 map_literal1_negative_test: Fail
 
-# test issue XXXX
-naming_test: Fail
-
 library_juxtaposition_test: Fail # Issue 6881
 new_expression_type_args_test/0*: Fail # Wrongly reports compile-time error.
 redirecting_factory_infinite_steps_test/01: Fail # http://dartbug.com/6560
@@ -343,6 +349,16 @@
 many_overridden_no_such_method_test: Fail, Pass, OK # Fails in minified mode, test depends on method names.
 overridden_no_such_method_test: Fail, Pass, OK # Fails in minified mode, test depends on method names.
 
+# Mixins aren't unparsed the right way yet.
+mixin_field_test: Fail # http://dartbug.com/7972
+mixin_is_test: Fail # http://dartbug.com/7972
+mixin_method_test: Fail # http://dartbug.com/7972
+mixin_naming_test: Fail # http://dartbug.com/7972
+
+mixin_extends_field_test: Fail # http://dartbug.com/7972
+mixin_extends_is_test: Fail # http://dartbug.com/7972
+mixin_extends_method_test: Fail # http://dartbug.com/7972
+
 # Malformed types not handled as unresolved:
 import_core_prefix_test: Fail
 prefix16_test: Fail
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 78b3fd4..88e22f0 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -46,7 +46,6 @@
 type_variable_bounds2_test/03: Fail
 type_variable_bounds2_test/05: Fail
 type_variable_bounds2_test/06: Pass # For the wrong reasons.
-assign_top_method_test: Pass # For the wrong reasons.
 f_bounded_quantification_test/01: Fail
 f_bounded_quantification_test/02: Fail
 closure_type_test: Fail # does not detect type error in checked mode.
@@ -111,8 +110,6 @@
 final_variable_assignment_test/04: Fail
 bad_override_test/01: Fail
 bad_override_test/02: Fail
-const_locals_test: Fail
-const_nested_test: Fail
 bad_constructor_test/04: Fail # http://dartbug.com/5519
 bad_constructor_test/05: Fail # http://dartbug.com/5519
 bad_constructor_test/06: Fail # http://dartbug.com/5519
@@ -134,8 +131,6 @@
 infinity_test: Fail # Issue 4984
 positive_bit_operations_test: Fail # (floitsch): This will be fixed when dart2js uses unsigned input for >>.
 
-getter_declaration_negative_test: Fail # This will be fixed when dart2js reject old getter syntax.
-
 compile_time_constant8_test: Fail # We don't take the generic type into account yet.
 canonical_const_test: Fail # We don't take the generic type into account yet.
 type_parameter_literal_test: Fail # Type parameters aren't supported as literals yet.
@@ -328,7 +323,6 @@
 # of failing.
 const_factory_negative_test: Crash, Fail
 
-[ $compiler == dart2js && $mode == release ]
 assign_top_method_test: Fail
 
 
diff --git a/tests/language/mixin_extends_field_test.dart b/tests/language/mixin_extends_field_test.dart
new file mode 100644
index 0000000..eafc0e8
--- /dev/null
+++ b/tests/language/mixin_extends_field_test.dart
@@ -0,0 +1,118 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class S {
+  var foo = "S-foo";
+}
+
+class M1 {
+  final bar = "M1-bar";
+}
+
+class M2 {
+  var baz = "M2-baz";
+}
+
+class C extends S with M1 { }
+class D extends S with M1, M2 { }
+class E extends S with M2, M1 { }
+
+class F extends E {
+  var fez = "F-fez";
+}
+
+main() {
+  var c = new C();
+  var d = new D();
+  var e = new E();
+  var f = new F();
+
+  Expect.equals("S-foo", c.foo);
+  Expect.equals("S-foo", d.foo);
+  Expect.equals("S-foo", e.foo);
+  Expect.equals("S-foo", f.foo);
+
+  Expect.equals("M1-bar", c.bar);
+  Expect.equals("M1-bar", d.bar);
+  Expect.equals("M1-bar", e.bar);
+  Expect.equals("M1-bar", f.bar);
+
+  Expect.throws(() => c.baz, (error) => error is NoSuchMethodError);
+  Expect.equals("M2-baz", d.baz);
+  Expect.equals("M2-baz", e.baz);
+  Expect.equals("M2-baz", f.baz);
+
+  Expect.throws(() => c.fez, (error) => error is NoSuchMethodError);
+  Expect.throws(() => d.fez, (error) => error is NoSuchMethodError);
+  Expect.throws(() => e.fez, (error) => error is NoSuchMethodError);
+  Expect.equals("F-fez", f.fez);
+
+  c.foo = "S-foo-c";
+  Expect.equals("S-foo-c", c.foo);
+  Expect.equals("S-foo", d.foo);
+  Expect.equals("S-foo", e.foo);
+  Expect.equals("S-foo", f.foo);
+
+  d.foo = "S-foo-d";
+  Expect.equals("S-foo-c", c.foo);
+  Expect.equals("S-foo-d", d.foo);
+  Expect.equals("S-foo", e.foo);
+  Expect.equals("S-foo", f.foo);
+
+  e.foo = "S-foo-e";
+  Expect.equals("S-foo-c", c.foo);
+  Expect.equals("S-foo-d", d.foo);
+  Expect.equals("S-foo-e", e.foo);
+  Expect.equals("S-foo", f.foo);
+
+  f.foo = "S-foo-f";
+  Expect.equals("S-foo-c", c.foo);
+  Expect.equals("S-foo-d", d.foo);
+  Expect.equals("S-foo-e", e.foo);
+  Expect.equals("S-foo-f", f.foo);
+
+  Expect.throws(() => c.bar = 0, (error) => error is NoSuchMethodError);
+  Expect.throws(() => d.bar = 0, (error) => error is NoSuchMethodError);
+  Expect.throws(() => e.bar = 0, (error) => error is NoSuchMethodError);
+  Expect.throws(() => f.bar = 0, (error) => error is NoSuchMethodError);
+  Expect.equals("M1-bar", c.bar);
+  Expect.equals("M1-bar", d.bar);
+  Expect.equals("M1-bar", e.bar);
+  Expect.equals("M1-bar", f.bar);
+
+  Expect.throws(() => c.baz = 0, (error) => error is NoSuchMethodError);
+  Expect.throws(() => c.baz, (error) => error is NoSuchMethodError);
+  Expect.equals("M2-baz", d.baz);
+  Expect.equals("M2-baz", e.baz);
+  Expect.equals("M2-baz", f.baz);
+
+  d.baz = "M2-baz-d";
+  Expect.throws(() => c.baz, (error) => error is NoSuchMethodError);
+  Expect.equals("M2-baz-d", d.baz);
+  Expect.equals("M2-baz", e.baz);
+  Expect.equals("M2-baz", f.baz);
+  Expect.equals("M2-baz", f.baz);
+
+  e.baz = "M2-baz-e";
+  Expect.throws(() => c.baz, (error) => error is NoSuchMethodError);
+  Expect.equals("M2-baz-d", d.baz);
+  Expect.equals("M2-baz-e", e.baz);
+  Expect.equals("M2-baz", f.baz);
+
+  f.baz = "M2-baz-f";
+  Expect.throws(() => c.baz, (error) => error is NoSuchMethodError);
+  Expect.equals("M2-baz-d", d.baz);
+  Expect.equals("M2-baz-e", e.baz);
+  Expect.equals("M2-baz-f", f.baz);
+
+  Expect.throws(() => c.fez = 0, (error) => error is NoSuchMethodError);
+  Expect.throws(() => d.fez = 0, (error) => error is NoSuchMethodError);
+  Expect.throws(() => e.fez = 0, (error) => error is NoSuchMethodError);
+
+  f.fez = "F-fez-f";
+  Expect.throws(() => c.fez, (error) => error is NoSuchMethodError);
+  Expect.throws(() => d.fez, (error) => error is NoSuchMethodError);
+  Expect.throws(() => e.fez, (error) => error is NoSuchMethodError);
+  Expect.equals("F-fez-f", f.fez);
+}
diff --git a/tests/language/mixin_extends_is_test.dart b/tests/language/mixin_extends_is_test.dart
new file mode 100644
index 0000000..4f08849
--- /dev/null
+++ b/tests/language/mixin_extends_is_test.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class S { }
+class M1 { }
+class M2 { }
+
+class C extends S with M1 { }
+class D extends S with M1, M2 { }
+class E extends S with M2, M1 { }
+class F extends E { }
+
+class C_ extends S with M1 { }
+class D_ extends S with M1, M2 { }
+class E_ extends S with M2, M1 { }
+class F_ extends E_ { }
+
+main() {
+  var c = new C();
+  Expect.isTrue(c is C);
+  Expect.isFalse(c is D);
+  Expect.isFalse(c is E);
+  Expect.isFalse(c is F);
+  Expect.isTrue(c is S);
+  Expect.isTrue(c is M1);
+  Expect.isFalse(c is M2);
+
+  var d = new D();
+  Expect.isFalse(d is C);
+  Expect.isTrue(d is D);
+  Expect.isFalse(d is E);
+  Expect.isFalse(d is F);
+  Expect.isTrue(d is S);
+  Expect.isTrue(d is M1);
+  Expect.isTrue(d is M2);
+
+  var e = new E();
+  Expect.isFalse(e is C);
+  Expect.isFalse(e is D);
+  Expect.isTrue(e is E);
+  Expect.isFalse(e is F);
+  Expect.isTrue(e is S);
+  Expect.isTrue(e is M1);
+  Expect.isTrue(e is M2);
+
+  var f = new F();
+  Expect.isFalse(f is C);
+  Expect.isFalse(f is D);
+  Expect.isTrue(f is E);
+  Expect.isTrue(f is F);
+  Expect.isTrue(f is S);
+  Expect.isTrue(f is M1);
+  Expect.isTrue(f is M2);
+
+  // Make sure we get a new class for each mixin
+  // application (at least the named ones).
+  Expect.isFalse(c is C_);
+  Expect.isFalse(c is D_);
+  Expect.isFalse(c is E_);
+  Expect.isFalse(c is F_);
+
+  Expect.isFalse(d is C_);
+  Expect.isFalse(d is D_);
+  Expect.isFalse(d is E_);
+  Expect.isFalse(d is F_);
+
+  Expect.isFalse(e is C_);
+  Expect.isFalse(e is D_);
+  Expect.isFalse(e is E_);
+  Expect.isFalse(e is F_);
+
+  Expect.isFalse(f is C_);
+  Expect.isFalse(f is D_);
+  Expect.isFalse(f is E_);
+  Expect.isFalse(f is F_);
+}
diff --git a/tests/language/mixin_extends_method_test.dart b/tests/language/mixin_extends_method_test.dart
new file mode 100644
index 0000000..9465ff0
--- /dev/null
+++ b/tests/language/mixin_extends_method_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class S {
+  foo() => "S-foo";
+  baz() => "S-baz";
+}
+
+class M1 {
+  bar() => "M1-bar";
+}
+
+class M2 {
+  bar() => "M2-bar";
+  baz() => "M2-baz";
+  fez() => "M2-fez";
+}
+
+class C extends S with M1 { }
+class D extends S with M1, M2 { }
+class E extends S with M2, M1 { }
+
+class F extends E {
+  fez() => "F-fez";
+}
+
+main() {
+  var c = new C();
+  Expect.equals("S-foo", c.foo());
+  Expect.equals("M1-bar", c.bar());
+  Expect.equals("S-baz", c.baz());
+  Expect.throws(() => c.fez(), (error) => error is NoSuchMethodError);
+
+  var d = new D();
+  Expect.equals("S-foo", d.foo());
+  Expect.equals("M2-bar", d.bar());
+  Expect.equals("M2-baz", d.baz());
+  Expect.equals("M2-fez", d.fez());
+
+  var e = new E();
+  Expect.equals("S-foo", e.foo());
+  Expect.equals("M1-bar", e.bar());
+  Expect.equals("M2-baz", e.baz());
+  Expect.equals("M2-fez", e.fez());
+
+  var f = new F();
+  Expect.equals("S-foo", f.foo());
+  Expect.equals("M1-bar", f.bar());
+  Expect.equals("M2-baz", f.baz());
+  Expect.equals("F-fez", f.fez());
+}
diff --git a/tests/language/mixin_field_test.dart b/tests/language/mixin_field_test.dart
new file mode 100644
index 0000000..251aa50
--- /dev/null
+++ b/tests/language/mixin_field_test.dart
@@ -0,0 +1,118 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class S {
+  var foo = "S-foo";
+}
+
+class M1 {
+  final bar = "M1-bar";
+}
+
+class M2 {
+  var baz = "M2-baz";
+}
+
+typedef C = S with M1;
+typedef D = S with M1, M2;
+typedef E = S with M2, M1;
+
+class F extends E {
+  var fez = "F-fez";
+}
+
+main() {
+  var c = new C();
+  var d = new D();
+  var e = new E();
+  var f = new F();
+
+  Expect.equals("S-foo", c.foo);
+  Expect.equals("S-foo", d.foo);
+  Expect.equals("S-foo", e.foo);
+  Expect.equals("S-foo", f.foo);
+
+  Expect.equals("M1-bar", c.bar);
+  Expect.equals("M1-bar", d.bar);
+  Expect.equals("M1-bar", e.bar);
+  Expect.equals("M1-bar", f.bar);
+
+  Expect.throws(() => c.baz, (error) => error is NoSuchMethodError);
+  Expect.equals("M2-baz", d.baz);
+  Expect.equals("M2-baz", e.baz);
+  Expect.equals("M2-baz", f.baz);
+
+  Expect.throws(() => c.fez, (error) => error is NoSuchMethodError);
+  Expect.throws(() => d.fez, (error) => error is NoSuchMethodError);
+  Expect.throws(() => e.fez, (error) => error is NoSuchMethodError);
+  Expect.equals("F-fez", f.fez);
+
+  c.foo = "S-foo-c";
+  Expect.equals("S-foo-c", c.foo);
+  Expect.equals("S-foo", d.foo);
+  Expect.equals("S-foo", e.foo);
+  Expect.equals("S-foo", f.foo);
+
+  d.foo = "S-foo-d";
+  Expect.equals("S-foo-c", c.foo);
+  Expect.equals("S-foo-d", d.foo);
+  Expect.equals("S-foo", e.foo);
+  Expect.equals("S-foo", f.foo);
+
+  e.foo = "S-foo-e";
+  Expect.equals("S-foo-c", c.foo);
+  Expect.equals("S-foo-d", d.foo);
+  Expect.equals("S-foo-e", e.foo);
+  Expect.equals("S-foo", f.foo);
+
+  f.foo = "S-foo-f";
+  Expect.equals("S-foo-c", c.foo);
+  Expect.equals("S-foo-d", d.foo);
+  Expect.equals("S-foo-e", e.foo);
+  Expect.equals("S-foo-f", f.foo);
+
+  Expect.throws(() => c.bar = 0, (error) => error is NoSuchMethodError);
+  Expect.throws(() => d.bar = 0, (error) => error is NoSuchMethodError);
+  Expect.throws(() => e.bar = 0, (error) => error is NoSuchMethodError);
+  Expect.throws(() => f.bar = 0, (error) => error is NoSuchMethodError);
+  Expect.equals("M1-bar", c.bar);
+  Expect.equals("M1-bar", d.bar);
+  Expect.equals("M1-bar", e.bar);
+  Expect.equals("M1-bar", f.bar);
+
+  Expect.throws(() => c.baz = 0, (error) => error is NoSuchMethodError);
+  Expect.throws(() => c.baz, (error) => error is NoSuchMethodError);
+  Expect.equals("M2-baz", d.baz);
+  Expect.equals("M2-baz", e.baz);
+  Expect.equals("M2-baz", f.baz);
+
+  d.baz = "M2-baz-d";
+  Expect.throws(() => c.baz, (error) => error is NoSuchMethodError);
+  Expect.equals("M2-baz-d", d.baz);
+  Expect.equals("M2-baz", e.baz);
+  Expect.equals("M2-baz", f.baz);
+  Expect.equals("M2-baz", f.baz);
+
+  e.baz = "M2-baz-e";
+  Expect.throws(() => c.baz, (error) => error is NoSuchMethodError);
+  Expect.equals("M2-baz-d", d.baz);
+  Expect.equals("M2-baz-e", e.baz);
+  Expect.equals("M2-baz", f.baz);
+
+  f.baz = "M2-baz-f";
+  Expect.throws(() => c.baz, (error) => error is NoSuchMethodError);
+  Expect.equals("M2-baz-d", d.baz);
+  Expect.equals("M2-baz-e", e.baz);
+  Expect.equals("M2-baz-f", f.baz);
+
+  Expect.throws(() => c.fez = 0, (error) => error is NoSuchMethodError);
+  Expect.throws(() => d.fez = 0, (error) => error is NoSuchMethodError);
+  Expect.throws(() => e.fez = 0, (error) => error is NoSuchMethodError);
+
+  f.fez = "F-fez-f";
+  Expect.throws(() => c.fez, (error) => error is NoSuchMethodError);
+  Expect.throws(() => d.fez, (error) => error is NoSuchMethodError);
+  Expect.throws(() => e.fez, (error) => error is NoSuchMethodError);
+  Expect.equals("F-fez-f", f.fez);
+}
diff --git a/tests/language/mixin_is_test.dart b/tests/language/mixin_is_test.dart
new file mode 100644
index 0000000..2d61ab9
--- /dev/null
+++ b/tests/language/mixin_is_test.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class S { }
+class M1 { }
+class M2 { }
+
+typedef C = S with M1;
+typedef D = S with M1, M2;
+typedef E = S with M2, M1;
+class F extends E { }
+
+typedef C_ = S with M1;
+typedef D_ = S with M1, M2;
+typedef E_ = S with M2, M1;
+class F_ extends E_ { }
+
+main() {
+  var c = new C();
+  Expect.isTrue(c is C);
+  Expect.isFalse(c is D);
+  Expect.isFalse(c is E);
+  Expect.isFalse(c is F);
+  Expect.isTrue(c is S);
+  Expect.isTrue(c is M1);
+  Expect.isFalse(c is M2);
+
+  var d = new D();
+  Expect.isFalse(d is C);
+  Expect.isTrue(d is D);
+  Expect.isFalse(d is E);
+  Expect.isFalse(d is F);
+  Expect.isTrue(d is S);
+  Expect.isTrue(d is M1);
+  Expect.isTrue(d is M2);
+
+  var e = new E();
+  Expect.isFalse(e is C);
+  Expect.isFalse(e is D);
+  Expect.isTrue(e is E);
+  Expect.isFalse(e is F);
+  Expect.isTrue(e is S);
+  Expect.isTrue(e is M1);
+  Expect.isTrue(e is M2);
+
+  var f = new F();
+  Expect.isFalse(f is C);
+  Expect.isFalse(f is D);
+  Expect.isTrue(f is E);
+  Expect.isTrue(f is F);
+  Expect.isTrue(f is S);
+  Expect.isTrue(f is M1);
+  Expect.isTrue(f is M2);
+
+  // Make sure we get a new class for each mixin
+  // application (at least the named ones).
+  Expect.isFalse(c is C_);
+  Expect.isFalse(c is D_);
+  Expect.isFalse(c is E_);
+  Expect.isFalse(c is F_);
+
+  Expect.isFalse(d is C_);
+  Expect.isFalse(d is D_);
+  Expect.isFalse(d is E_);
+  Expect.isFalse(d is F_);
+
+  Expect.isFalse(e is C_);
+  Expect.isFalse(e is D_);
+  Expect.isFalse(e is E_);
+  Expect.isFalse(e is F_);
+
+  Expect.isFalse(f is C_);
+  Expect.isFalse(f is D_);
+  Expect.isFalse(f is E_);
+  Expect.isFalse(f is F_);
+}
diff --git a/tests/language/mixin_method_test.dart b/tests/language/mixin_method_test.dart
new file mode 100644
index 0000000..d5643f7
--- /dev/null
+++ b/tests/language/mixin_method_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class S {
+  foo() => "S-foo";
+  baz() => "S-baz";
+}
+
+class M1 {
+  bar() => "M1-bar";
+}
+
+class M2 {
+  bar() => "M2-bar";
+  baz() => "M2-baz";
+  fez() => "M2-fez";
+}
+
+typedef C = S with M1;
+typedef D = S with M1, M2;
+typedef E = S with M2, M1;
+
+class F extends E {
+  fez() => "F-fez";
+}
+
+main() {
+  var c = new C();
+  Expect.equals("S-foo", c.foo());
+  Expect.equals("M1-bar", c.bar());
+  Expect.equals("S-baz", c.baz());
+  Expect.throws(() => c.fez(), (error) => error is NoSuchMethodError);
+
+  var d = new D();
+  Expect.equals("S-foo", d.foo());
+  Expect.equals("M2-bar", d.bar());
+  Expect.equals("M2-baz", d.baz());
+  Expect.equals("M2-fez", d.fez());
+
+  var e = new E();
+  Expect.equals("S-foo", e.foo());
+  Expect.equals("M1-bar", e.bar());
+  Expect.equals("M2-baz", e.baz());
+  Expect.equals("M2-fez", e.fez());
+
+  var f = new F();
+  Expect.equals("S-foo", f.foo());
+  Expect.equals("M1-bar", f.bar());
+  Expect.equals("M2-baz", f.baz());
+  Expect.equals("F-fez", f.fez());
+}
diff --git a/tests/language/mixin_naming_test.dart b/tests/language/mixin_naming_test.dart
new file mode 100644
index 0000000..b3b4a9c
--- /dev/null
+++ b/tests/language/mixin_naming_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class S { }
+class M1 { }
+class M2 { }
+class M3 { }
+
+typedef C = S with M1, M2, M3;
+class D extends S with M1, M2, M3 { }
+
+class S_M1 { }
+class S_M1_M2 { }
+
+main() {
+  var c = new C();
+  Expect.isTrue(c is C);
+  Expect.isFalse(c is D);
+  Expect.isTrue(c is S);
+  Expect.isFalse(c is S_M1);
+  Expect.isFalse(c is S_M1_M2);
+
+  var d = new D();
+  Expect.isFalse(d is C);
+  Expect.isTrue(d is D);
+  Expect.isTrue(d is S);
+  Expect.isFalse(d is S_M1);
+  Expect.isFalse(d is S_M1_M2);
+
+  var sm = new S_M1();
+  Expect.isFalse(sm is C);
+  Expect.isFalse(sm is D);
+  Expect.isFalse(sm is S);
+  Expect.isTrue(sm is S_M1);
+  Expect.isFalse(sm is S_M1_M2);
+
+  var smm = new S_M1_M2();
+  Expect.isFalse(smm is C);
+  Expect.isFalse(smm is D);
+  Expect.isFalse(smm is S);
+  Expect.isFalse(smm is S_M1);
+  Expect.isTrue(smm is S_M1_M2);
+}
diff --git a/tests/language/naming_test.dart b/tests/language/naming_test.dart
index 6198f1d..1edfb9d 100644
--- a/tests/language/naming_test.dart
+++ b/tests/language/naming_test.dart
@@ -52,24 +52,6 @@
   debugger$C$C.C$I(x) : this.x = x + 12 { }
 }
 
-class with extends debugger$C {
-  int y;
-
-  factory with.F() {
-    return new with(1, 2);
-  }
-  with(x, y) : super(x), this.y = y + 1 { }
-  with.I(x, y) : super.C(x), this.y = y + 2 { }
-  with.C(x, y) : super.C$C(x), this.y = y + 3 { }
-  with.I$C(x, y) : super.C$I(x), this.y = y + 4 { }
-  with.C$C(x, y) : super(x), this.y = y + 5 { }
-  with.C$C$C(x, y) : super.C(x), this.y = y + 6 { }
-  with.$C$I(x, y) : super.C$C(x), this.y = y + 7 { }
-  with.$$I$C(x, y) : super.C$I(x), this.y = y + 8 { }
-  with.$(x, y) : super(x), this.y = y + 9 { }
-  with.$$(x, y) : super.C(x), this.y = y + 10 { }
-}
-
 class with$I extends debugger$C {
   int y;
 
@@ -267,36 +249,6 @@
     Expect.equals(11, x.x);
     x = new debugger$C$C.C$I(0);
     Expect.equals(12, x.x);
-    x = new with(0, 0);
-    Expect.equals(5, x.x);
-    Expect.equals(1, x.y);
-    x = new with.I(0, 0);
-    Expect.equals(6, x.x);
-    Expect.equals(2, x.y);
-    x = new with.C(0, 0);
-    Expect.equals(7, x.x);
-    Expect.equals(3, x.y);
-    x = new with.I$C(0, 0);
-    Expect.equals(8, x.x);
-    Expect.equals(4, x.y);
-    x = new with.C$C(0, 0);
-    Expect.equals(5, x.x);
-    Expect.equals(5, x.y);
-    x = new with.C$C$C(0, 0);
-    Expect.equals(6, x.x);
-    Expect.equals(6, x.y);
-    x = new with.$C$I(0, 0);
-    Expect.equals(7, x.x);
-    Expect.equals(7, x.y);
-    x = new with.$$I$C(0, 0);
-    Expect.equals(8, x.x);
-    Expect.equals(8, x.y);
-    x = new with.$(0, 0);
-    Expect.equals(5, x.x);
-    Expect.equals(9, x.y);
-    x = new with.$$(0, 0);
-    Expect.equals(6, x.x);
-    Expect.equals(10, x.y);
     x = new with$I(0, 0);
     Expect.equals(5, x.x);
     Expect.equals(11, x.y);
@@ -387,14 +339,6 @@
     x = new with$I$C.$$(0, 0);
     Expect.equals(10, x.x);
     Expect.equals(40, x.y);
-    var wasCaught = false;
-    try {
-      throw new with(0, 0);
-    } on with catch (e) {
-      wasCaught = true;
-      Expect.equals(5, e.x);
-    }
-    Expect.equals(true, wasCaught);
   }
 
   static void testMemberMangling() {
@@ -409,9 +353,6 @@
     Expect.equals(6, o.x);
     o = new debugger$C$C.F();
     Expect.equals(10, o.x);
-    o = new with.F();
-    Expect.equals(6, o.x);
-    Expect.equals(3, o.y);
     o = new with$I.F();
     Expect.equals(6, o.x);
     Expect.equals(13, o.y);
@@ -424,21 +365,16 @@
   }
 
   static testFunctionParameters() {
-    a(with) {
-      return with;
-    }
-
-    b(eval) {
+    a(eval) {
       return eval;
     }
 
-    c(arguments) {
+    b(arguments) {
       return arguments;
     }
 
     Expect.equals(10, a(10));
     Expect.equals(10, b(10));
-    Expect.equals(10, c(10));
   }
 
   static testPseudoTokens() {
diff --git a/tests/language/other_library.dart b/tests/language/other_library.dart
new file mode 100644
index 0000000..f831462
--- /dev/null
+++ b/tests/language/other_library.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that inlining in the compiler works with privacy.
+
+library other_library;
+
+// Make [foo] small enough that is can be inlined. Make it call a
+// private method.
+foo(a) => a._bar();
+
+class A {
+  _bar() => 42;
+}
diff --git a/tests/language/private4_test.dart b/tests/language/private4_test.dart
new file mode 100644
index 0000000..226eba3
--- /dev/null
+++ b/tests/language/private4_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that inlining in the compiler works with privacy.
+
+library private4_test;
+
+import 'other_library.dart';
+
+main() {
+  Expect.equals(42, foo(new A()));
+  Expect.throws(() => foo(new B()), (e) => e is NoSuchMethodError);
+}
+
+class B {
+  _bar() => 42;
+}
diff --git a/tests/language/reexport_core_helper.dart b/tests/language/reexport_core_helper.dart
new file mode 100644
index 0000000..49798aa4
--- /dev/null
+++ b/tests/language/reexport_core_helper.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library reexport_core_helper;
+
+export 'dart:core';
+
diff --git a/tests/language/reexport_core_test.dart b/tests/language/reexport_core_test.dart
new file mode 100644
index 0000000..cbdc15b
--- /dev/null
+++ b/tests/language/reexport_core_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests that exports are handled for libraries loaded prior to the entry point
+// library.
+//
+// This test uses the fact that dart2js loads dart:core before the
+// reexport_core_helper and reexport_core_test libraries and the exports of
+// dart:core is therefore computed before the exports of reexport_core_helper.
+
+library reexport_core_test;
+
+import 'reexport_core_helper.dart' as core;
+
+void main() {
+  var o = new Object();
+  Expect.isTrue(o is core.Object);
+}
+
diff --git a/tests/lib/async/merge_stream_test.dart b/tests/lib/async/merge_stream_test.dart
index 2eceae5..c454dca 100644
--- a/tests/lib/async/merge_stream_test.dart
+++ b/tests/lib/async/merge_stream_test.dart
@@ -11,9 +11,9 @@
 
 testSupercedeStream() {
   { // Simple case of superceding lower priority streams.
-    StreamController s1 = new StreamController();
-    StreamController s2 = new StreamController();
-    StreamController s3 = new StreamController();
+    StreamController s1 = new StreamController.multiSubscription();
+    StreamController s2 = new StreamController.multiSubscription();
+    StreamController s3 = new StreamController.multiSubscription();
     Stream merge = new Stream.superceding([s1.stream, s2.stream, s3.stream]);
     Events expected = new Events()..add(1)..add(2)..add(3)..add(4)..close();
     Events actual = new Events.capture(merge);
@@ -28,9 +28,9 @@
   }
 
   { // Superceding more than one stream at a time.
-    StreamController s1 = new StreamController();
-    StreamController s2 = new StreamController();
-    StreamController s3 = new StreamController();
+    StreamController s1 = new StreamController.multiSubscription();
+    StreamController s2 = new StreamController.multiSubscription();
+    StreamController s3 = new StreamController.multiSubscription();
     Stream merge = new Stream.superceding([s1.stream, s2.stream, s3.stream]);
     Events expected = new Events()..add(1)..add(2)..close();
     Events actual = new Events.capture(merge);
@@ -43,9 +43,9 @@
   }
 
   { // Closing a stream before superceding it.
-    StreamController s1 = new StreamController();
-    StreamController s2 = new StreamController();
-    StreamController s3 = new StreamController();
+    StreamController s1 = new StreamController.multiSubscription();
+    StreamController s2 = new StreamController.multiSubscription();
+    StreamController s3 = new StreamController.multiSubscription();
     Stream merge = new Stream.superceding([s1.stream, s2.stream, s3.stream]);
     Events expected = new Events()..add(1)..add(2)..add(3)..close();
     Events actual = new Events.capture(merge);
@@ -59,9 +59,9 @@
   }
 
   { // Errors from all non-superceded streams are forwarded.
-    StreamController s1 = new StreamController();
-    StreamController s2 = new StreamController();
-    StreamController s3 = new StreamController();
+    StreamController s1 = new StreamController.multiSubscription();
+    StreamController s2 = new StreamController.multiSubscription();
+    StreamController s3 = new StreamController.multiSubscription();
     Stream merge = new Stream.superceding([s1.stream, s2.stream, s3.stream]);
     Events expected =
         new Events()..add(1)..error("1")..error("2")..error("3")
@@ -83,9 +83,9 @@
   }
 
   test("Pausing on a superceding stream", () {
-    StreamController s1 = new StreamController();
-    StreamController s2 = new StreamController();
-    StreamController s3 = new StreamController();
+    StreamController s1 = new StreamController.multiSubscription();
+    StreamController s2 = new StreamController.multiSubscription();
+    StreamController s3 = new StreamController.multiSubscription();
     Stream merge = new Stream.superceding([s1.stream, s2.stream, s3.stream]);
     Events expected = new Events()..add(1)..add(2)..add(3);
     Events actual = new Events.capture(merge);
@@ -114,9 +114,9 @@
 
 void testCyclicStream() {
   test("Simple case of superceding lower priority streams", () {
-    StreamController s1 = new StreamController();
-    StreamController s2 = new StreamController();
-    StreamController s3 = new StreamController();
+    StreamController s1 = new StreamController.multiSubscription();
+    StreamController s2 = new StreamController.multiSubscription();
+    StreamController s3 = new StreamController.multiSubscription();
     Stream merge = new Stream.cyclic([s1.stream, s2.stream, s3.stream]);
     Events expected =
         new Events()..add(1)..add(2)..add(3)..add(4)..add(5)..add(6)..close();
@@ -139,9 +139,9 @@
   });
 
   test("Cyclic merge with errors", () {
-    StreamController s1 = new StreamController();
-    StreamController s2 = new StreamController();
-    StreamController s3 = new StreamController();
+    StreamController s1 = new StreamController.multiSubscription();
+    StreamController s2 = new StreamController.multiSubscription();
+    StreamController s3 = new StreamController.multiSubscription();
     Stream merge = new Stream.cyclic([s1.stream, s2.stream, s3.stream]);
     Events expected =
         new Events()..add(1)..error("1")..add(2)..add(3)..error("2")
diff --git a/tests/lib/async/stream_controller_async_test.dart b/tests/lib/async/stream_controller_async_test.dart
index 7abd911..2ce7557 100644
--- a/tests/lib/async/stream_controller_async_test.dart
+++ b/tests/lib/async/stream_controller_async_test.dart
@@ -13,7 +13,7 @@
 testController() {
   // Test reduce
   test("StreamController.reduce", () {
-    StreamController c = new StreamController();
+    StreamController c = new StreamController.multiSubscription();
     c.reduce(0, (a,b) => a + b)
      .then(expectAsync1((int v) {
         Expect.equals(42, v);
@@ -24,14 +24,14 @@
   });
 
   test("StreamController.reduce throws", () {
-    StreamController c = new StreamController();
+    StreamController c = new StreamController.multiSubscription();
     c.reduce(0, (a,b) { throw "Fnyf!"; })
      .catchError(expectAsync1((e) { Expect.equals("Fnyf!", e.error); }));
     c.add(42);
   });
 
   test("StreamController.pipeInto", () {
-    StreamController c = new StreamController();
+    StreamController c = new StreamController.multiSubscription();
     var list = <int>[];
     c.pipeInto(new CollectionSink<int>(list))
      .whenComplete(expectAsync0(() {
@@ -48,7 +48,7 @@
 
 testSingleController() {
   test("Single-subscription StreamController.reduce", () {
-    StreamController c = new StreamController.singleSubscription();
+    StreamController c = new StreamController();
     c.reduce(0, (a,b) => a + b)
     .then(expectAsync1((int v) { Expect.equals(42, v); }));
     c.add(10);
@@ -57,14 +57,14 @@
   });
 
   test("Single-subscription StreamController.reduce throws", () {
-    StreamController c = new StreamController.singleSubscription();
+    StreamController c = new StreamController();
     c.reduce(0, (a,b) { throw "Fnyf!"; })
             .catchError(expectAsync1((e) { Expect.equals("Fnyf!", e.error); }));
     c.add(42);
   });
 
   test("Single-subscription StreamController.pipeInto", () {
-    StreamController c = new StreamController.singleSubscription();
+    StreamController c = new StreamController();
     var list = <int>[];
     c.pipeInto(new CollectionSink<int>(list))
      .whenComplete(expectAsync0(() {
@@ -79,7 +79,7 @@
   });
 
   test("Single-subscription StreamController subscription changes", () {
-    StreamController c = new StreamController.singleSubscription();
+    StreamController c = new StreamController();
     StreamSink sink = c.sink;
     Stream stream = c.stream;
     int counter = 0;
@@ -103,7 +103,7 @@
   test("Single-subscription StreamController events are buffered when"
        " there is no subscriber",
        () {
-    StreamController c = new StreamController.singleSubscription();
+    StreamController c = new StreamController();
     StreamSink sink = c.sink;
     Stream stream = c.stream;
     int counter = 0;
@@ -122,7 +122,7 @@
   // Test subscription changes while firing.
   test("Single-subscription StreamController subscription changes while firing",
        () {
-    StreamController c = new StreamController.singleSubscription();
+    StreamController c = new StreamController();
     StreamSink sink = c.sink;
     Stream stream = c.stream;
     int counter = 0;
diff --git a/tests/lib/async/stream_controller_test.dart b/tests/lib/async/stream_controller_test.dart
index 37c1bf9..313ccef 100644
--- a/tests/lib/async/stream_controller_test.dart
+++ b/tests/lib/async/stream_controller_test.dart
@@ -8,7 +8,147 @@
 import 'dart:async';
 import 'event_helper.dart';
 
-testController() {
+testMultiController() {
+  // Test normal flow.
+  var c = new StreamController.multiSubscription();
+  Events expectedEvents = new Events()
+      ..add(42)
+      ..add("dibs")
+      ..error("error!")
+      ..error("error too!")
+      ..close();
+  Events actualEvents = new Events.capture(c);
+  expectedEvents.replay(c);
+  Expect.listEquals(expectedEvents.events, actualEvents.events);
+
+  // Test automatic unsubscription on error.
+  c = new StreamController.multiSubscription();
+  expectedEvents = new Events()..add(42)..error("error");
+  actualEvents = new Events.capture(c, unsubscribeOnError: true);
+  Events sentEvents =
+      new Events()..add(42)..error("error")..add("Are you there?");
+  sentEvents.replay(c);
+  Expect.listEquals(expectedEvents.events, actualEvents.events);
+
+  // Test manual unsubscription.
+  c = new StreamController.multiSubscription();
+  expectedEvents = new Events()..add(42)..error("error")..add(37);
+  actualEvents = new Events.capture(c, unsubscribeOnError: false);
+  expectedEvents.replay(c);
+  actualEvents.subscription.cancel();
+  c.add("Are you there");  // Not sent to actualEvents.
+  Expect.listEquals(expectedEvents.events, actualEvents.events);
+
+  // Test filter.
+  c = new StreamController.multiSubscription();
+  expectedEvents = new Events()
+    ..add("a string")..add("another string")..close();
+  sentEvents = new Events()
+    ..add("a string")..add(42)..add("another string")..close();
+  actualEvents = new Events.capture(c.where((v) => v is String));
+  sentEvents.replay(c);
+  Expect.listEquals(expectedEvents.events, actualEvents.events);
+
+  // Test map.
+  c = new StreamController.multiSubscription();
+  expectedEvents = new Events()..add("abab")..error("error")..close();
+  sentEvents = new Events()..add("ab")..error("error")..close();
+  actualEvents = new Events.capture(c.mappedBy((v) => "$v$v"));
+  sentEvents.replay(c);
+  Expect.listEquals(expectedEvents.events, actualEvents.events);
+
+  // Test handleError.
+  c = new StreamController.multiSubscription();
+  expectedEvents = new Events()..add("ab")..error("[foo]");
+  sentEvents = new Events()..add("ab")..error("foo")..add("ab")..close();
+  actualEvents = new Events.capture(c.handleError((v) {
+        if (v.error is String) {
+          throw new AsyncError("[${v.error}]",
+                                "other stack");
+        }
+      }), unsubscribeOnError: true);
+  sentEvents.replay(c);
+  Expect.listEquals(expectedEvents.events, actualEvents.events);
+
+  // reduce is tested asynchronously and therefore not in this file.
+
+  // Test expand
+  c = new StreamController.multiSubscription();
+  sentEvents = new Events()..add(3)..add(2)..add(4)..close();
+  expectedEvents = new Events()..add(1)..add(2)..add(3)
+                               ..add(1)..add(2)
+                               ..add(1)..add(2)..add(3)..add(4)
+                               ..close();
+  actualEvents = new Events.capture(c.expand((v) {
+    var l = [];
+    for (int i = 0; i < v; i++) l.add(i + 1);
+    return l;
+  }));
+  sentEvents.replay(c);
+  Expect.listEquals(expectedEvents.events, actualEvents.events);
+
+  // Test transform.
+  c = new StreamController.multiSubscription();
+  sentEvents = new Events()..add("a")..error(42)..add("b")..close();
+  expectedEvents =
+      new Events()..error("a")..add(42)..error("b")..add("foo")..close();
+  actualEvents = new Events.capture(c.transform(new StreamTransformer.from(
+      onData: (v, s) { s.signalError(new AsyncError(v)); },
+      onError: (e, s) { s.add(e.error); },
+      onDone: (s) {
+        s.add("foo");
+        s.close();
+      })));
+  sentEvents.replay(c);
+  Expect.listEquals(expectedEvents.events, actualEvents.events);
+
+  // Test multiple filters.
+  c = new StreamController.multiSubscription();
+  sentEvents = new Events()..add(42)
+                           ..add("snugglefluffy")
+                           ..add(7)
+                           ..add("42")
+                           ..error("not FormatException")  // Unsubscribes.
+                           ..close();
+  expectedEvents = new Events()..add(42)..error("not FormatException");
+  actualEvents = new Events.capture(
+      c.where((v) => v is String)
+       .mappedBy((v) => int.parse(v))
+       .handleError((v) {
+          if (v.error is! FormatException) throw v;
+        })
+       .where((v) => v > 10),
+      unsubscribeOnError: true);
+  sentEvents.replay(c);
+  Expect.listEquals(expectedEvents.events, actualEvents.events);
+
+  // Test subscription changes while firing.
+  c = new StreamController.multiSubscription();
+  var sink = c.sink;
+  var stream = c.stream;
+  var counter = 0;
+  var subscription = stream.listen(null);
+  subscription.onData((data) {
+    counter += data;
+    subscription.cancel();
+    stream.listen((data) {
+      counter += 10 * data;
+    });
+    var subscription2 = stream.listen(null);
+    subscription2.onData((data) {
+      counter += 100 * data;
+      if (data == 4) subscription2.cancel();
+    });
+  });
+  sink.add(1); // seen by stream 1
+  sink.add(2); // seen by stream 10 and 100
+  sink.add(3); // -"-
+  sink.add(4); // -"-
+  sink.add(5); // seen by stream 10
+  Expect.equals(1 + 20 + 200 + 30 + 300 + 40 + 400 + 50, counter);
+}
+
+testSingleController() {
   // Test normal flow.
   var c = new StreamController();
   Events expectedEvents = new Events()
@@ -87,148 +227,8 @@
   sentEvents.replay(c);
   Expect.listEquals(expectedEvents.events, actualEvents.events);
 
-  // Test transform.
-  c = new StreamController();
-  sentEvents = new Events()..add("a")..error(42)..add("b")..close();
-  expectedEvents =
-      new Events()..error("a")..add(42)..error("b")..add("foo")..close();
-  actualEvents = new Events.capture(c.transform(new StreamTransformer.from(
-      onData: (v, s) { s.signalError(new AsyncError(v)); },
-      onError: (e, s) { s.add(e.error); },
-      onDone: (s) {
-        s.add("foo");
-        s.close();
-      })));
-  sentEvents.replay(c);
-  Expect.listEquals(expectedEvents.events, actualEvents.events);
-
-  // Test multiple filters.
-  c = new StreamController();
-  sentEvents = new Events()..add(42)
-                           ..add("snugglefluffy")
-                           ..add(7)
-                           ..add("42")
-                           ..error("not FormatException")  // Unsubscribes.
-                           ..close();
-  expectedEvents = new Events()..add(42)..error("not FormatException");
-  actualEvents = new Events.capture(
-      c.where((v) => v is String)
-       .mappedBy((v) => int.parse(v))
-       .handleError((v) {
-          if (v.error is! FormatException) throw v;
-        })
-       .where((v) => v > 10),
-      unsubscribeOnError: true);
-  sentEvents.replay(c);
-  Expect.listEquals(expectedEvents.events, actualEvents.events);
-
-  // Test subscription changes while firing.
-  c = new StreamController();
-  var sink = c.sink;
-  var stream = c.stream;
-  var counter = 0;
-  var subscription = stream.listen(null);
-  subscription.onData((data) {
-    counter += data;
-    subscription.cancel();
-    stream.listen((data) {
-      counter += 10 * data;
-    });
-    var subscription2 = stream.listen(null);
-    subscription2.onData((data) {
-      counter += 100 * data;
-      if (data == 4) subscription2.cancel();
-    });
-  });
-  sink.add(1); // seen by stream 1
-  sink.add(2); // seen by stream 10 and 100
-  sink.add(3); // -"-
-  sink.add(4); // -"-
-  sink.add(5); // seen by stream 10
-  Expect.equals(1 + 20 + 200 + 30 + 300 + 40 + 400 + 50, counter);
-}
-
-testSingleController() {
-  // Test normal flow.
-  var c = new StreamController.singleSubscription();
-  Events expectedEvents = new Events()
-      ..add(42)
-      ..add("dibs")
-      ..error("error!")
-      ..error("error too!")
-      ..close();
-  Events actualEvents = new Events.capture(c);
-  expectedEvents.replay(c);
-  Expect.listEquals(expectedEvents.events, actualEvents.events);
-
-  // Test automatic unsubscription on error.
-  c = new StreamController.singleSubscription();
-  expectedEvents = new Events()..add(42)..error("error");
-  actualEvents = new Events.capture(c, unsubscribeOnError: true);
-  Events sentEvents =
-      new Events()..add(42)..error("error")..add("Are you there?");
-  sentEvents.replay(c);
-  Expect.listEquals(expectedEvents.events, actualEvents.events);
-
-  // Test manual unsubscription.
-  c = new StreamController.singleSubscription();
-  expectedEvents = new Events()..add(42)..error("error")..add(37);
-  actualEvents = new Events.capture(c, unsubscribeOnError: false);
-  expectedEvents.replay(c);
-  actualEvents.subscription.cancel();
-  c.add("Are you there");  // Not sent to actualEvents.
-  Expect.listEquals(expectedEvents.events, actualEvents.events);
-
-  // Test filter.
-  c = new StreamController.singleSubscription();
-  expectedEvents = new Events()
-    ..add("a string")..add("another string")..close();
-  sentEvents = new Events()
-    ..add("a string")..add(42)..add("another string")..close();
-  actualEvents = new Events.capture(c.where((v) => v is String));
-  sentEvents.replay(c);
-  Expect.listEquals(expectedEvents.events, actualEvents.events);
-
-  // Test map.
-  c = new StreamController.singleSubscription();
-  expectedEvents = new Events()..add("abab")..error("error")..close();
-  sentEvents = new Events()..add("ab")..error("error")..close();
-  actualEvents = new Events.capture(c.mappedBy((v) => "$v$v"));
-  sentEvents.replay(c);
-  Expect.listEquals(expectedEvents.events, actualEvents.events);
-
-  // Test handleError.
-  c = new StreamController.singleSubscription();
-  expectedEvents = new Events()..add("ab")..error("[foo]");
-  sentEvents = new Events()..add("ab")..error("foo")..add("ab")..close();
-  actualEvents = new Events.capture(c.handleError((v) {
-        if (v.error is String) {
-          throw new AsyncError("[${v.error}]",
-                                "other stack");
-        }
-      }), unsubscribeOnError: true);
-  sentEvents.replay(c);
-  Expect.listEquals(expectedEvents.events, actualEvents.events);
-
-  // reduce is tested asynchronously and therefore not in this file.
-
-  // Test expand
-  c = new StreamController.singleSubscription();
-  sentEvents = new Events()..add(3)..add(2)..add(4)..close();
-  expectedEvents = new Events()..add(1)..add(2)..add(3)
-                               ..add(1)..add(2)
-                               ..add(1)..add(2)..add(3)..add(4)
-                               ..close();
-  actualEvents = new Events.capture(c.expand((v) {
-    var l = [];
-    for (int i = 0; i < v; i++) l.add(i + 1);
-    return l;
-  }));
-  sentEvents.replay(c);
-  Expect.listEquals(expectedEvents.events, actualEvents.events);
-
   // pipe is tested asynchronously and therefore not in this file.
-  c = new StreamController.singleSubscription();
+  c = new StreamController();
   var list = <int>[];
   c.pipeInto(new CollectionSink<int>(list))
    .whenComplete(() { Expect.listEquals(<int>[1,2,9,3,9], list); });
@@ -240,7 +240,7 @@
   c.close();
 
   // Test transform.
-  c = new StreamController.singleSubscription();
+  c = new StreamController();
   sentEvents = new Events()..add("a")..error(42)..add("b")..close();
   expectedEvents =
       new Events()..error("a")..add(42)..error("b")..add("foo")..close();
@@ -255,7 +255,7 @@
   Expect.listEquals(expectedEvents.events, actualEvents.events);
 
   // Test multiple filters.
-  c = new StreamController.singleSubscription();
+  c = new StreamController();
   sentEvents = new Events()..add(42)
                            ..add("snugglefluffy")
                            ..add(7)
@@ -275,7 +275,7 @@
   Expect.listEquals(expectedEvents.events, actualEvents.events);
 
   // Test that only one subscription is allowed.
-  c = new StreamController.singleSubscription();
+  c = new StreamController();
   var sink = c.sink;
   var stream = c.stream;
   var counter = 0;
@@ -355,7 +355,7 @@
 }
 
 main() {
-  testController();
+  testMultiController();
   testSingleController();
   testExtraMethods();
 }
diff --git a/tests/lib/async/stream_from_iterable_test.dart b/tests/lib/async/stream_from_iterable_test.dart
index 4afd889..f724bf4 100644
--- a/tests/lib/async/stream_from_iterable_test.dart
+++ b/tests/lib/async/stream_from_iterable_test.dart
@@ -36,21 +36,26 @@
                                             .mappedBy((i) => "$i")).run();
 
   Iterable<int> iter = new Iterable.generate(25, (i) => i * 2);
-  new Stream.fromIterable(iter).toList().then(expectAsync1((actual) {
-    List expected = iter.toList();
-    Expect.equals(25, expected.length);
-    Expect.listEquals(expected, actual);
-  }));
 
-  new Stream.fromIterable(iter)
-    .mappedBy((i) => i * 3)
-    .toList()
-    .then(expectAsync1((actual) {
-       List expected = iter.mappedBy((i) => i * 3).toList();
-       Expect.listEquals(expected, actual);
+  test("iterable-toList", () {
+    new Stream.fromIterable(iter).toList().then(expectAsync1((actual) {
+      List expected = iter.toList();
+      Expect.equals(25, expected.length);
+      Expect.listEquals(expected, actual);
     }));
+  });
 
-  {  // Test pause.
+  test("iterable-mapped-toList", () {
+    new Stream.fromIterable(iter)
+      .mappedBy((i) => i * 3)
+      .toList()
+      .then(expectAsync1((actual) {
+         List expected = iter.mappedBy((i) => i * 3).toList();
+         Expect.listEquals(expected, actual);
+      }));
+  });
+
+  test("iterable-paused", () {
     Stream stream = new Stream.fromIterable(iter);
     Events actual = new Events();
     StreamSubscription subscription;
@@ -63,5 +68,5 @@
       Events expected = new Events.fromIterable(iter);
       Expect.listEquals(expected.events, actual.events);
     }));
-  }
+  });
 }
diff --git a/tests/lib/async/stream_single_test.dart b/tests/lib/async/stream_single_test.dart
index 4844f8d..eadce7f 100644
--- a/tests/lib/async/stream_single_test.dart
+++ b/tests/lib/async/stream_single_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// Test the basic StreamController and StreamController.singleSubscription.
+// Test the Stream.single method.
 library stream_single_test;
 
 import 'dart:async';
diff --git a/tests/lib/async/stream_single_to_multi_subscriber_test.dart b/tests/lib/async/stream_single_to_multi_subscriber_test.dart
index 0ef7a26..3feb049 100644
--- a/tests/lib/async/stream_single_to_multi_subscriber_test.dart
+++ b/tests/lib/async/stream_single_to_multi_subscriber_test.dart
@@ -12,7 +12,7 @@
 
 main() {
   test("tomulti 1", () {
-    StreamController c = new StreamController<int>.singleSubscription();
+    StreamController c = new StreamController<int>();
     Stream<int> multi = c.stream.asMultiSubscriberStream();
     // Listen twice.
     multi.listen(expectAsync1((v) => Expect.equals(42, v)));
@@ -21,7 +21,7 @@
   });
 
   test("tomulti 2", () {
-    StreamController c = new StreamController<int>.singleSubscription();
+    StreamController c = new StreamController<int>();
     Stream<int> multi = c.stream.asMultiSubscriberStream();
     Events expected = new Events.fromIterable([1, 2, 3, 4, 5]);
     Events actual1 = new Events.capture(multi);
@@ -36,7 +36,7 @@
   });
 
   test("tomulti no-op", () {
-    StreamController c = new StreamController<int>();
+    StreamController c = new StreamController<int>.multiSubscription();
     Stream<int> multi = c.stream.asMultiSubscriberStream();
     Events expected = new Events.fromIterable([1, 2, 3, 4, 5]);
     Events actual1 = new Events.capture(multi);
diff --git a/tests/standalone/int_array_load_elimination_test.dart b/tests/standalone/int_array_load_elimination_test.dart
new file mode 100644
index 0000000..9dc3523
--- /dev/null
+++ b/tests/standalone/int_array_load_elimination_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Test correct load elimination for scalar lists.
+
+// TODO: remove once bug 2264 fixed.
+library int_array_load_elimination;
+
+import 'dart:scalarlist';
+
+void testUint16() {
+  Uint16List intArray = new Uint16List(1);
+  intArray[0] = -1;
+  var x = intArray[0];
+  Expect.equals(65535, x);
+}
+
+main() {
+  for (int i = 0; i < 2000; i++) {
+    testUint16();
+  }
+}
diff --git a/tests/standalone/int_array_test.dart b/tests/standalone/int_array_test.dart
index e3dfed5..f02fdf7 100644
--- a/tests/standalone/int_array_test.dart
+++ b/tests/standalone/int_array_test.dart
@@ -9,6 +9,50 @@
 
 import 'dart:scalarlist';
 
+void testInt16() {
+  Int16List intArray = new Int16List(4);
+  intArray[0] = 0;
+  intArray[1] = -1;
+  intArray[2] = -2;
+  intArray[3] = -3;
+  for (int i = 0; i < intArray.length; i++) {
+    intArray[i]++;
+  }
+  var x = intArray[0];
+  var y = intArray[1];
+  var z = intArray[2];
+  var w = intArray[3];
+  Expect.equals(1, x);
+  Expect.equals(0, y);
+  Expect.equals(-1, z);
+  Expect.equals(-2, w);
+  var t = y + 1;
+  intArray[0] = t;
+  Expect.equals(t, intArray[0]);
+}
+
+void testUint16() {
+  Uint16List intArray = new Uint16List(4);
+  intArray[0] = 0;
+  intArray[1] = 1;
+  intArray[2] = 2;
+  intArray[3] = 3;
+  for (int i = 0; i < intArray.length; i++) {
+    intArray[i]--;
+  }
+  var x = intArray[0];
+  var y = intArray[1];
+  var z = intArray[2];
+  var w = intArray[3];
+  Expect.equals(65535, x);
+  Expect.equals(0, y);
+  Expect.equals(1, z);
+  Expect.equals(2, w); 
+  var t = y + 1;
+  intArray[0] = t;
+  Expect.equals(t, intArray[0]);
+}
+
 void testInt32ToSmi() {
   Int32List intArray;
 
@@ -75,7 +119,6 @@
   var y = intArray[1];
   var z = intArray[2];
   var w = intArray[3];
-  print(w);
   Expect.equals(4611686018427387903, x);
   Expect.equals(18446744073709551615, y);
   Expect.equals(4611686018427387904, z);
@@ -85,8 +128,9 @@
 
 main() {
   testUint64ToSmi();
-  return;
   for (int i = 0; i < 2000; i++) {
+    testInt16();
+    testUint16();
     testInt32ToSmi();
     testUint32ToSmi();
     testInt64ToSmi();
diff --git a/tests/standalone/io/http_connection_close_test.dart b/tests/standalone/io/http_connection_close_test.dart
index b6116d2..67106e6 100644
--- a/tests/standalone/io/http_connection_close_test.dart
+++ b/tests/standalone/io/http_connection_close_test.dart
@@ -43,16 +43,21 @@
 }
 
 void testStreamResponse() {
+  Timer timer;
   var server = new HttpServer();
+  server.onError = (e) {
+    server.close();
+    timer.cancel();
+  };
   server.listen("127.0.0.1", 0, backlog: 5);
   server.defaultRequestHandler = (var request, var response) {
-    new Timer.repeating(10, (x) {
+    timer = new Timer.repeating(10, (_) {
       Date now = new Date.now();
       try {
         response.outputStream.writeString(
             'data:${now.millisecondsSinceEpoch}\n\n');
       } catch (e) {
-        x.cancel();
+        timer.cancel();
         server.close();
       }
     });
diff --git a/tests/standalone/io/http_server_early_client_close_test.dart b/tests/standalone/io/http_server_early_client_close_test.dart
index a6b19ce..624442f 100644
--- a/tests/standalone/io/http_server_early_client_close_test.dart
+++ b/tests/standalone/io/http_server_early_client_close_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -60,7 +60,7 @@
   final bool expectRequest;
 }
 
-void testEarlyClose() {
+void testEarlyClose1() {
   List<EarlyCloseTest> tests = new List<EarlyCloseTest>();
   void add(Object data, String exception, {bool expectRequest: false}) {
     tests.add(new EarlyCloseTest(data, exception, expectRequest));
@@ -95,6 +95,35 @@
   runTest(tests.iterator);
 }
 
+testEarlyClose2() {
+  var server = new HttpServer();
+  server.listen("127.0.0.1", 0);
+  server.onError = (e) { /* ignore */ };
+  server.defaultRequestHandler = (request, response) {
+    String name = new Options().script;
+    new File(name).openInputStream().pipe(response.outputStream);
+  };
+
+  var count = 0;
+  var makeRequest;
+  makeRequest = () {
+    Socket socket = new Socket("127.0.0.1", server.port);
+    socket.onConnect = () {
+      var data = "GET / HTTP/1.1\r\nContent-Length: 0\r\n\r\n".charCodes;
+      socket.writeList(data, 0, data.length);
+      socket.close();
+      if (++count < 10) {
+        makeRequest();
+      } else {
+        server.close();
+      }
+    };
+  };
+
+  makeRequest();
+}
+
 void main() {
-  testEarlyClose();
+  testEarlyClose1();
+  testEarlyClose2();
 }
diff --git a/tests/standalone/io/http_server_socket_test.dart b/tests/standalone/io/http_server_socket_test.dart
index 6a71fd8..13b92d8 100644
--- a/tests/standalone/io/http_server_socket_test.dart
+++ b/tests/standalone/io/http_server_socket_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -16,6 +16,10 @@
     _onNoPendingWrites = callback;
   }
 
+  void set onClosed(void callback()) {
+    // Not used in test.
+  }
+
   void set onError(void callback(e)) {
     _onError = callback;
   }
diff --git a/tests/standalone/io/path_test.dart b/tests/standalone/io/path_test.dart
index b6d1b99..55c5031 100644
--- a/tests/standalone/io/path_test.dart
+++ b/tests/standalone/io/path_test.dart
@@ -183,6 +183,7 @@
 }
 
 void testRelativeTo() {
+  // Cases where the arguments are absolute paths.
   Expect.equals('c/d',
                 new Path('/a/b/c/d').relativeTo(new Path('/a/b')).toString());
   Expect.equals('c/d',
@@ -190,28 +191,85 @@
   Expect.equals('.',
                 new Path('/a').relativeTo(new Path('/a')).toString());
 
-  // Trailing / in base path represents directory
+  // Trailing slash in the base path has no effect.  This matches Path.join
+  // semantics, but not URL join semantics.
   Expect.equals('../../z/x/y',
       new Path('/a/b/z/x/y').relativeTo(new Path('/a/b/c/d/')).toString());
-  Expect.equals('../z/x/y',
+  Expect.equals('../../z/x/y',
       new Path('/a/b/z/x/y').relativeTo(new Path('/a/b/c/d')).toString());
-  Expect.equals('../z/x/y/',
+  Expect.equals('../../z/x/y/',
       new Path('/a/b/z/x/y/').relativeTo(new Path('/a/b/c/d')).toString());
 
-  Expect.equals('../../z/x/y',
+  Expect.equals('../../../z/x/y',
       new Path('/z/x/y').relativeTo(new Path('/a/b/c')).toString());
   Expect.equals('../../../z/x/y',
       new Path('/z/x/y').relativeTo(new Path('/a/b/c/')).toString());
 
-  // Not implemented yet.  Should return new Path('../b/c/d/').
-  Expect.throws(() =>
-                new Path('b/c/d/').relativeTo(new Path('a/')));
+  // Cases where the arguments are relative paths.
+  Expect.equals('c/d',
+      new Path('a/b/c/d').relativeTo(new Path('a/b')).toString());
+  Expect.equals('c/d',
+      new Path('/a/b/c/d').relativeTo(new Path('/a/b/')).toString());
+  Expect.equals('.',
+      new Path('a/b/c').relativeTo(new Path('a/b/c')).toString());
+  Expect.equals('.',
+      new Path('').relativeTo(new Path('')).toString());
+  Expect.equals('.',
+      new Path('.').relativeTo(new Path('.')).toString());
+  Expect.equals('a',
+      new Path('a').relativeTo(new Path('.')).toString());
+  Expect.equals('..',
+      new Path('..').relativeTo(new Path('.')).toString());
+  Expect.equals('..',
+      new Path('.').relativeTo(new Path('a')).toString());
+  Expect.equals('.',
+      new Path('..').relativeTo(new Path('..')).toString());
+  Expect.equals('./',
+      new Path('a/b/f/../c/').relativeTo(new Path('a/e/../b/c')).toString());
+  Expect.equals('d',
+      new Path('a/b/f/../c/d').relativeTo(new Path('a/e/../b/c')).toString());
+  Expect.equals('..',
+      new Path('a/b/f/../c').relativeTo(new Path('a/e/../b/c/e/')).toString());
+  Expect.equals('../..',
+      new Path('').relativeTo(new Path('a/b/')).toString());
+  Expect.equals('../../..',
+      new Path('..').relativeTo(new Path('a/b')).toString());
+  Expect.equals('../b/c/d/',
+      new Path('b/c/d/').relativeTo(new Path('a/')).toString());
+  Expect.equals('../a/b/c',
+      new Path('x/y/a//b/./f/../c').relativeTo(new Path('x//y/z')).toString());
+
+  // Case where base is a substring of relative:
+  Expect.equals('a/b',
+      new Path('/x/y//a/b').relativeTo(new Path('/x/y/')).toString());
+  Expect.equals('a/b',
+      new Path('x/y//a/b').relativeTo(new Path('x/y/')).toString());
+  Expect.equals('../ya/b',
+      new Path('/x/ya/b').relativeTo(new Path('/x/y')).toString());
+  Expect.equals('../ya/b',
+      new Path('x/ya/b').relativeTo(new Path('x/y')).toString());
+  Expect.equals('../b',
+      new Path('x/y/../b').relativeTo(new Path('x/y/.')).toString());
+  Expect.equals('a/b/c',
+      new Path('x/y/a//b/./f/../c').relativeTo(new Path('x/y')).toString());
+  Expect.equals('.',
+      new Path('/x/y//').relativeTo(new Path('/x/y/')).toString());
+  Expect.equals('.',
+      new Path('/x/y/').relativeTo(new Path('/x/y')).toString());
+
   // Should always throw - no relative path can be constructed.
   Expect.throws(() =>
                 new Path('a/b').relativeTo(new Path('../../d')));
+  // Should always throw - relative and absolute paths are compared.
+  Expect.throws(() =>
+                new Path('/a/b').relativeTo(new Path('c/d')));
+
+  Expect.throws(() =>
+                new Path('a/b').relativeTo(new Path('/a/b')));
+
 }
 
-// Test that Windows share information is maintain through
+// Test that Windows share information is maintained through
 // Path operations.
 void testWindowsShare() {
   // Windows share information only makes sense on Windows.
diff --git a/tests/standalone/io/test_runner_test.dart b/tests/standalone/io/test_runner_test.dart
index b679dc5..c492161 100644
--- a/tests/standalone/io/test_runner_test.dart
+++ b/tests/standalone/io/test_runner_test.dart
@@ -5,6 +5,7 @@
 import "dart:io";
 import "dart:isolate";
 import "dart:async";
+import "dart:utf";
 import "../../../tools/testing/dart/test_runner.dart";
 import "../../../tools/testing/dart/status_file_parser.dart";
 import "../../../tools/testing/dart/test_options.dart";
@@ -22,9 +23,9 @@
       throw "Unexpected output: ${output.result}";
     }
     print("stdout: ");
-    print(new String.fromCharCodes(output.stdout));
+    print(decodeUtf8(output.stdout));
     print("stderr: ");
-    print(new String.fromCharCodes(output.stderr));
+    print(decodeUtf8(output.stderr));
 
     print("Time: ${output.time}");
     print("Exit code: ${output.exitCode}");
diff --git a/tests/standalone/io/web_socket_no_secure_test.dart b/tests/standalone/io/web_socket_no_secure_test.dart
new file mode 100644
index 0000000..1edf224
--- /dev/null
+++ b/tests/standalone/io/web_socket_no_secure_test.dart
@@ -0,0 +1,380 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+
+// TODO(7157): Remove this test once the bug is fixed.
+// This is a copy of web_socket_test.dart with the secure connection
+// tests disabled, so it does not crash on Windows.
+import "dart:async";
+import "dart:io";
+import "dart:isolate";
+import "dart:scalarlist";
+import "dart:uri";
+
+const SERVER_ADDRESS = "127.0.0.1";
+const HOST_NAME = "localhost";
+
+
+class WebSocketInfo {
+  int messageCount = 0;
+}
+
+
+/**
+ * A SecurityConfiguration lets us run the tests over HTTP or HTTPS.
+ */
+class SecurityConfiguration {
+  final bool secure;
+  HttpClient client;
+
+  SecurityConfiguration({bool this.secure}) : client = new HttpClient();
+
+  HttpServer createServer({int backlog}) {
+    HttpServer server = secure ? new HttpsServer() : new HttpServer();
+    server.listen(SERVER_ADDRESS,
+                  0,
+                  backlog: backlog,
+                  certificate_name: "CN=$HOST_NAME");
+    return server;
+  }
+
+  WebSocketClientConnection createClient(int port,
+                                         {bool followRedirects,
+                                          String method: "GET"}) {
+    HttpClientConnection conn = client.openUrl(method, new Uri.fromString(
+        '${secure ? "https" : "http"}://$HOST_NAME:$port/'));
+    if (followRedirects != null) {
+      conn.followRedirects = followRedirects;
+    }
+    return new WebSocketClientConnection(conn);
+  }
+
+  void testRequestResponseClientCloses(
+      int totalConnections, int closeStatus, String closeReason) {
+    HttpServer server = createServer(backlog: totalConnections);
+    HttpClient client = new HttpClient();
+
+    // Make a web socket handler and set it as the HTTP server default handler.
+    WebSocketHandler wsHandler = new WebSocketHandler();
+    wsHandler.onOpen = (WebSocketConnection conn) {
+      var count = 0;
+      conn.onMessage = (Object message) => conn.send(message);
+      conn.onClosed = (status, reason) {
+        Expect.equals(closeStatus == null
+                      ? WebSocketStatus.NO_STATUS_RECEIVED
+                      : closeStatus, status);
+        Expect.equals(closeReason == null ? "" : closeReason, reason);
+      };
+    };
+    server.defaultRequestHandler = wsHandler.onRequest;
+
+    int closeCount = 0;
+    String messageText = "Hello, world!";
+    for (int i = 0; i < totalConnections; i++) {
+      int messageCount = 0;
+      WebSocketClientConnection wsconn = createClient(server.port);
+      wsconn.onOpen = () => wsconn.send(messageText);
+      wsconn.onMessage = (message) {
+        messageCount++;
+        if (messageCount < 10) {
+          Expect.equals(messageText, message);
+          wsconn.send(message);
+        } else {
+          wsconn.close(closeStatus, closeReason);
+        }
+      };
+      wsconn.onClosed = (status, reason) {
+        Expect.equals(closeStatus == null
+                      ? WebSocketStatus.NO_STATUS_RECEIVED
+                      : closeStatus, status);
+        Expect.equals("", reason);
+        closeCount++;
+        if (closeCount == totalConnections) {
+          client.shutdown();
+          server.close();
+        }
+      };
+    }
+  }
+
+
+  void testRequestResponseServerCloses(
+      int totalConnections, int closeStatus, String closeReason) {
+    ReceivePort keepAlive = new ReceivePort();
+    HttpServer server = createServer(backlog: totalConnections);
+
+    // Create a web socket handler and set is as the HTTP server default
+    // handler.
+    int closeCount = 0;
+    WebSocketHandler wsHandler = new WebSocketHandler();
+    wsHandler.onOpen = (WebSocketConnection conn) {
+      String messageText = "Hello, world!";
+      int messageCount = 0;
+      conn.onMessage = (Object message) {
+        messageCount++;
+        if (messageCount < 10) {
+          Expect.equals(messageText, message);
+          conn.send(message);
+        } else {
+        conn.close(closeStatus, closeReason);
+        }
+      };
+      conn.onClosed = (status, reason) {
+        Expect.equals(closeStatus == null
+                      ? WebSocketStatus.NO_STATUS_RECEIVED
+                      : closeStatus, status);
+        Expect.equals("", reason);
+        closeCount++;
+        if (closeCount == totalConnections) {
+          client.shutdown();
+          server.close();
+          keepAlive.close();
+      }
+      };
+      conn.send(messageText);
+    };
+    server.defaultRequestHandler = wsHandler.onRequest;
+
+    for (int i = 0; i < totalConnections; i++) {
+      WebSocketClientConnection wsconn = createClient(server.port);
+      wsconn.onMessage = (message) => wsconn.send(message);
+      wsconn.onClosed = (status, reason) {
+        Expect.equals(closeStatus == null
+                      ? WebSocketStatus.NO_STATUS_RECEIVED
+                      : closeStatus, status);
+        Expect.equals(closeReason == null ? "" : closeReason, reason);
+      };
+    }
+  }
+
+
+  void testMessageLength(int messageLength) {
+    HttpServer server = createServer(backlog: 1);
+    bool serverReceivedMessage = false;
+    bool clientReceivedMessage = false;
+
+    // Create a web socket handler and set is as the HTTP server default
+    // handler.
+    Uint8List originalMessage = new Uint8List(messageLength);
+    WebSocketHandler wsHandler = new WebSocketHandler();
+    wsHandler.onOpen = (WebSocketConnection conn) {
+      conn.onMessage = (Object message) {
+        serverReceivedMessage = true;
+        Expect.listEquals(originalMessage, message);
+        conn.send(message);
+      };
+      conn.onClosed = (status, reason) {
+      };
+    };
+    server.defaultRequestHandler = wsHandler.onRequest;
+
+    WebSocketClientConnection wsconn = createClient(server.port);
+    wsconn.onMessage = (message) {
+      clientReceivedMessage = true;
+      Expect.listEquals(originalMessage, message);
+      wsconn.close();
+    };
+    wsconn.onClosed = (status, reason) {
+      Expect.isTrue(serverReceivedMessage);
+      Expect.isTrue(clientReceivedMessage);
+      client.shutdown();
+      server.close();
+    };
+    wsconn.onOpen = () {
+      wsconn.send(originalMessage);
+    };
+  }
+
+
+  void testNoUpgrade() {
+    HttpServer server = createServer(backlog: 5);
+
+    // Create a server which always responds with a redirect.
+    server.defaultRequestHandler = (request, response) {
+      response.statusCode = HttpStatus.MOVED_PERMANENTLY;
+      response.outputStream.close();
+    };
+
+    WebSocketClientConnection wsconn = createClient(server.port,
+                                                    followRedirects: false);
+    wsconn.onNoUpgrade = (response) {
+      Expect.equals(HttpStatus.MOVED_PERMANENTLY, response.statusCode);
+      client.shutdown();
+      server.close();
+    };
+  }
+
+
+  void testUsePOST() {
+    HttpServer server = createServer(backlog: 5);
+
+    // Create a web socket handler and set is as the HTTP server default
+    // handler.
+    int closeCount = 0;
+    WebSocketHandler wsHandler = new WebSocketHandler();
+    wsHandler.onOpen = (WebSocketConnection conn) {
+      Expect.fail("No connection expected");
+    };
+    server.defaultRequestHandler = wsHandler.onRequest;
+
+    WebSocketClientConnection wsconn = createClient(server.port,
+                                                    method: "POST");
+    wsconn.onNoUpgrade = (response) {
+      Expect.equals(HttpStatus.BAD_REQUEST, response.statusCode);
+      client.shutdown();
+      server.close();
+    };
+  }
+
+
+  void testHashCode(int totalConnections) {
+    ReceivePort keepAlive = new ReceivePort();
+    HttpServer server = createServer(backlog: totalConnections);
+    Map connections = new Map();
+
+    void handleMessage(conn, message) {
+      var info = connections[conn];
+      Expect.isNotNull(info);
+      info.messageCount++;
+      if (info.messageCount < 10) {
+        conn.send(message);
+      } else {
+        conn.close();
+      }
+    }
+
+    // Create a web socket handler and set is as the HTTP server default
+    // handler.
+    int closeCount = 0;
+    WebSocketHandler wsHandler = new WebSocketHandler();
+    wsHandler.onOpen = (WebSocketConnection conn) {
+      connections[conn] = new WebSocketInfo();
+      String messageText = "Hello, world!";
+      conn.onMessage = (Object message) {
+        handleMessage(conn, message);
+      };
+      conn.onClosed = (status, reason) {
+        closeCount++;
+        var info = connections[conn];
+        Expect.equals(10, info.messageCount);
+        if (closeCount == totalConnections) {
+          client.shutdown();
+          server.close();
+          keepAlive.close();
+        }
+      };
+      conn.send(messageText);
+    };
+    server.defaultRequestHandler = wsHandler.onRequest;
+
+    for (int i = 0; i < totalConnections; i++) {
+      WebSocketClientConnection wsconn = createClient(server.port);
+      wsconn.onMessage = (message) => wsconn.send(message);
+    }
+  }
+
+
+  void testW3CInterface(
+      int totalConnections, int closeStatus, String closeReason) {
+    HttpServer server = createServer(backlog: totalConnections);
+
+    // Create a web socket handler and set is as the HTTP server default
+    // handler.
+    int closeCount = 0;
+    WebSocketHandler wsHandler = new WebSocketHandler();
+    wsHandler.onOpen = (WebSocketConnection conn) {
+      String messageText = "Hello, world!";
+      int messageCount = 0;
+      conn.onMessage = (Object message) {
+        messageCount++;
+        if (messageCount < 10) {
+          Expect.equals(messageText, message);
+          conn.send(message);
+        } else {
+          conn.close(closeStatus, closeReason);
+        }
+      };
+      conn.onClosed = (status, reason) {
+        Expect.equals(closeStatus, status);
+        Expect.equals("", reason);
+        closeCount++;
+        if (closeCount == totalConnections) {
+          server.close();
+        }
+      };
+      conn.send(messageText);
+    };
+    server.defaultRequestHandler = wsHandler.onRequest;
+
+    void webSocketConnection() {
+      bool onopenCalled = false;
+      int onmessageCalled = 0;
+      bool oncloseCalled = false;
+
+      var websocket =
+          new WebSocket('${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}');
+      Expect.equals(WebSocket.CONNECTING, websocket.readyState);
+      websocket.onopen = () {
+        Expect.isFalse(onopenCalled);
+        Expect.equals(0, onmessageCalled);
+        Expect.isFalse(oncloseCalled);
+        onopenCalled = true;
+        Expect.equals(WebSocket.OPEN, websocket.readyState);
+      };
+      websocket.onmessage = (event) {
+        onmessageCalled++;
+        Expect.isTrue(onopenCalled);
+        Expect.isFalse(oncloseCalled);
+        Expect.equals(WebSocket.OPEN, websocket.readyState);
+        websocket.send(event.data);
+      };
+      websocket.onclose = (event) {
+        Expect.isTrue(onopenCalled);
+        Expect.equals(10, onmessageCalled);
+        Expect.isFalse(oncloseCalled);
+        oncloseCalled = true;
+        Expect.isTrue(event.wasClean);
+        Expect.equals(3002, event.code);
+        Expect.equals("Got tired", event.reason);
+        Expect.equals(WebSocket.CLOSED, websocket.readyState);
+      };
+    }
+
+    for (int i = 0; i < totalConnections; i++) {
+      webSocketConnection();
+    }
+  }
+
+
+  runTests() {
+    testRequestResponseClientCloses(2, null, null);
+    testRequestResponseClientCloses(2, 3001, null);
+    testRequestResponseClientCloses(2, 3002, "Got tired");
+    testRequestResponseServerCloses(2, null, null);
+    testRequestResponseServerCloses(2, 3001, null);
+    testRequestResponseServerCloses(2, 3002, "Got tired");
+    testMessageLength(125);
+    testMessageLength(126);
+    testMessageLength(127);
+    testMessageLength(65535);
+    testMessageLength(65536);
+    testNoUpgrade();
+    testUsePOST();
+    testHashCode(2);
+    testW3CInterface(2, 3002, "Got tired");
+  }
+}
+
+
+void initializeSSL() {
+  var testPkcertDatabase =
+      new Path(new Options().script).directoryPath.append("pkcert/");
+  SecureSocket.initialize(database: testPkcertDatabase.toNativePath(),
+                          password: "dartdart");
+}
+
+
+main() {
+  new SecurityConfiguration(secure: false).runTests();
+}
diff --git a/tests/standalone/io/web_socket_secure_test.dart b/tests/standalone/io/web_socket_secure_test.dart
index 6a749ce..707e469 100644
--- a/tests/standalone/io/web_socket_secure_test.dart
+++ b/tests/standalone/io/web_socket_secure_test.dart
@@ -13,7 +13,7 @@
   HttpsServer server = new HttpsServer();
   var client = new HttpClient();
 
-  // Create a web socket handler and set is as the HTTP server default
+  // Create a web socket handler and set it as the HTTP server default
   // handler.
   WebSocketHandler wsHandler = new WebSocketHandler();
   wsHandler.onOpen = (WebSocketConnection conn) {
diff --git a/tests/standalone/io/web_socket_test.dart b/tests/standalone/io/web_socket_test.dart
index 87a3223..95d56c9 100644
--- a/tests/standalone/io/web_socket_test.dart
+++ b/tests/standalone/io/web_socket_test.dart
@@ -3,195 +3,14 @@
 // BSD-style license that can be found in the LICENSE file.
 //
 
+import "dart:async";
 import "dart:io";
+import "dart:isolate";
 import "dart:scalarlist";
+import "dart:uri";
 
-void testRequestResponseClientCloses(
-    int totalConnections, int closeStatus, String closeReason) {
-  HttpServer server = new HttpServer();
-  HttpClient client = new HttpClient();
-
-  server.listen("127.0.0.1", 0, backlog: totalConnections);
-
-  // Create a web socket handler and set is as the HTTP server default
-  // handler.
-  WebSocketHandler wsHandler = new WebSocketHandler();
-  wsHandler.onOpen = (WebSocketConnection conn) {
-    var count = 0;
-    conn.onMessage = (Object message) => conn.send(message);
-    conn.onClosed = (status, reason) {
-      Expect.equals(closeStatus == null
-                    ? WebSocketStatus.NO_STATUS_RECEIVED
-                    : closeStatus, status);
-      Expect.equals(closeReason == null ? "" : closeReason, reason);
-    };
-  };
-  server.defaultRequestHandler = wsHandler.onRequest;
-
-  int closeCount = 0;
-  String messageText = "Hello, world!";
-  for (int i = 0; i < totalConnections; i++) {
-    int messageCount = 0;
-    HttpClientConnection conn = client.get("127.0.0.1", server.port, "/");
-    WebSocketClientConnection wsconn = new WebSocketClientConnection(conn);
-    wsconn.onOpen = () => wsconn.send(messageText);
-    wsconn.onMessage = (message) {
-      messageCount++;
-      if (messageCount < 10) {
-        Expect.equals(messageText, message);
-        wsconn.send(message);
-      } else {
-        wsconn.close(closeStatus, closeReason);
-      }
-    };
-    wsconn.onClosed = (status, reason) {
-      Expect.equals(closeStatus == null
-                    ? WebSocketStatus.NO_STATUS_RECEIVED
-                    : closeStatus, status);
-      Expect.equals("", reason);
-      closeCount++;
-      if (closeCount == totalConnections) {
-        client.shutdown();
-        server.close();
-      }
-    };
-  }
-}
-
-
-void testRequestResponseServerCloses(
-    int totalConnections, int closeStatus, String closeReason) {
-  HttpServer server = new HttpServer();
-  HttpClient client = new HttpClient();
-
-  server.listen("127.0.0.1", 0, backlog: totalConnections);
-
-  // Create a web socket handler and set is as the HTTP server default
-  // handler.
-  int closeCount = 0;
-  WebSocketHandler wsHandler = new WebSocketHandler();
-  wsHandler.onOpen = (WebSocketConnection conn) {
-    String messageText = "Hello, world!";
-    int messageCount = 0;
-    conn.onMessage = (Object message) {
-      messageCount++;
-      if (messageCount < 10) {
-        Expect.equals(messageText, message);
-        conn.send(message);
-      } else {
-        conn.close(closeStatus, closeReason);
-      }
-    };
-    conn.onClosed = (status, reason) {
-      Expect.equals(closeStatus == null
-                    ? WebSocketStatus.NO_STATUS_RECEIVED
-                    : closeStatus, status);
-      Expect.equals("", reason);
-      closeCount++;
-      if (closeCount == totalConnections) {
-        client.shutdown();
-        server.close();
-      }
-    };
-    conn.send(messageText);
-  };
-  server.defaultRequestHandler = wsHandler.onRequest;
-
-  for (int i = 0; i < totalConnections; i++) {
-    HttpClientConnection conn = client.get("127.0.0.1", server.port, "/");
-    WebSocketClientConnection wsconn = new WebSocketClientConnection(conn);
-    wsconn.onMessage = (message) => wsconn.send(message);
-    wsconn.onClosed = (status, reason) {
-      Expect.equals(closeStatus == null
-                    ? WebSocketStatus.NO_STATUS_RECEIVED
-                    : closeStatus, status);
-      Expect.equals(closeReason == null ? "" : closeReason, reason);
-    };
-  }
-}
-
-
-void testMessageLength(int messageLength) {
-  HttpServer server = new HttpServer();
-  HttpClient client = new HttpClient();
-
-  server.listen("127.0.0.1", 0, backlog: 1);
-
-  // Create a web socket handler and set is as the HTTP server default
-  // handler.
-  Uint8List originalMessage = new Uint8List(messageLength);
-  WebSocketHandler wsHandler = new WebSocketHandler();
-  wsHandler.onOpen = (WebSocketConnection conn) {
-    conn.onMessage = (Object message) {
-      Expect.listEquals(originalMessage, message);
-      conn.send(message);
-    };
-    conn.onClosed = (status, reason) {
-    };
-  };
-  server.defaultRequestHandler = wsHandler.onRequest;
-
-  HttpClientConnection conn = client.get("127.0.0.1", server.port, "/");
-  WebSocketClientConnection wsconn = new WebSocketClientConnection(conn);
-  wsconn.onMessage = (message) {
-    Expect.listEquals(originalMessage, message);
-    wsconn.close();
-  };
-  wsconn.onClosed = (status, reason) {
-    server.close();
-  };
-  wsconn.onOpen = () {
-    wsconn.send(originalMessage);
-  };
-}
-
-
-void testNoUpgrade() {
-  HttpServer server = new HttpServer();
-  HttpClient client = new HttpClient();
-
-  server.listen("127.0.0.1", 0, backlog: 5);
-
-  // Create a server which always responds with a redirect.
-  server.defaultRequestHandler = (request, response) {
-    response.statusCode = HttpStatus.MOVED_PERMANENTLY;
-    response.outputStream.close();
-  };
-
-  HttpClientConnection conn = client.get("127.0.0.1", server.port, "/");
-  conn.followRedirects = false;
-  WebSocketClientConnection wsconn = new WebSocketClientConnection(conn);
-  wsconn.onNoUpgrade = (response) {
-    Expect.equals(HttpStatus.MOVED_PERMANENTLY, response.statusCode);
-    client.shutdown();
-    server.close();
-  };
-}
-
-
-void testUsePOST() {
-  HttpServer server = new HttpServer();
-  HttpClient client = new HttpClient();
-
-  server.listen("127.0.0.1", 0, backlog: 5);
-
-  // Create a web socket handler and set is as the HTTP server default
-  // handler.
-  int closeCount = 0;
-  WebSocketHandler wsHandler = new WebSocketHandler();
-  wsHandler.onOpen = (WebSocketConnection conn) {
-    Expect.fail("No connection expected");
-  };
-  server.defaultRequestHandler = wsHandler.onRequest;
-
-  HttpClientConnection conn = client.post("127.0.0.1", server.port, "/");
-  WebSocketClientConnection wsconn = new WebSocketClientConnection(conn);
-  wsconn.onNoUpgrade = (response) {
-    Expect.equals(HttpStatus.BAD_REQUEST, response.statusCode);
-    client.shutdown();
-    server.close();
-  };
-}
+const SERVER_ADDRESS = "127.0.0.1";
+const HOST_NAME = "localhost";
 
 
 class WebSocketInfo {
@@ -199,143 +18,362 @@
 }
 
 
-void testHashCode(int totalConnections) {
-  HttpServer server = new HttpServer();
-  HttpClient client = new HttpClient();
-  Map connections = new Map();
+/**
+ * A SecurityConfiguration lets us run the tests over HTTP or HTTPS.
+ */
+class SecurityConfiguration {
+  final bool secure;
+  HttpClient client;
 
-  server.listen("127.0.0.1", 0, backlog: totalConnections);
+  SecurityConfiguration({bool this.secure}) : client = new HttpClient();
 
-  void handleMessage(conn, message) {
-    var info = connections[conn];
-    Expect.isNotNull(info);
-    info.messageCount++;
-    if (info.messageCount < 10) {
-      conn.send(message);
-    } else {
-      conn.close();
+  HttpServer createServer({int backlog}) {
+    HttpServer server = secure ? new HttpsServer() : new HttpServer();
+    server.listen(SERVER_ADDRESS,
+                  0,
+                  backlog: backlog,
+                  certificate_name: "CN=$HOST_NAME");
+    return server;
+  }
+
+  WebSocketClientConnection createClient(int port,
+                                         {bool followRedirects,
+                                          String method: "GET"}) {
+    HttpClientConnection conn = client.openUrl(method, new Uri.fromString(
+        '${secure ? "https" : "http"}://$HOST_NAME:$port/'));
+    if (followRedirects != null) {
+      conn.followRedirects = followRedirects;
+    }
+    return new WebSocketClientConnection(conn);
+  }
+
+  void testRequestResponseClientCloses(
+      int totalConnections, int closeStatus, String closeReason) {
+    HttpServer server = createServer(backlog: totalConnections);
+    HttpClient client = new HttpClient();
+
+    // Make a web socket handler and set it as the HTTP server default handler.
+    WebSocketHandler wsHandler = new WebSocketHandler();
+    wsHandler.onOpen = (WebSocketConnection conn) {
+      var count = 0;
+      conn.onMessage = (Object message) => conn.send(message);
+      conn.onClosed = (status, reason) {
+        Expect.equals(closeStatus == null
+                      ? WebSocketStatus.NO_STATUS_RECEIVED
+                      : closeStatus, status);
+        Expect.equals(closeReason == null ? "" : closeReason, reason);
+      };
+    };
+    server.defaultRequestHandler = wsHandler.onRequest;
+
+    int closeCount = 0;
+    String messageText = "Hello, world!";
+    for (int i = 0; i < totalConnections; i++) {
+      int messageCount = 0;
+      WebSocketClientConnection wsconn = createClient(server.port);
+      wsconn.onOpen = () => wsconn.send(messageText);
+      wsconn.onMessage = (message) {
+        messageCount++;
+        if (messageCount < 10) {
+          Expect.equals(messageText, message);
+          wsconn.send(message);
+        } else {
+          wsconn.close(closeStatus, closeReason);
+        }
+      };
+      wsconn.onClosed = (status, reason) {
+        Expect.equals(closeStatus == null
+                      ? WebSocketStatus.NO_STATUS_RECEIVED
+                      : closeStatus, status);
+        Expect.equals("", reason);
+        closeCount++;
+        if (closeCount == totalConnections) {
+          client.shutdown();
+          server.close();
+        }
+      };
     }
   }
 
-  // Create a web socket handler and set is as the HTTP server default
-  // handler.
-  int closeCount = 0;
-  WebSocketHandler wsHandler = new WebSocketHandler();
-  wsHandler.onOpen = (WebSocketConnection conn) {
-    connections[conn] = new WebSocketInfo();
-    String messageText = "Hello, world!";
-    conn.onMessage = (Object message) {
-      handleMessage(conn, message);
-    };
-    conn.onClosed = (status, reason) {
-      closeCount++;
-      var info = connections[conn];
-      Expect.equals(10, info.messageCount);
-      if (closeCount == totalConnections) {
-        client.shutdown();
-        server.close();
-      }
-    };
-    conn.send(messageText);
-  };
-  server.defaultRequestHandler = wsHandler.onRequest;
 
-  for (int i = 0; i < totalConnections; i++) {
-    HttpClientConnection conn = client.get("127.0.0.1", server.port, "/");
-    WebSocketClientConnection wsconn = new WebSocketClientConnection(conn);
-    wsconn.onMessage = (message) => wsconn.send(message);
+  void testRequestResponseServerCloses(
+      int totalConnections, int closeStatus, String closeReason) {
+    ReceivePort keepAlive = new ReceivePort();
+    HttpServer server = createServer(backlog: totalConnections);
+
+    // Create a web socket handler and set is as the HTTP server default
+    // handler.
+    int closeCount = 0;
+    WebSocketHandler wsHandler = new WebSocketHandler();
+    wsHandler.onOpen = (WebSocketConnection conn) {
+      String messageText = "Hello, world!";
+      int messageCount = 0;
+      conn.onMessage = (Object message) {
+        messageCount++;
+        if (messageCount < 10) {
+          Expect.equals(messageText, message);
+          conn.send(message);
+        } else {
+        conn.close(closeStatus, closeReason);
+        }
+      };
+      conn.onClosed = (status, reason) {
+        Expect.equals(closeStatus == null
+                      ? WebSocketStatus.NO_STATUS_RECEIVED
+                      : closeStatus, status);
+        Expect.equals("", reason);
+        closeCount++;
+        if (closeCount == totalConnections) {
+          client.shutdown();
+          server.close();
+          keepAlive.close();
+      }
+      };
+      conn.send(messageText);
+    };
+    server.defaultRequestHandler = wsHandler.onRequest;
+
+    for (int i = 0; i < totalConnections; i++) {
+      WebSocketClientConnection wsconn = createClient(server.port);
+      wsconn.onMessage = (message) => wsconn.send(message);
+      wsconn.onClosed = (status, reason) {
+        Expect.equals(closeStatus == null
+                      ? WebSocketStatus.NO_STATUS_RECEIVED
+                      : closeStatus, status);
+        Expect.equals(closeReason == null ? "" : closeReason, reason);
+      };
+    }
+  }
+
+
+  void testMessageLength(int messageLength) {
+    HttpServer server = createServer(backlog: 1);
+    bool serverReceivedMessage = false;
+    bool clientReceivedMessage = false;
+
+    // Create a web socket handler and set is as the HTTP server default
+    // handler.
+    Uint8List originalMessage = new Uint8List(messageLength);
+    WebSocketHandler wsHandler = new WebSocketHandler();
+    wsHandler.onOpen = (WebSocketConnection conn) {
+      conn.onMessage = (Object message) {
+        serverReceivedMessage = true;
+        Expect.listEquals(originalMessage, message);
+        conn.send(message);
+      };
+      conn.onClosed = (status, reason) {
+      };
+    };
+    server.defaultRequestHandler = wsHandler.onRequest;
+
+    WebSocketClientConnection wsconn = createClient(server.port);
+    wsconn.onMessage = (message) {
+      clientReceivedMessage = true;
+      Expect.listEquals(originalMessage, message);
+      wsconn.close();
+    };
+    wsconn.onClosed = (status, reason) {
+      Expect.isTrue(serverReceivedMessage);
+      Expect.isTrue(clientReceivedMessage);
+      client.shutdown();
+      server.close();
+    };
+    wsconn.onOpen = () {
+      wsconn.send(originalMessage);
+    };
+  }
+
+
+  void testNoUpgrade() {
+    HttpServer server = createServer(backlog: 5);
+
+    // Create a server which always responds with a redirect.
+    server.defaultRequestHandler = (request, response) {
+      response.statusCode = HttpStatus.MOVED_PERMANENTLY;
+      response.outputStream.close();
+    };
+
+    WebSocketClientConnection wsconn = createClient(server.port,
+                                                    followRedirects: false);
+    wsconn.onNoUpgrade = (response) {
+      Expect.equals(HttpStatus.MOVED_PERMANENTLY, response.statusCode);
+      client.shutdown();
+      server.close();
+    };
+  }
+
+
+  void testUsePOST() {
+    HttpServer server = createServer(backlog: 5);
+
+    // Create a web socket handler and set is as the HTTP server default
+    // handler.
+    int closeCount = 0;
+    WebSocketHandler wsHandler = new WebSocketHandler();
+    wsHandler.onOpen = (WebSocketConnection conn) {
+      Expect.fail("No connection expected");
+    };
+    server.defaultRequestHandler = wsHandler.onRequest;
+
+    WebSocketClientConnection wsconn = createClient(server.port,
+                                                    method: "POST");
+    wsconn.onNoUpgrade = (response) {
+      Expect.equals(HttpStatus.BAD_REQUEST, response.statusCode);
+      client.shutdown();
+      server.close();
+    };
+  }
+
+
+  void testHashCode(int totalConnections) {
+    ReceivePort keepAlive = new ReceivePort();
+    HttpServer server = createServer(backlog: totalConnections);
+    Map connections = new Map();
+
+    void handleMessage(conn, message) {
+      var info = connections[conn];
+      Expect.isNotNull(info);
+      info.messageCount++;
+      if (info.messageCount < 10) {
+        conn.send(message);
+      } else {
+        conn.close();
+      }
+    }
+
+    // Create a web socket handler and set is as the HTTP server default
+    // handler.
+    int closeCount = 0;
+    WebSocketHandler wsHandler = new WebSocketHandler();
+    wsHandler.onOpen = (WebSocketConnection conn) {
+      connections[conn] = new WebSocketInfo();
+      String messageText = "Hello, world!";
+      conn.onMessage = (Object message) {
+        handleMessage(conn, message);
+      };
+      conn.onClosed = (status, reason) {
+        closeCount++;
+        var info = connections[conn];
+        Expect.equals(10, info.messageCount);
+        if (closeCount == totalConnections) {
+          client.shutdown();
+          server.close();
+          keepAlive.close();
+        }
+      };
+      conn.send(messageText);
+    };
+    server.defaultRequestHandler = wsHandler.onRequest;
+
+    for (int i = 0; i < totalConnections; i++) {
+      WebSocketClientConnection wsconn = createClient(server.port);
+      wsconn.onMessage = (message) => wsconn.send(message);
+    }
+  }
+
+
+  void testW3CInterface(
+      int totalConnections, int closeStatus, String closeReason) {
+    HttpServer server = createServer(backlog: totalConnections);
+
+    // Create a web socket handler and set is as the HTTP server default
+    // handler.
+    int closeCount = 0;
+    WebSocketHandler wsHandler = new WebSocketHandler();
+    wsHandler.onOpen = (WebSocketConnection conn) {
+      String messageText = "Hello, world!";
+      int messageCount = 0;
+      conn.onMessage = (Object message) {
+        messageCount++;
+        if (messageCount < 10) {
+          Expect.equals(messageText, message);
+          conn.send(message);
+        } else {
+          conn.close(closeStatus, closeReason);
+        }
+      };
+      conn.onClosed = (status, reason) {
+        Expect.equals(closeStatus, status);
+        Expect.equals("", reason);
+        closeCount++;
+        if (closeCount == totalConnections) {
+          server.close();
+        }
+      };
+      conn.send(messageText);
+    };
+    server.defaultRequestHandler = wsHandler.onRequest;
+
+    void webSocketConnection() {
+      bool onopenCalled = false;
+      int onmessageCalled = 0;
+      bool oncloseCalled = false;
+
+      var websocket =
+          new WebSocket('${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}');
+      Expect.equals(WebSocket.CONNECTING, websocket.readyState);
+      websocket.onopen = () {
+        Expect.isFalse(onopenCalled);
+        Expect.equals(0, onmessageCalled);
+        Expect.isFalse(oncloseCalled);
+        onopenCalled = true;
+        Expect.equals(WebSocket.OPEN, websocket.readyState);
+      };
+      websocket.onmessage = (event) {
+        onmessageCalled++;
+        Expect.isTrue(onopenCalled);
+        Expect.isFalse(oncloseCalled);
+        Expect.equals(WebSocket.OPEN, websocket.readyState);
+        websocket.send(event.data);
+      };
+      websocket.onclose = (event) {
+        Expect.isTrue(onopenCalled);
+        Expect.equals(10, onmessageCalled);
+        Expect.isFalse(oncloseCalled);
+        oncloseCalled = true;
+        Expect.isTrue(event.wasClean);
+        Expect.equals(3002, event.code);
+        Expect.equals("Got tired", event.reason);
+        Expect.equals(WebSocket.CLOSED, websocket.readyState);
+      };
+    }
+
+    for (int i = 0; i < totalConnections; i++) {
+      webSocketConnection();
+    }
+  }
+
+
+  runTests() {
+    testRequestResponseClientCloses(2, null, null);
+    testRequestResponseClientCloses(2, 3001, null);
+    testRequestResponseClientCloses(2, 3002, "Got tired");
+    testRequestResponseServerCloses(2, null, null);
+    testRequestResponseServerCloses(2, 3001, null);
+    testRequestResponseServerCloses(2, 3002, "Got tired");
+    testMessageLength(125);
+    testMessageLength(126);
+    testMessageLength(127);
+    testMessageLength(65535);
+    testMessageLength(65536);
+    testNoUpgrade();
+    testUsePOST();
+    testHashCode(2);
+    testW3CInterface(2, 3002, "Got tired");
   }
 }
 
 
-void testW3CInterface(
-    int totalConnections, int closeStatus, String closeReason) {
-  HttpServer server = new HttpServer();
-
-  server.listen("127.0.0.1", 0, backlog: totalConnections);
-
-  // Create a web socket handler and set is as the HTTP server default
-  // handler.
-  int closeCount = 0;
-  WebSocketHandler wsHandler = new WebSocketHandler();
-  wsHandler.onOpen = (WebSocketConnection conn) {
-    String messageText = "Hello, world!";
-    int messageCount = 0;
-    conn.onMessage = (Object message) {
-      messageCount++;
-      if (messageCount < 10) {
-        Expect.equals(messageText, message);
-        conn.send(message);
-      } else {
-        conn.close(closeStatus, closeReason);
-      }
-    };
-    conn.onClosed = (status, reason) {
-      Expect.equals(closeStatus, status);
-      Expect.equals("", reason);
-      closeCount++;
-      if (closeCount == totalConnections) {
-        server.close();
-      }
-    };
-    conn.send(messageText);
-  };
-  server.defaultRequestHandler = wsHandler.onRequest;
-
-  void webSocketConnection() {
-    bool onopenCalled = false;
-    int onmessageCalled = 0;
-    bool oncloseCalled = false;
-
-    var websocket = new WebSocket("ws://127.0.0.1:${server.port}");
-    Expect.equals(WebSocket.CONNECTING, websocket.readyState);
-    websocket.onopen = () {
-      Expect.isFalse(onopenCalled);
-      Expect.equals(0, onmessageCalled);
-      Expect.isFalse(oncloseCalled);
-      onopenCalled = true;
-      Expect.equals(WebSocket.OPEN, websocket.readyState);
-    };
-    websocket.onmessage = (event) {
-      onmessageCalled++;
-      Expect.isTrue(onopenCalled);
-      Expect.isFalse(oncloseCalled);
-      Expect.equals(WebSocket.OPEN, websocket.readyState);
-      websocket.send(event.data);
-    };
-    websocket.onclose = (event) {
-      Expect.isTrue(onopenCalled);
-      Expect.equals(10, onmessageCalled);
-      Expect.isFalse(oncloseCalled);
-      oncloseCalled = true;
-      Expect.isTrue(event.wasClean);
-      Expect.equals(3002, event.code);
-      Expect.equals("Got tired", event.reason);
-      Expect.equals(WebSocket.CLOSED, websocket.readyState);
-    };
-  }
-
-  for (int i = 0; i < totalConnections; i++) {
-    webSocketConnection();
-  }
+void initializeSSL() {
+  var testPkcertDatabase =
+      new Path(new Options().script).directoryPath.append("pkcert/");
+  SecureSocket.initialize(database: testPkcertDatabase.toNativePath(),
+                          password: "dartdart");
 }
 
 
 main() {
-  testRequestResponseClientCloses(2, null, null);
-  testRequestResponseClientCloses(2, 3001, null);
-  testRequestResponseClientCloses(2, 3002, "Got tired");
-  testRequestResponseServerCloses(2, null, null);
-  testRequestResponseServerCloses(2, 3001, null);
-  testRequestResponseServerCloses(2, 3002, "Got tired");
-  testMessageLength(125);
-  testMessageLength(126);
-  testMessageLength(127);
-  testMessageLength(65535);
-  testMessageLength(65536);
-  testNoUpgrade();
-  testUsePOST();
-  testHashCode(2);
-
-  testW3CInterface(2, 3002, "Got tired");
+  new SecurityConfiguration(secure: false).runTests();
+  initializeSSL();
+  new SecurityConfiguration(secure: true).runTests();
 }
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index ef5332c..83fe0a1 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -42,6 +42,8 @@
 io/secure_no_builtin_roots_test: Pass, Crash  # Issue 7157
 io/secure_socket_bad_certificate_test: Pass, Crash, Fail, Timeout  # Issue 7157
 io/directory_list_nonexistent_test: Skip # Issue 7157
+io/web_socket_test: Skip # Issue 7157
+io/web_socket_no_secure_test: Pass # Issue 7157 - Remove test when fixed.
 
 [ $compiler == none && $runtime == drt ]
 io/*: Skip # Don't run tests using dart:io in the browser
@@ -86,6 +88,7 @@
 typed_array_test: Skip # This is a VM test
 float_array_test: Skip # This is a VM test
 int_array_test: Skip  # This is a VM test
+int_array_load_elimination_test: Skip  # This is a VM test
 medium_integer_test: Fail, OK # Test fails with JS number semantics: issue 1533.
 io/process_exit_negative_test: Fail, OK # relies on a static error that is a warning now.
 package/package_isolate_test: Skip # spawnUri does not work in dart2js. See issue 3051
diff --git a/tools/VERSION b/tools/VERSION
index bfd7fdf..4d038a5 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 3
-BUILD 0
-PATCH 1
+BUILD 1
+PATCH 0
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index f51520a..02d6ecb 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -22,7 +22,7 @@
 DART2JS_BUILDER = (
     r'dart2js-(linux|mac|windows)(-(jsshell))?-(debug|release)(-(checked|host-checked))?(-(host-checked))?(-(minified))?-?(\d*)-?(\d*)')
 WEB_BUILDER = (
-    r'dart2js-(ie9|ie10|ff|safari|chrome|opera)-(win7|win8|mac|linux)(-(all|html))?')
+    r'dart2js-(ie9|ie10|ff|safari|chrome|opera)-(win7|win8|mac|linux)(-(all|html))?(-(\d+)-(\d+))?')
 
 
 def GetBuildInfo(builder_name, is_buildbot):
@@ -49,6 +49,8 @@
     system = web_pattern.group(2)
     mode = 'release'
     test_set = web_pattern.group(4)
+    shard_index = web_pattern.group(6)
+    total_shards = web_pattern.group(7)
   elif dart2js_pattern:
     compiler = 'dart2js'
     system = dart2js_pattern.group(1)
@@ -119,7 +121,8 @@
                 '--runtime=' + runtime,
                 '--time',
                 '--use-sdk',
-                '--report'])
+                '--report',
+                '--write-debug-log'])
 
     # TODO(ricow/kustermann): Issue 7339
     if runtime == "safari":
@@ -134,7 +137,7 @@
     if IsFirstTestStepCall:
       IsFirstTestStepCall = False
     else:
-      cmd.append('--append_flaky_log')
+      cmd.append('--append_logs')
 
     if flags:
       cmd.extend(flags)
diff --git a/tools/build.py b/tools/build.py
index a1a6c54..84aa62b 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -30,7 +30,7 @@
       default=False, action="store_true")
   result.add_option("-a", "--arch",
       help='Target architectures (comma-separated).',
-      metavar='[all,ia32,x64,simarm,arm]',
+      metavar='[all,ia32,x64,simarm,arm,simmips,mips]',
       default=utils.GuessArchitecture())
   result.add_option("--os",
     help='Target OSs (comma-separated).',
@@ -71,7 +71,7 @@
       print "Unknown mode %s" % mode
       return False
   for arch in options.arch:
-    if not arch in ['ia32', 'x64', 'simarm', 'arm']:
+    if not arch in ['ia32', 'x64', 'simarm', 'arm', 'simmips', 'mips']:
       print "Unknown arch %s" % arch
       return False
   options.os = [ProcessOsOption(os) for os in options.os]
diff --git a/tools/create_editor.py b/tools/create_editor.py
index f2ccd8f..379bd6d 100644
--- a/tools/create_editor.py
+++ b/tools/create_editor.py
@@ -36,7 +36,7 @@
 }
 
 def AntPath():
-  parent = join('third_party', 'apache_ant', 'v1_7_1', 'bin')
+  parent = join('third_party', 'apache_ant', '1.8.4', 'bin')
   if utils.IsWindows():
     return join(parent, 'ant.bat')
   else:
@@ -85,7 +85,7 @@
 
 
 def BuildOptions():
-  options = optparse.OptionParser()
+  options = optparse.OptionParser(usage='usage: %prog [options] <output>')
   options.add_option("-m", "--mode",
       help='Build variant',
       metavar='[debug,release]')
@@ -102,9 +102,8 @@
   (options, args) = parser.parse_args()
   
   if len(args) > 1:
-    print 'usage: tools/create_editor.py [options] <output>'
     parser.print_help()
-    return 0
+    return 1
   
   osName = utils.GuessOS()
   mode = 'debug'
@@ -123,7 +122,7 @@
   if options.mode:
     mode = options.mode
   if options.arch:
-    mode = options.arch
+    arch = options.arch
 
   # If an output dir was not given, create one from os, mode, and arch.
   if not OUTPUT:
diff --git a/tools/create_sdk.py b/tools/create_sdk.py
index 825d2fa..1cb8fa8 100755
--- a/tools/create_sdk.py
+++ b/tools/create_sdk.py
@@ -25,6 +25,7 @@
 # ......_internal/
 # ......async/
 # ......collection/
+# ......collection_dev/
 # ......core/
 # ......crypto/
 # ......html/
@@ -198,13 +199,16 @@
   #
 
   os.makedirs(join(LIB, 'html'))
-  for library in ['_internal', 'async', 'collection', 'core', 'crypto', 'io',
-                  'isolate', join('html', 'dart2js'), join('html', 'dartium'),
-                  join('html', 'html_common'), join('indexed_db', 'dart2js'),
-                  join('indexed_db', 'dartium'), 'json', 'math', 'mirrors',
-                  'scalarlist', join('svg', 'dart2js'), join('svg', 'dartium'),
-                  'uri', 'utf', join('web_audio', 'dart2js'),
-                  join('web_audio', 'dartium')]:
+  for library in ['_internal', 'async', 'collection', 'collection_dev', 'core',
+                  'crypto', 'io', 'isolate',
+                  join('chrome', 'dart2js'), join('chrome', 'dartium'),
+                  join('html', 'dart2js'), join('html', 'dartium'),
+                  join('html', 'html_common'),
+                  join('indexed_db', 'dart2js'), join('indexed_db', 'dartium'),
+                  'json', 'math', 'mirrors', 'scalarlist',
+                  join('svg', 'dart2js'), join('svg', 'dartium'),
+                  'uri', 'utf',
+                  join('web_audio', 'dart2js'), join('web_audio', 'dartium')]:
     copytree(join(HOME, 'sdk', 'lib', library), join(LIB, library),
              ignore=ignore_patterns('*.svn', 'doc', '*.py', '*.gypi', '*.sh'))
 
diff --git a/tools/ddbg.dart b/tools/ddbg.dart
index c7febad..de21364 100644
--- a/tools/ddbg.dart
+++ b/tools/ddbg.dart
@@ -6,8 +6,9 @@
 // connection port.
 
 import "dart:io";
-import "dart:json";
+import "dart:json" as json;
 import "dart:utf";
+import "dart:async";
 
 
 Map<int, Completer> outstandingCommands;
@@ -66,9 +67,9 @@
   int id = cmd["id"];
   outstandingCommands[id] = completer;
   if (verbose) {
-    print("sending: '${jsonStringify(cmd)}'");
+    print("sending: '${json.stringify(cmd)}'");
   }
-  vmStream.writeString(jsonStringify(cmd));
+  vmStream.writeString(json.stringify(cmd));
   return completer.future;
 }
 
@@ -410,8 +411,8 @@
 }
 
 
-void processVmMessage(String json) {
-  var msg = parseJson(json);
+void processVmMessage(String jsonString) {
+  var msg = json.parse(jsonString);
   if (msg == null) {
     return;
   }
diff --git a/tools/dom/doc/html.dartdoc b/tools/dom/doc/html.dartdoc
deleted file mode 100644
index 069ed46..0000000
--- a/tools/dom/doc/html.dartdoc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Fake dart:html library for documentation.
-
-/// The Dart HTML5 Library.
-library dart.html;
-
-part 'interface/AbstractWorker.dartdoc';
-part 'interface/Element.dartdoc';
-part 'interface/Event.dartdoc';
-part 'interface/EventTarget.dartdoc';
-part 'interface/HttpRequest.dartdoc';
-part 'interface/MouseEvent.dartdoc';
-part 'interface/Storage.dartdoc';
-part 'interface/Node.dartdoc';
-part 'interface/UIEvent.dartdoc';
-part 'interface/WebSocket.dartdoc';
-
-// Implementation files that appear to be necessary to load the sources.
-
-//part 'nodoc-src/SomeFile.dart';
-
-// Global definitions.
-
-/**
- * The top-level Window object.
- */
-Window get window() => null;
-
-/**
- * The top-level Document object.
- */
-Document get document() => null;
-
-typedef void EventListener(Event event);
diff --git a/tools/dom/doc/interface/AbstractWorker.dartdoc b/tools/dom/doc/interface/AbstractWorker.dartdoc
deleted file mode 100644
index 010a3f8..0000000
--- a/tools/dom/doc/interface/AbstractWorker.dartdoc
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING:
-//   This file contains documentation that is merged into the real source.
-//   Do not make code changes here.
-
-/// An HTML5 Abstract Worker.
-abstract class AbstractWorker implements EventTarget {
-
-  /**
-   * The valid events associated with an AbstractWorker.
-   */
-  AbstractWorkerEvents get on;
-
-  /** @domName AbstractWorker.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName AbstractWorker.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName AbstractWorker.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class AbstractWorkerEvents implements Events {
-
-  EventListenerList get error;
-}
diff --git a/tools/dom/doc/interface/Element.dartdoc b/tools/dom/doc/interface/Element.dartdoc
deleted file mode 100644
index eb183e9..0000000
--- a/tools/dom/doc/interface/Element.dartdoc
+++ /dev/null
@@ -1,405 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/**
- * All your attribute manipulation needs in one place.
- * Extends the regular Map interface by automatically coercing non-string
- * values to strings.
- */
-abstract class AttributeMap implements Map<String, String> {
-  void operator []=(String key, value);
-}
-
-/**
- * All your element measurement needs in one place
- */
-abstract class ElementRect {
-  // Relative to offsetParent
-  ClientRect get client;
-  ClientRect get offset;
-  ClientRect get scroll;
-  // In global coords
-  ClientRect get bounding;
-  // In global coords
-  List<ClientRect> get clientRects;
-}
-
-abstract class NodeSelector {
-  Element query(String selectors);
-  List<Element> queryAll(String selectors);
-}
-
-abstract class CSSClassSet implements Set<String> {
-  /**
-   * Adds the class [token] to the element if it is not on it, removes it if it
-   * is.
-   */
-  bool toggle(String token);
-
-  /**
-   * Returns [:true:] classes cannot be added or removed from this
-   * [:CSSClassSet:].
-   */
-  bool get frozen;
-}
-
-/// @domName Element
-abstract class Element implements Node, NodeSelector {
-  factory Element.html(String html) =>
-      _ElementFactoryProvider.createElement_html(html);
-  factory Element.tag(String tag) =>
-      _ElementFactoryProvider.createElement_tag(tag);
-
-  AttributeMap get attributes;
-  void set attributes(Map<String, String> value);
-
-  /**
-   * @domName childElementCount, firstElementChild, lastElementChild,
-   *   children, Node.nodes.add
-   */
-  List<Element> get elements;
-
-  void set elements(Collection<Element> value);
-
-  /** @domName className, classList */
-  CSSClassSet get classes;
-
-  void set classes(Collection<String> value);
-
-  AttributeMap get dataAttributes;
-  void set dataAttributes(Map<String, String> value);
-
-  /**
-   * Adds the specified text as a text node after the last child of this.
-   */
-  void addText(String text);
-
-  /**
-   * Parses the specified text as HTML and adds the resulting node after the
-   * last child of this.
-   */
-  void addHTML(String html);
-
-  /**
-   * @domName getClientRects, getBoundingClientRect, clientHeight, clientWidth,
-   * clientTop, clientLeft, offsetHeight, offsetWidth, offsetTop, offsetLeft,
-   * scrollHeight, scrollWidth, scrollTop, scrollLeft
-   */
-  Future<ElementRect> get rect;
-
-  /** @domName Window.getComputedStyle */
-  Future<CSSStyleDeclaration> get computedStyle;
-
-  /** @domName Window.getComputedStyle */
-  Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement);
-
-  Element clone(bool deep);
-
-  Element get parent;
-
-  /**
-   * Experimental support for [web components][wc]. This field stores a
-   * reference to the component implementation. It was inspired by Mozilla's
-   * [x-tags][] project. Please note: in the future it may be possible to
-   * `extend Element` from your class, in which case this field will be
-   * deprecated and will simply return this [Element] object.
-   *
-   * [wc]: http://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html
-   * [x-tags]: http://x-tags.org/
-   */
-  var xtag;
-
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  ElementEvents get on;
-
-  /** @domName HTMLElement.children */
-  abstract HTMLCollection get $dom_children;
-
-  /** @domName HTMLElement.contentEditable */
-  String contentEditable;
-
-  /** @domName HTMLElement.dir */
-  String dir;
-
-  /** @domName HTMLElement.draggable */
-  bool draggable;
-
-  /** @domName HTMLElement.hidden */
-  bool hidden;
-
-  /** @domName HTMLElement.id */
-  String id;
-
-  /** @domName HTMLElement.innerHTML */
-  String innerHTML;
-
-  /** @domName HTMLElement.isContentEditable */
-  abstract bool get isContentEditable;
-
-  /** @domName HTMLElement.lang */
-  String lang;
-
-  /** @domName HTMLElement.outerHTML */
-  abstract String get outerHTML;
-
-  /** @domName HTMLElement.spellcheck */
-  bool spellcheck;
-
-  /** @domName HTMLElement.tabIndex */
-  int tabIndex;
-
-  /** @domName HTMLElement.title */
-  String title;
-
-  /** @domName HTMLElement.translate */
-  bool translate;
-
-  /** @domName HTMLElement.webkitdropzone */
-  String webkitdropzone;
-
-  /** @domName HTMLElement.click */
-  void click();
-
-  /** @domName HTMLElement.insertAdjacentElement */
-  Element insertAdjacentElement(String where, Element element);
-
-  /** @domName HTMLElement.insertAdjacentHTML */
-  void insertAdjacentHTML(String where, String html);
-
-  /** @domName HTMLElement.insertAdjacentText */
-  void insertAdjacentText(String where, String text);
-
-  static const int ALLOW_KEYBOARD_INPUT = 1;
-
-  /** @domName Element.childElementCount */
-  abstract int get $dom_childElementCount;
-
-  /** @domName Element.className */
-  String $dom_className;
-
-  /** @domName Element.clientHeight */
-  abstract int get $dom_clientHeight;
-
-  /** @domName Element.clientLeft */
-  abstract int get $dom_clientLeft;
-
-  /** @domName Element.clientTop */
-  abstract int get $dom_clientTop;
-
-  /** @domName Element.clientWidth */
-  abstract int get $dom_clientWidth;
-
-  /** @domName Element.dataset */
-  abstract Map<String, String> get dataset;
-
-  /** @domName Element.firstElementChild */
-  abstract Element get $dom_firstElementChild;
-
-  /** @domName Element.lastElementChild */
-  abstract Element get $dom_lastElementChild;
-
-  /** @domName Element.nextElementSibling */
-  abstract Element get nextElementSibling;
-
-  /** @domName Element.offsetHeight */
-  abstract int get $dom_offsetHeight;
-
-  /** @domName Element.offsetLeft */
-  abstract int get $dom_offsetLeft;
-
-  /** @domName Element.offsetParent */
-  abstract Element get offsetParent;
-
-  /** @domName Element.offsetTop */
-  abstract int get $dom_offsetTop;
-
-  /** @domName Element.offsetWidth */
-  abstract int get $dom_offsetWidth;
-
-  /** @domName Element.previousElementSibling */
-  abstract Element get previousElementSibling;
-
-  /** @domName Element.scrollHeight */
-  abstract int get $dom_scrollHeight;
-
-  /** @domName Element.scrollLeft */
-  int $dom_scrollLeft;
-
-  /** @domName Element.scrollTop */
-  int $dom_scrollTop;
-
-  /** @domName Element.scrollWidth */
-  abstract int get $dom_scrollWidth;
-
-  /** @domName Element.style */
-  abstract CSSStyleDeclaration get style;
-
-  /** @domName Element.tagName */
-  abstract String get tagName;
-
-  /** @domName Element.blur */
-  void blur();
-
-  /** @domName Element.focus */
-  void focus();
-
-  /** @domName Element.getAttribute */
-  String $dom_getAttribute(String name);
-
-  /** @domName Element.getBoundingClientRect */
-  ClientRect $dom_getBoundingClientRect();
-
-  /** @domName Element.getClientRects */
-  List<ClientRect> $dom_getClientRects();
-
-  /** @domName Element.getElementsByClassName */
-  List<Node> $dom_getElementsByClassName(String name);
-
-  /** @domName Element.getElementsByTagName */
-  List<Node> $dom_getElementsByTagName(String name);
-
-  /** @domName Element.hasAttribute */
-  bool $dom_hasAttribute(String name);
-
-  /** @domName Element.querySelector */
-  Element $dom_querySelector(String selectors);
-
-  /** @domName Element.querySelectorAll */
-  List<Node> $dom_querySelectorAll(String selectors);
-
-  /** @domName Element.remove */
-  void remove();
-
-  /** @domName Element.removeAttribute */
-  void $dom_removeAttribute(String name);
-
-  /** @domName Element.scrollByLines */
-  void scrollByLines(int lines);
-
-  /** @domName Element.scrollByPages */
-  void scrollByPages(int pages);
-
-  /** @domName Element.scrollIntoViewIfNeeded */
-  void scrollIntoView([bool centerIfNeeded]);
-
-  /** @domName Element.setAttribute */
-  void $dom_setAttribute(String name, String value);
-
-  /** @domName Element.webkitMatchesSelector */
-  bool matchesSelector(String selectors);
-
-  /** @domName Element.webkitRequestFullScreen */
-  void webkitRequestFullScreen(int flags);
-
-  /** @domName Element.webkitRequestFullscreen */
-  void webkitRequestFullscreen();
-
-  /** @domName Element.webkitRequestPointerLock */
-  void webkitRequestPointerLock();
-
-}
-
-abstract class ElementEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get beforeCopy;
-
-  EventListenerList get beforeCut;
-
-  EventListenerList get beforePaste;
-
-  EventListenerList get blur;
-
-  EventListenerList get change;
-
-  EventListenerList get click;
-
-  EventListenerList get contextMenu;
-
-  EventListenerList get copy;
-
-  EventListenerList get cut;
-
-  EventListenerList get doubleClick;
-
-  EventListenerList get drag;
-
-  EventListenerList get dragEnd;
-
-  EventListenerList get dragEnter;
-
-  EventListenerList get dragLeave;
-
-  EventListenerList get dragOver;
-
-  EventListenerList get dragStart;
-
-  EventListenerList get drop;
-
-  EventListenerList get error;
-
-  EventListenerList get focus;
-
-  EventListenerList get input;
-
-  EventListenerList get invalid;
-
-  EventListenerList get keyDown;
-
-  EventListenerList get keyPress;
-
-  EventListenerList get keyUp;
-
-  EventListenerList get load;
-
-  EventListenerList get mouseDown;
-
-  EventListenerList get mouseMove;
-
-  EventListenerList get mouseOut;
-
-  EventListenerList get mouseOver;
-
-  EventListenerList get mouseUp;
-
-  EventListenerList get mouseWheel;
-
-  EventListenerList get paste;
-
-  EventListenerList get reset;
-
-  EventListenerList get scroll;
-
-  EventListenerList get search;
-
-  EventListenerList get select;
-
-  EventListenerList get selectStart;
-
-  EventListenerList get submit;
-
-  EventListenerList get touchCancel;
-
-  EventListenerList get touchEnd;
-
-  EventListenerList get touchEnter;
-
-  EventListenerList get touchLeave;
-
-  EventListenerList get touchMove;
-
-  EventListenerList get touchStart;
-
-  EventListenerList get transitionEnd;
-
-  EventListenerList get fullscreenChange;
-
-  EventListenerList get fullscreenError;
-}
diff --git a/tools/dom/doc/interface/Event.dartdoc b/tools/dom/doc/interface/Event.dartdoc
deleted file mode 100644
index eee2da6..0000000
--- a/tools/dom/doc/interface/Event.dartdoc
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Event
-abstract class Event {
-
-  // In JS, canBubble and cancelable are technically required parameters to
-  // init*Event. In practice, though, if they aren't provided they simply
-  // default to false (since that's Boolean(undefined)).
-  //
-  // Contrary to JS, we default canBubble and cancelable to true, since that's
-  // what people want most of the time anyway.
-  factory Event(String type, [bool canBubble = true, bool cancelable = true]) =>
-      _EventFactoryProvider.createEvent(type, canBubble, cancelable);
-
-  static const int AT_TARGET = 2;
-
-  static const int BLUR = 8192;
-
-  static const int BUBBLING_PHASE = 3;
-
-  static const int CAPTURING_PHASE = 1;
-
-  static const int CHANGE = 32768;
-
-  static const int CLICK = 64;
-
-  static const int DBLCLICK = 128;
-
-  static const int DRAGDROP = 2048;
-
-  static const int FOCUS = 4096;
-
-  static const int KEYDOWN = 256;
-
-  static const int KEYPRESS = 1024;
-
-  static const int KEYUP = 512;
-
-  static const int MOUSEDOWN = 1;
-
-  static const int MOUSEDRAG = 32;
-
-  static const int MOUSEMOVE = 16;
-
-  static const int MOUSEOUT = 8;
-
-  static const int MOUSEOVER = 4;
-
-  static const int MOUSEUP = 2;
-
-  static const int NONE = 0;
-
-  static const int SELECT = 16384;
-
-  /** @domName Event.bubbles */
-  abstract bool get bubbles;
-
-  /** @domName Event.cancelBubble */
-  bool cancelBubble;
-
-  /** @domName Event.cancelable */
-  abstract bool get cancelable;
-
-  /** @domName Event.clipboardData */
-  abstract Clipboard get clipboardData;
-
-  /** @domName Event.currentTarget */
-  abstract EventTarget get currentTarget;
-
-  /** @domName Event.defaultPrevented */
-  abstract bool get defaultPrevented;
-
-  /** @domName Event.eventPhase */
-  abstract int get eventPhase;
-
-  /** @domName Event.returnValue */
-  bool returnValue;
-
-  /** @domName Event.srcElement */
-  abstract EventTarget get srcElement;
-
-  /** @domName Event.target */
-  abstract EventTarget get target;
-
-  /** @domName Event.timeStamp */
-  abstract int get timeStamp;
-
-  /** @domName Event.type */
-  abstract String get type;
-
-  /** @domName Event.initEvent */
-  void $dom_initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg);
-
-  /** @domName Event.preventDefault */
-  void preventDefault();
-
-  /** @domName Event.stopImmediatePropagation */
-  void stopImmediatePropagation();
-
-  /** @domName Event.stopPropagation */
-  void stopPropagation();
-}
diff --git a/tools/dom/doc/interface/EventTarget.dartdoc b/tools/dom/doc/interface/EventTarget.dartdoc
deleted file mode 100644
index c5bf532..0000000
--- a/tools/dom/doc/interface/EventTarget.dartdoc
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-abstract class EventListenerList {
-  EventListenerList add(EventListener handler, [bool useCapture]);
-
-  EventListenerList remove(EventListener handler, [bool useCapture]);
-
-  bool dispatch(Event evt);
-}
-
-abstract class Events {
-  EventListenerList operator [](String type);
-}
-
-/// @domName EventTarget
-abstract class EventTarget {
-
-  /** @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent */
-  abstract Events get on;
-
-  /** @domName EventTarget.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName EventTarget.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName EventTarget.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-}
diff --git a/tools/dom/doc/interface/HttpRequest.dartdoc b/tools/dom/doc/interface/HttpRequest.dartdoc
deleted file mode 100644
index 70fe830..0000000
--- a/tools/dom/doc/interface/HttpRequest.dartdoc
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING:
-//   This file contains documentation that is merged into the real source.
-//   Do not make code changes here.
-
-/**
- * HttpRequest is Dart's name for the XMLHttpRequest object, as described below.
- */
-
-/// @domName XMLHttpRequest
-abstract class HttpRequest implements EventTarget {
-  factory HttpRequest.get(String url, onSuccess(HttpRequest request)) =>
-      _HttpRequestFactoryProvider.createHttpRequest_get(url, onSuccess);
-
-  factory HttpRequest.getWithCredentials(String url, onSuccess(HttpRequest request)) =>
-      _HttpRequestFactoryProvider.createHttpRequestgetWithCredentials(url, onSuccess);
-
-  factory HttpRequest() => _HttpRequestFactoryProvider.createHttpRequest();
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  HttpRequestEvents get on;
-
-  static const int DONE = 4;
-
-  static const int HEADERS_RECEIVED = 2;
-
-  static const int LOADING = 3;
-
-  static const int OPENED = 1;
-
-  static const int UNSENT = 0;
-
-  /** @domName XMLHttpRequest.readyState */
-  abstract int get readyState;
-
-  /** @domName XMLHttpRequest.response */
-  abstract Object get response;
-
-  /** @domName XMLHttpRequest.responseText */
-  abstract String get responseText;
-
-  /** @domName XMLHttpRequest.responseType */
-  String responseType;
-
-  /** @domName XMLHttpRequest.responseXML */
-  abstract Document get responseXML;
-
-  /** @domName XMLHttpRequest.status */
-  abstract int get status;
-
-  /** @domName XMLHttpRequest.statusText */
-  abstract String get statusText;
-
-  /** @domName XMLHttpRequest.upload */
-  abstract HttpRequestUpload get upload;
-
-  /** @domName XMLHttpRequest.withCredentials */
-  bool withCredentials;
-
-  /** @domName XMLHttpRequest.abort */
-  void abort();
-
-  /** @domName XMLHttpRequest.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName XMLHttpRequest.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName XMLHttpRequest.getAllResponseHeaders */
-  String getAllResponseHeaders();
-
-  /** @domName XMLHttpRequest.getResponseHeader */
-  String getResponseHeader(String header);
-
-  /** @domName XMLHttpRequest.open */
-  void open(String method, String url, [bool async, String user, String password]);
-
-  /** @domName XMLHttpRequest.overrideMimeType */
-  void overrideMimeType(String override);
-
-  /** @domName XMLHttpRequest.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName XMLHttpRequest.send */
-  void send([data]);
-
-  /** @domName XMLHttpRequest.setRequestHeader */
-  void setRequestHeader(String header, String value);
-}
-
-abstract class HttpRequestEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get error;
-
-  EventListenerList get load;
-
-  EventListenerList get loadEnd;
-
-  EventListenerList get loadStart;
-
-  EventListenerList get progress;
-
-  EventListenerList get readyStateChange;
-}
diff --git a/tools/dom/doc/interface/MouseEvent.dartdoc b/tools/dom/doc/interface/MouseEvent.dartdoc
deleted file mode 100644
index f2e82cd..0000000
--- a/tools/dom/doc/interface/MouseEvent.dartdoc
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING:
-//   This file contains documentation that is merged into the real source.
-//   Do not make code changes here.
-
-/// @domName MouseEvent
-abstract class MouseEvent implements UIEvent {
-
-  factory MouseEvent(String type, Window view, int detail, int screenX, int screenY,
-      int clientX, int clientY, int button, [bool canBubble = true,
-      bool cancelable = true, bool ctrlKey = false, bool altKey = false,
-      bool shiftKey = false, bool metaKey = false,
-      EventTarget relatedTarget = null]) =>
-      _MouseEventFactoryProvider.createMouseEvent(
-          type, view, detail, screenX, screenY,
-          clientX, clientY, button, canBubble, cancelable,
-          ctrlKey, altKey, shiftKey, metaKey,
-          relatedTarget);
-
-
-  /** @domName MouseEvent.altKey */
-  abstract bool get altKey;
-
-  /** @domName MouseEvent.button */
-  abstract int get button;
-
-  /** @domName MouseEvent.clientX */
-  abstract int get clientX;
-
-  /** @domName MouseEvent.clientY */
-  abstract int get clientY;
-
-  /** @domName MouseEvent.ctrlKey */
-  abstract bool get ctrlKey;
-
-  /** @domName MouseEvent.dataTransfer */
-  abstract Clipboard get dataTransfer;
-
-  /** @domName MouseEvent.fromElement */
-  abstract Node get fromElement;
-
-  /** @domName MouseEvent.metaKey */
-  abstract bool get metaKey;
-
-  /**
-   * The X coordinate of the mouse pointer in target node coordinates.
-   * This value may vary between platforms if the target node moves
-   * after the event has fired or if the element has CSS transforms affecting
-   * it.
-   */
-  abstract int get offsetX;
-
-  /**
-   * The Y coordinate of the mouse pointer in target node coordinates.
-   * This value may vary between platforms if the target node moves
-   * after the event has fired or if the element has CSS transforms affecting
-   * it.
-   */
-  abstract int get offsetY;
-
-  /** @domName MouseEvent.relatedTarget */
-  abstract EventTarget get relatedTarget;
-
-  /** @domName MouseEvent.screenX */
-  abstract int get screenX;
-
-  /** @domName MouseEvent.screenY */
-  abstract int get screenY;
-
-  /** @domName MouseEvent.shiftKey */
-  abstract bool get shiftKey;
-
-  /** @domName MouseEvent.toElement */
-  abstract Node get toElement;
-
-  /** @domName MouseEvent.webkitMovementX */
-  abstract int get webkitMovementX;
-
-  /** @domName MouseEvent.webkitMovementY */
-  abstract int get webkitMovementY;
-
-  /** @domName MouseEvent.x */
-  abstract int get x;
-
-  /** @domName MouseEvent.y */
-  abstract int get y;
-
-  /** @domName MouseEvent.initMouseEvent */
-  void $dom_initMouseEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget);
-}
diff --git a/tools/dom/doc/interface/Node.dartdoc b/tools/dom/doc/interface/Node.dartdoc
deleted file mode 100644
index 44c1db2..0000000
--- a/tools/dom/doc/interface/Node.dartdoc
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Node
-abstract class Node implements EventTarget {
-  List<Node> get nodes;
-
-  void set nodes(Collection<Node> value);
-
-  /**
-   * Replaces this node with another node.
-   * @domName Node.replaceChild
-   */
-  Node replaceWith(Node otherNode);
-
-  /**
-   * Removes this node from the DOM.
-   * @domName Node.removeChild
-   */
-  void remove();
-
-
-  static const int ATTRIBUTE_NODE = 2;
-
-  static const int CDATA_SECTION_NODE = 4;
-
-  static const int COMMENT_NODE = 8;
-
-  static const int DOCUMENT_FRAGMENT_NODE = 11;
-
-  static const int DOCUMENT_NODE = 9;
-
-  static const int DOCUMENT_POSITION_CONTAINED_BY = 0x10;
-
-  static const int DOCUMENT_POSITION_CONTAINS = 0x08;
-
-  static const int DOCUMENT_POSITION_DISCONNECTED = 0x01;
-
-  static const int DOCUMENT_POSITION_FOLLOWING = 0x04;
-
-  static const int DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
-
-  static const int DOCUMENT_POSITION_PRECEDING = 0x02;
-
-  static const int DOCUMENT_TYPE_NODE = 10;
-
-  static const int ELEMENT_NODE = 1;
-
-  static const int ENTITY_NODE = 6;
-
-  static const int ENTITY_REFERENCE_NODE = 5;
-
-  static const int NOTATION_NODE = 12;
-
-  static const int PROCESSING_INSTRUCTION_NODE = 7;
-
-  static const int TEXT_NODE = 3;
-
-  /** @domName Node.attributes */
-  abstract NamedNodeMap get $dom_attributes;
-
-  /** @domName Node.childNodes */
-  abstract List<Node> get $dom_childNodes;
-
-  /** @domName Node.firstChild */
-  abstract Node get $dom_firstChild;
-
-  /** @domName Node.lastChild */
-  abstract Node get $dom_lastChild;
-
-  /** @domName Node.nextSibling */
-  abstract Node get nextNode;
-
-  /** @domName Node.nodeType */
-  abstract int get $dom_nodeType;
-
-  /** @domName Node.ownerDocument */
-  abstract Document get document;
-
-  /** @domName Node.parentNode */
-  abstract Node get parent;
-
-  /** @domName Node.previousSibling */
-  abstract Node get previousNode;
-
-  /** @domName Node.textContent */
-  String text;
-
-  /** @domName Node.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName Node.appendChild */
-  Node $dom_appendChild(Node newChild);
-
-  /** @domName Node.cloneNode */
-  Node clone(bool deep);
-
-  /** @domName Node.contains */
-  bool contains(Node other);
-
-  /** @domName Node.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName Node.hasChildNodes */
-  bool hasChildNodes();
-
-  /** @domName Node.insertBefore */
-  Node insertBefore(Node newChild, Node refChild);
-
-  /** @domName Node.removeChild */
-  Node $dom_removeChild(Node oldChild);
-
-  /** @domName Node.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName Node.replaceChild */
-  Node $dom_replaceChild(Node newChild, Node oldChild);
-
-}
diff --git a/tools/dom/doc/interface/Storage.dartdoc b/tools/dom/doc/interface/Storage.dartdoc
deleted file mode 100644
index a72fd52..0000000
--- a/tools/dom/doc/interface/Storage.dartdoc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// @domName Storage
-/**
- * The type used by the
- * [Window.localStorage] and [Window.sessionStorage] properties.
- * Storage is implemented as a Map&lt;String, String>.
- *
- * To store and get values, use Dart's built-in map syntax:
- *
- *     window.localStorage['key1'] = 'val1';
- *     window.localStorage['key2'] = 'val2';
- *     window.localStorage['key3'] = 'val3';
- *     assert(window.localStorage['key3'] == 'val3');
- * 
- * You can use [Map](http://api.dartlang.org/dart_core/Map.html) APIs
- * such as containsValue(), clear(), and length:
- *
- *     assert(window.localStorage.containsValue('does not exist') == false);
- *     window.localStorage.clear();
- *     assert(window.localStorage.length == 0);
- *
- * For more examples of using this API, see
- * [localstorage_test.dart](http://code.google.com/p/dart/source/browse/branches/bleeding_edge/dart/tests/html/localstorage_test.dart).
- * For details on using the Map API, see the
- * [Maps](http://www.dartlang.org/docs/library-tour/#maps-aka-dictionaries-or-hashes)
- * section of the library tour.
- *
- */
-abstract class Storage implements Map<String, String> {
-
-  /** @domName Storage.length */
-  abstract int get $dom_length;
-
-  /** @domName Storage.clear */
-  void $dom_clear();
-
-  /** @domName Storage.getItem */
-  String $dom_getItem(String key);
-
-  /** @domName Storage.key */
-  String $dom_key(int index);
-
-  /** @domName Storage.removeItem */
-  void $dom_removeItem(String key);
-
-  /** @domName Storage.setItem */
-  void $dom_setItem(String key, String data);
-
-}
diff --git a/tools/dom/doc/interface/UIEvent.dartdoc b/tools/dom/doc/interface/UIEvent.dartdoc
deleted file mode 100644
index 9a0754b..0000000
--- a/tools/dom/doc/interface/UIEvent.dartdoc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName UIEvent
-abstract class UIEvent implements Event {
-
-  /** @domName UIEvent.charCode */
-  abstract int get charCode;
-
-  /** @domName UIEvent.detail */
-  abstract int get detail;
-
-  /** @domName UIEvent.keyCode */
-  abstract int get keyCode;
-
-  /** @domName UIEvent.layerX */
-  abstract int get layerX;
-
-  /** @domName UIEvent.layerY */
-  abstract int get layerY;
-
-  /** @domName UIEvent.pageX */
-  abstract int get pageX;
-
-  /** @domName UIEvent.pageY */
-  abstract int get pageY;
-
-  /** @domName UIEvent.view */
-  abstract Window get view;
-
-  /** @domName UIEvent.which */
-  abstract int get which;
-
-  /** @domName UIEvent.initUIEvent */
-  void initUIEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail);
-}
diff --git a/tools/dom/doc/interface/WebSocket.dartdoc b/tools/dom/doc/interface/WebSocket.dartdoc
deleted file mode 100644
index 1938552..0000000
--- a/tools/dom/doc/interface/WebSocket.dartdoc
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// @domName WebSocket
-/**
- * Use the WebSocket interface to connect to a WebSocket,
- * and to send and receive data on that WebSocket.
- *
- * To use a WebSocket in your web app, first create a WebSocket object,
- * passing the WebSocket URL as an argument to the constructor.
- *
- *     var webSocket = new WebSocket('ws://127.0.0.1:1337/ws');
- *
- * To send data on the WebSocket, use the [send] method.
- *
- *     if (webSocket != null && webSocket.readyState == WebSocket.OPEN) {
- *       webSocket.send(data);
- *     } else {
- *       print('WebSocket not connected, message $data not sent');
- *     }
- *
- * To receive data on the WebSocket, register a listener for message events.
- *
- *     webSocket.on.message.add((MessageEvent e) {
- *       receivedData(e.data);
- *     });
- *
- * The message event handler receives a [MessageEvent] object
- * as its sole argument.
- * You can also define open, close, and error handlers,
- * as specified by [WebSocketEvents].
- *
- * For more information, see the
- * [WebSockets](http://www.dartlang.org/docs/library-tour/#html-websockets)
- * section of the library tour and
- * [Introducing WebSockets](http://www.html5rocks.com/en/tutorials/websockets/basics/),
- * an HTML5Rocks.com tutorial.
- */
-abstract class WebSocket implements EventTarget {
-
-  factory WebSocket(String url) => _WebSocketFactoryProvider.createWebSocket(url);
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  WebSocketEvents get on;
-
-  static const int CLOSED = 3;
-
-  static const int CLOSING = 2;
-
-  static const int CONNECTING = 0;
-
-  static const int OPEN = 1;
-
-  /** @domName WebSocket.URL */
-  abstract String get URL;
-
-  /** @domName WebSocket.binaryType */
-  String binaryType;
-
-  /** @domName WebSocket.bufferedAmount */
-  abstract int get bufferedAmount;
-
-  /** @domName WebSocket.extensions */
-  abstract String get extensions;
-
-  /** @domName WebSocket.protocol */
-  abstract String get protocol;
-
-  /** @domName WebSocket.readyState */
-  abstract int get readyState;
-
-  /** @domName WebSocket.url */
-  abstract String get url;
-
-  /** @domName WebSocket.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName WebSocket.close */
-  void close([int code, String reason]);
-
-  /** @domName WebSocket.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName WebSocket.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName WebSocket.send */
-  void send(data);
-}
-
-abstract class WebSocketEvents implements Events {
-
-  EventListenerList get close;
-
-  EventListenerList get error;
-
-  EventListenerList get message;
-
-  EventListenerList get open;
-}
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index 1fab40f..c73a508 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -26,6 +26,10 @@
 };
 Element implements ElementTraversal;
 
+// TODO(antonm): fix it
+[Supplemental, Constructor]
+interface MediaStream {};
+
 [Callback]
 interface TimeoutHandler {
   void handleEvent();
@@ -287,6 +291,13 @@
   [StrictTypeChecking, Custom] attribute float value;
 };
 
+// Keep it in to generate Dart code, C++ implementation is filterd out in generator.
+[
+  Callback
+] interface MutationCallback {
+  [Custom] boolean handleEvent(in MutationRecordArray mutations, in MutationObserver observer);
+};
+
 [Supplemental,
   CustomConstructor,
   // Provide missing constructor signature.
diff --git a/tools/dom/scripts/dartdomgenerator.py b/tools/dom/scripts/dartdomgenerator.py
index 24ef49e..9007790 100755
--- a/tools/dom/scripts/dartdomgenerator.py
+++ b/tools/dom/scripts/dartdomgenerator.py
@@ -9,6 +9,7 @@
 import database
 import fremontcutbuilder
 import logging.config
+import monitored
 import multiemitter
 import optparse
 import os
@@ -28,7 +29,7 @@
 
 _logger = logging.getLogger('dartdomgenerator')
 
-_libraries = ['html', 'indexed_db', 'svg', 'web_audio']
+_libraries = ['chrome', 'html', 'indexed_db', 'svg', 'web_audio']
 
 class GeneratorOptions(object):
   def __init__(self, templates, database, type_registry, renamer):
@@ -37,12 +38,6 @@
     self.type_registry = type_registry
     self.renamer = renamer
 
-# TODO(vsm): Remove once we fix Dartium to pass in the database directly.
-def Generate(database_dir, use_database_cache, dart2js_output_dir=None,
-             dartium_output_dir=None):
-  database = LoadDatabase(database_dir, use_database_cache)
-  GenerateFromDatabase(database, dart2js_output_dir, dartium_output_dir)
-
 def LoadDatabase(database_dir, use_database_cache):
   common_database = database.Database(database_dir)
   if use_database_cache:
@@ -138,6 +133,8 @@
   _logger.info('Flush...')
   emitters.Flush()
 
+  monitored.FinishMonitoring()
+
 def GenerateSingleFile(library_path, output_dir, generated_output_dir=None):
   library_dir = os.path.dirname(library_path)
   library_filename = os.path.basename(library_path)
@@ -195,24 +192,6 @@
     database = LoadDatabase(database_dir, options.use_database_cache)
   GenerateFromDatabase(database, dart2js_output_dir, dartium_output_dir)
 
-  _logger.info('Add documentation to generated classes.')
-  html_to_json_script = os.path.relpath(
-      '../../html_json_doc/bin/html_json_doc.dart',
-      current_dir)
-  html_output_dir = os.path.join(output_dir, 'dart2js/dart/html/')
-  svg_output_dir = os.path.join(output_dir, 'dart2js/dart/svg/')
-  html_json_path = os.path.relpath('../docs/html_docs.json')
-  svg_json_path = os.path.relpath('../docs/svg_docs.json')
-
-  path_to_dart = utils.DartSdkBinary()
-  html_command = ' '.join([path_to_dart, html_to_json_script,
-                           '--mode=json-to-html', html_output_dir,
-                           html_json_path])
-  svg_command = ' '.join([path_to_dart, html_to_json_script,
-                          '--mode=json-to-html', svg_output_dir, svg_json_path])
-  subprocess.call([html_command], shell=True)
-  subprocess.call([svg_command], shell=True)
-
   if 'htmldart2js' in systems:
     _logger.info('Generating dart2js single files.')
     for library_name in _libraries:
diff --git a/tools/dom/scripts/dartgenerator.py b/tools/dom/scripts/dartgenerator.py
index ac399eb..5fb409c 100755
--- a/tools/dom/scripts/dartgenerator.py
+++ b/tools/dom/scripts/dartgenerator.py
@@ -148,16 +148,16 @@
       else:
         database.DeleteInterface(interface.id)
 
-      # Ugly temporary hack
-      websocket_interface = database.GetInterface('WebSocket')
-      def make_object(**fields):
-        o = type('Anon', (object,), {})()
-        for k, v in fields.items(): setattr(o, k, v)
-        o.ext_attrs = {}
-        return o
-      arg = make_object(id = 'url', type = make_object(id = 'DOMString'))
-      websocket_interface.ext_attrs['Constructor'] = make_object(arguments = [arg])
-      websocket_interface.ext_attrs['CustomConstructor'] = True
+    # Ugly temporary hack
+    websocket_interface = database.GetInterface('WebSocket')
+    def make_object(**fields):
+      o = type('Anon', (object,), {})()
+      for k, v in fields.items(): setattr(o, k, v)
+      o.ext_attrs = {}
+      return o
+    arg = make_object(id = 'url', type = make_object(id = 'DOMString'))
+    websocket_interface.ext_attrs['Constructor'] = make_object(arguments = [arg])
+    websocket_interface.ext_attrs['CustomConstructor'] = True
 
     self.FilterMembersWithUnidentifiedTypes(database)
 
diff --git a/tools/dom/scripts/fremontcutbuilder.py b/tools/dom/scripts/fremontcutbuilder.py
index 220f565..c0919fb 100755
--- a/tools/dom/scripts/fremontcutbuilder.py
+++ b/tools/dom/scripts/fremontcutbuilder.py
@@ -53,7 +53,6 @@
     'ENABLE_METER_ELEMENT',
     'ENABLE_METER_TAG',
     'ENABLE_MHTML',
-    'ENABLE_MUTATION_OBSERVERS',
     'ENABLE_NOTIFICATIONS',
     'ENABLE_OVERFLOW_SCROLLING',
     'ENABLE_PAGE_POPUP',
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index ad36286..265eab9 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -17,6 +17,7 @@
     'ElementTraversal',
     'EventListener',
     'MediaQueryListListener',
+    'MutationCallback',
     'NodeSelector',
     'SVGExternalResourcesRequired',
     'SVGFilterPrimitiveStandardAttributes',
@@ -74,9 +75,9 @@
     'Int16Array': '_TypedArrayFactoryProvider',
     'Int32Array': '_TypedArrayFactoryProvider',
     'Uint8Array': '_TypedArrayFactoryProvider',
+    'Uint8ClampedArray': '_TypedArrayFactoryProvider',
     'Uint16Array': '_TypedArrayFactoryProvider',
     'Uint32Array': '_TypedArrayFactoryProvider',
-    'Uint8ClampedArray': '_TypedArrayFactoryProvider',
 }
 
 #
@@ -640,6 +641,12 @@
   "@SupportedBrowser(SupportedBrowser.SAFARI)",
 ]
 
+_webkit_experimental_annotations = [
+  "@SupportedBrowser(SupportedBrowser.CHROME)",
+  "@SupportedBrowser(SupportedBrowser.SAFARI)",
+  "@Experimental()",
+]
+
 _history_annotations = _all_but_ie9_annotations
 
 _performance_annotations = [
@@ -655,8 +662,16 @@
 dart_annotations = {
   'ArrayBuffer': _all_but_ie9_annotations,
   'ArrayBufferView': _all_but_ie9_annotations,
+  'DOMApplicationCache': [
+    "@SupportedBrowser(SupportedBrowser.CHROME)",
+    "@SupportedBrowser(SupportedBrowser.FIREFOX)",
+    "@SupportedBrowser(SupportedBrowser.IE, '10')",
+    "@SupportedBrowser(SupportedBrowser.OPERA)",
+    "@SupportedBrowser(SupportedBrowser.SAFARI)",
+  ],
   'DOMWindow.indexedDB': _indexed_db_annotations,
   'DOMWindow.performance': _performance_annotations,
+  'DOMWindow.webkitNotifications': _webkit_experimental_annotations,
   'DOMWindow.webkitRequestFileSystem': _file_system_annotations,
   'DOMWindow.webkitResolveLocalFileSystemURL': _file_system_annotations,
   'Element.webkitCreateShadowRoot': [
@@ -672,21 +687,13 @@
     "@Experimental()",
   ],
   'HTMLDataListElement': _all_but_ie9_annotations,
-  'HTMLDetailsElement': [
-    "@SupportedBrowser(SupportedBrowser.CHROME)",
-    "@SupportedBrowser(SupportedBrowser.SAFARI)",
-    "@Experimental()",
-  ],
+  'HTMLDetailsElement': _webkit_experimental_annotations,
   'HTMLEmbedElement': [
     "@SupportedBrowser(SupportedBrowser.CHROME)",
     "@SupportedBrowser(SupportedBrowser.IE)",
     "@SupportedBrowser(SupportedBrowser.SAFARI)",
   ],
-  'HTMLKeygenElement': [
-    "@SupportedBrowser(SupportedBrowser.CHROME)",
-    "@SupportedBrowser(SupportedBrowser.SAFARI)",
-    "@Experimental()",
-  ],
+  'HTMLKeygenElement': _webkit_experimental_annotations,
   'HTMLMeterElement': [
     "@SupportedBrowser(SupportedBrowser.CHROME)",
     "@SupportedBrowser(SupportedBrowser.FIREFOX)",
@@ -714,6 +721,7 @@
   ],
   'IDBFactory': _indexed_db_annotations,
   'IDBDatabase': _indexed_db_annotations,
+  'NotificationCenter': _webkit_experimental_annotations,
   'Performance': _performance_annotations,
   'ShadowRoot': [
     "@SupportedBrowser(SupportedBrowser.CHROME, '25')",
@@ -731,9 +739,16 @@
   """ Finds annotations common between dart2js and dartium.
   """
   if member_name:
-    return dart_annotations.get('%s.%s' % (interface_name, member_name))
+    key = '%s.%s' % (interface_name, member_name)
   else:
-    return dart_annotations.get(interface_name)
+    key = interface_name
+
+  annotations = ["@DocsEditable",
+                 "@DomName('" + key + "')",]
+  if (dart_annotations.get(key) != None):
+    annotations.extend(dart_annotations.get(key))
+
+  return annotations
 
 def FindDart2JSAnnotations(idl_type, interface_name, member_name):
   """ Finds all annotations for Dart2JS members- including annotations for
@@ -751,6 +766,13 @@
       annotations = ann2
   return annotations
 
+def AnyConversionAnnotations(idl_type, interface_name, member_name):
+  if (dart_annotations.get('%s.%s' % (interface_name, member_name)) or
+      _FindDart2JSSpecificAnnotations(idl_type, interface_name, member_name)):
+    return True
+  else:
+    return False
+
 def _FindDart2JSSpecificAnnotations(idl_type, interface_name, member_name):
   """ Finds dart2js-specific annotations. This does not include ones shared with
   dartium.
@@ -852,9 +874,9 @@
         'Int16Array',
         'Int32Array',
         'Uint8Array',
+        'Uint8ClampedArray',
         'Uint16Array',
         'Uint32Array',
-        'Uint8ClampedArray',
     ]
 
     if self._idl_type in WTF_INCLUDES:
@@ -1081,7 +1103,7 @@
 class TypeData(object):
   def __init__(self, clazz, dart_type=None, native_type=None,
                merged_interface=None, merged_into=None,
-               custom_to_dart=None, custom_to_native=None,
+               custom_to_dart=False, custom_to_native=False,
                conversion_includes=None,
                webcore_getter_name='getAttribute',
                webcore_setter_name='setAttribute',
@@ -1221,6 +1243,7 @@
     'Int16Array': TypedArrayTypeData('int'),
     'Int32Array': TypedArrayTypeData('int'),
     'Uint8Array': TypedArrayTypeData('int'),
+    'Uint8ClampedArray': TypedArrayTypeData('int'),
     'Uint16Array': TypedArrayTypeData('int'),
     'Uint32Array': TypedArrayTypeData('int'),
 
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 26bda0c..b813f7f 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -8,7 +8,7 @@
 
 from generator import AnalyzeOperation, ConstantOutputOrder, \
     DartDomNameOfAttribute, FindMatchingAttribute, IsDartCollectionType, \
-    IsPureInterface, TypeOrNothing
+    IsPureInterface, TypeOrNothing, FindCommonAnnotations
 
 # Types that are accessible cross-frame in a limited fashion.
 # In these cases, the base type (e.g., WindowBase) provides restricted access
@@ -37,29 +37,12 @@
           '  static bool get supported => $SUPPORT_CHECK;\n',
           SUPPORT_CHECK=support_check)
 
-  def EmitAttributeDocumentation(self, attribute):
-    """ Emits the MDN dartdoc comment for an attribute.
-    """
-    dom_name = DartDomNameOfAttribute(attribute)
-    self._members_emitter.Emit('\n  /// @domName $DOMINTERFACE.$DOMNAME;'
-                               ' @docsEditable true',
-        DOMINTERFACE=attribute.doc_js_interface_name,
-        DOMNAME=dom_name)
-
-  def EmitOperationDocumentation(self, operation):
-    """ Emits the MDN dartdoc comment for an operation.
-    """
-    self._members_emitter.Emit('\n  /// @domName $DOMINTERFACE.$DOMNAME;'
-                               ' @docsEditable true',
-        DOMINTERFACE=operation.overloads[0].doc_js_interface_name,
-        DOMNAME=operation.name)
-
   def EmitEventGetter(self, events_class_name):
     self._members_emitter.Emit(
-        '\n  /// @domName EventTarget.addEventListener, '
-        'EventTarget.removeEventListener, EventTarget.dispatchEvent;'
-        ' @docsEditable true'
-        '\n  $TYPE get on =>\n    new $TYPE(this);\n',
+        "\n  @DocsEditable"
+        "\n  @DomName('EventTarget.addEventListener, "
+        "EventTarget.removeEventListener, EventTarget.dispatchEvent')"
+        "\n  $TYPE get on =>\n    new $TYPE(this);\n",
         TYPE=events_class_name)
 
   def AddMembers(self, interface, declare_only=False):
@@ -129,7 +112,7 @@
 
   def AddConstant(self, constant):
     const_name = self._renamer.RenameMember(
-        self._interface.id, constant, constant.id, dartify_name=False)
+        self._interface.id, constant, constant.id, 'get:', dartify_name=False)
     if not const_name:
       return
     type = TypeOrNothing(self._DartType(constant.type.id), constant.type.id)
@@ -178,7 +161,8 @@
     # merging the relevant data into info itself.
     method_name = self._renamer.RenameMember(self._interface.id,
                                              info.operations[0],
-                                             info.name)
+                                             info.name,
+                                             'call:')
     if not method_name:
       if info.name == 'item':
         # FIXME: item should be renamed to operator[], not removed.
@@ -293,7 +277,7 @@
 
   def _AddConstructor(self,
       constructor_info, factory_name, factory_constructor_name):
-    self._members_emitter.Emit('\n  ///@docsEditable true');
+    self._members_emitter.Emit('\n  @DocsEditable');
 
     if not factory_constructor_name:
       factory_constructor_name = '_create'
@@ -365,7 +349,6 @@
   def DeclareAttribute(self, attribute, type_name, attr_name, read_only):
     """ Declares an attribute but does not include the code to invoke it.
     """
-    self.EmitAttributeDocumentation(attribute)
     if read_only:
       template = '\n  $TYPE get $NAME;\n'
     else:
@@ -382,7 +365,6 @@
       return_type_name - The name of the return type.
       method_name - The name of the method.
     """
-    self.EmitOperationDocumentation(operation)
     self._members_emitter.Emit(
              '\n'
              '  $TYPE $NAME($PARAMS);\n',
diff --git a/tools/dom/scripts/htmleventgenerator.py b/tools/dom/scripts/htmleventgenerator.py
index 4c6966c..10aaca0 100644
--- a/tools/dom/scripts/htmleventgenerator.py
+++ b/tools/dom/scripts/htmleventgenerator.py
@@ -380,14 +380,19 @@
     self._renamer = renamer
     self._template_loader = template_loader
 
-  def EmitStreamProviders(self, interface, html_interface_name, custom_events,
+  def EmitStreamProviders(self, interface, custom_events,
       members_emitter):
-    events = self._GetEvents(interface, html_interface_name, custom_events)
+    events = self._GetEvents(interface, custom_events)
     if not events:
       return
 
     for event_info in events:
       (dom_name, html_name, event_type) = event_info
+
+      # If we're using a different provider, then don't declare one.
+      if self._GetEventRedirection(interface, html_name, event_type):
+        continue
+
       members_emitter.Emit(
           "\n"
           "  static const EventStreamProvider<$TYPE> $(NAME)Event = "
@@ -396,9 +401,9 @@
           DOM_NAME=dom_name,
           TYPE=event_type)
 
-  def EmitStreamGetters(self, interface, html_interface_name, custom_events,
+  def EmitStreamGetters(self, interface, custom_events,
       members_emitter):
-    events = self._GetEvents(interface, html_interface_name, custom_events)
+    events = self._GetEvents(interface, custom_events)
     if not events:
       return
 
@@ -406,19 +411,30 @@
       (dom_name, html_name, event_type) = event_info
       getter_name = 'on%s%s' % (html_name[:1].upper(), html_name[1:])
 
+      # If the provider is declared elsewhere, point to that.
+      redirection = self._GetEventRedirection(interface, html_name, event_type)
+      if redirection:
+        provider = '%s.%sEvent' % (redirection, html_name)
+      else:
+        provider = html_name + 'Event'
+
       members_emitter.Emit(
           "\n"
           "  Stream<$TYPE> get $(NAME) => $PROVIDER.forTarget(this);\n",
           NAME=getter_name,
-          PROVIDER=html_name + 'Event',
+          PROVIDER=provider,
           TYPE=event_type)
 
-  def _GetEvents(self, interface, html_interface_name, custom_events):
+  def _GetEvents(self, interface, custom_events):
+    """ Gets a list of all of the events for the specified interface.
+    """
     events = set([attr for attr in interface.attributes
                   if attr.type.id == 'EventListener'])
     if not events and interface.id not in _html_explicit_event_classes:
       return None
 
+    html_interface_name = interface.doc_js_name
+
     dom_event_names = set()
     for event in events:
       dom_name = event.id[2:]
@@ -434,12 +450,49 @@
         continue
 
       (html_name, event_type) = event_info
+      if self._IsEventSuppressed(interface, html_name, event_type):
+        continue
+
       full_event_name = '%sEvents.%s' % (html_interface_name, html_name)
       if not full_event_name in custom_events:
         events.append((dom_name, html_name, event_type))
     return events
 
+  def _HasEvent(self, events, event_name, event_type):
+    """ Checks if the event is declared in the list of events (from _GetEvents),
+    with the same event type.
+    """
+    for (dom_name, html_name, found_type) in events:
+      if html_name == event_name and event_type == found_type:
+        return True
+    return False
+
+  def _IsEventSuppressed(self, interface, event_name, event_type):
+    """ Checks if the event should not be emitted.
+    """
+    if self._renamer.ShouldSuppressMember(interface, event_name, 'on:'):
+      return True
+
+    if interface.doc_js_name == 'Window':
+      media_interface = self._database.GetInterface('HTMLMediaElement')
+      media_events = self._GetEvents(media_interface, [])
+      if self._HasEvent(media_events, event_name, event_type):
+        return True
+
+  def _GetEventRedirection(self, interface, event_name, event_type):
+    """ For events which are declared in one place, but exposed elsewhere,
+    this gets the source of the event (where the provider is declared)
+    """
+    if interface.doc_js_name == 'Window' or interface.doc_js_name == 'Document':
+      element_interface = self._database.GetInterface('Element')
+      element_events = self._GetEvents(element_interface, [])
+      if self._HasEvent(element_events, event_name, event_type):
+        return 'Element'
+    return None
+
   def _FindEventInfo(self, html_interface_name, dom_event_name):
+    """ Finds the event info (event name and type).
+    """
     key = '%s.%s' % (html_interface_name, dom_event_name)
     if key in _html_event_types:
       return _html_event_types[key]
@@ -476,9 +529,9 @@
     template_file = 'impl_%s.darttemplate' % events_class_name
     template = (self._template_loader.TryLoad(template_file) or
         '\n'
-        '/// @docsEditable true\n'
+        '@DocsEditable\n'
         'class $CLASSNAME extends $SUPER {\n'
-        '  /// @docsEditable true\n'
+        '  @DocsEditable\n'
         '  $CLASSNAME(EventTarget _ptr) : super(_ptr);\n'
         '$!MEMBERS}\n')
 
@@ -505,7 +558,7 @@
       if not full_event_name in custom_events:
         implementation_events_members.Emit(
             "\n"
-            "  /// @docsEditable true\n"
+            "  @DocsEditable\n"
             "  EventListenerList get $NAME => this['$DOM_NAME'];\n",
           NAME=html_name,
             DOM_NAME=dom_name)
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 287a4e4..53488dd 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -2,9 +2,11 @@
 # Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
+import logging
+import monitored
 import re
 
-html_interface_renames = {
+html_interface_renames = monitored.Dict('htmlrenamer.html_interface_renames', {
     'CDATASection': 'CDataSection',
     'DOMApplicationCache': 'ApplicationCache',
     'DOMCoreException': 'DomException',
@@ -13,35 +15,40 @@
     'DOMFormData': 'FormData',
     'DOMURL': 'Url',
     'DOMWindow': 'Window',
+    'HTMLAppletElement' : '_AppletElement',
+    'HTMLBaseFontElement' : '_BaseFontElement',
+    'HTMLDirectoryElement' : '_DirectoryElement',
     'HTMLDocument' : 'HtmlDocument',
+    'HTMLFontElement' : '_FontElement',
+    'HTMLFrameElement' : '_FrameElement',
+    'HTMLFrameSetElement' : '_FrameSetElement',
+    'HTMLMarqueeElement' : '_MarqueeElement',
     'IDBAny': '_Any', # Suppressed, but needs to exist for Dartium.
     'IDBFactory': 'IdbFactory', # Manual to avoid name conflicts.
+    'NavigatorUserMediaErrorCallback': '_NavigatorUserMediaErrorCallback',
+    'NavigatorUserMediaSuccessCallback': '_NavigatorUserMediaSuccessCallback',
     'SVGDocument': 'SvgDocument', # Manual to avoid name conflicts.
     'SVGElement': 'SvgElement', # Manual to avoid name conflicts.
     'SVGException': 'SvgException', # Manual of avoid conflict with Exception.
     'SVGSVGElement': 'SvgSvgElement', # Manual to avoid name conflicts.
     'WebGLVertexArrayObjectOES': 'WebGLVertexArrayObject',
-    'WebKitAnimation': 'Animation',
     'WebKitAnimationEvent': 'AnimationEvent',
-    'WebKitBlobBuilder': 'BlobBuilder',
     'WebKitCSSKeyframeRule': 'CssKeyframeRule',
     'WebKitCSSKeyframesRule': 'CssKeyframesRule',
     'WebKitCSSMatrix': 'CssMatrix',
     'WebKitCSSTransformValue': 'CssTransformValue',
-    'WebKitFlags': 'Flags',
-    'WebKitLoseContext': 'LoseContext',
     'WebKitPoint': 'Point',
     'WebKitTransitionEvent': 'TransitionEvent',
     'XMLHttpRequest': 'HttpRequest',
     'XMLHttpRequestException': 'HttpRequestException',
     'XMLHttpRequestProgressEvent': 'HttpRequestProgressEvent',
     'XMLHttpRequestUpload': 'HttpRequestUpload',
-}
+})
 
 # Members from the standard dom that should not be exposed publicly in dart:html
 # but need to be exposed internally to implement dart:html on top of a standard
 # browser.
-_private_html_members = set([
+_private_html_members = monitored.Set('htmlrenamer._private_html_members', [
   'CustomEvent.initCustomEvent',
   'Document.createElement',
   'Document.createElementNS',
@@ -131,62 +138,51 @@
   'UIEvent.keyCode',
   'WheelEvent.wheelDeltaX',
   'WheelEvent.wheelDeltaY',
-  'Window.getComputedStyle',
+  'WheelEvent.initWebKitWheelEvent',
+  'DOMWindow.getComputedStyle',
 ])
 
 # Members from the standard dom that exist in the dart:html library with
 # identical functionality but with cleaner names.
-_renamed_html_members = {
-    'AnimatedString.className': '$dom_svgClassName',
+_renamed_html_members = monitored.Dict('htmlrenamer._renamed_html_members', {
+    'DOMURL.createObjectURL': 'createObjectUrl',
+    'DOMURL.revokeObjectURL': 'revokeObjectUrl',
+    'DOMWindow.webkitNotifications': 'notifications',
+    'DOMWindow.webkitRequestFileSystem': 'requestFileSystem',
+    'DOMWindow.webkitResolveLocalFileSystemURL': 'resolveLocalFileSystemUrl',
+    'DOMWindow.webkitRequestFileSystem': 'requestFileSystem',
+    'DOMWindow.webkitResolveLocalFileSystemURL': 'resolveLocalFileSystemUrl',
     'Document.createCDATASection': 'createCDataSection',
     'Document.defaultView': 'window',
     'Element.scrollIntoViewIfNeeded': 'scrollIntoView',
     'Element.webkitCreateShadowRoot': 'createShadowRoot',
     'Element.webkitMatchesSelector' : 'matches',
+    'Navigator.webkitGetUserMedia': '_getUserMedia',
     'Node.cloneNode': 'clone',
     'Node.nextSibling': 'nextNode',
     'Node.ownerDocument': 'document',
     'Node.parentElement': 'parent',
     'Node.previousSibling': 'previousNode',
     'Node.textContent': 'text',
-    'Stylable.className': '$dom_svgClassName',
-    'SvgElement.className': '$dom_svgClassName',
-    'Url.createObjectURL': 'createObjectUrl',
-    'Url.revokeObjectURL': 'revokeObjectUrl',
-    'Window.webkitRequestFileSystem': 'requestFileSystem',
-    'Window.webkitResolveLocalFileSystemURL': 'resolveLocalFileSystemUrl',
+    'SVGElement.className': '$dom_svgClassName',
+    'SVGStylable.className': '$dom_svgClassName',
     'WorkerContext.webkitRequestFileSystem': 'requestFileSystem',
     'WorkerContext.webkitRequestFileSystemSync': 'requestFileSystemSync',
     'WorkerContext.webkitResolveLocalFileSystemSyncURL':
         'resolveLocalFileSystemSyncUrl',
     'WorkerContext.webkitResolveLocalFileSystemURL':
         'resolveLocalFileSystemUrl',
-}
+})
 
 # Members and classes from the dom that should be removed completely from
 # dart:html.  These could be expressed in the IDL instead but expressing this
 # as a simple table instead is more concise.
-# Syntax is: ClassName.(get\.|set\.)?MemberName
+# Syntax is: ClassName.(get\:|set\:|call\:|on\:)?MemberName
 # Using get: and set: is optional and should only be used when a getter needs
 # to be suppressed but not the setter, etc.
 # TODO(jacobr): cleanup and augment this list.
-_removed_html_members = set([
-    'AnchorElement.charset',
-    'AnchorElement.coords',
-    'AnchorElement.rev',
-    'AnchorElement.shape',
-    'AnchorElement.text',
-    'AreaElement.noHref',
+_removed_html_members = monitored.Set('htmlrenamer._removed_html_members', [
     'Attr.*',
-    'BRElement.clear',
-    'BodyElement.aLink',
-    'BodyElement.background',
-    'BodyElement.bgColor',
-    'BodyElement.bgColor',
-    'BodyElement.link',
-    'BodyElement.text',
-    'BodyElement.text',
-    'BodyElement.vlink',
     'CanvasRenderingContext2D.clearShadow',
     'CanvasRenderingContext2D.drawImageFromRect',
     'CanvasRenderingContext2D.setAlpha',
@@ -198,12 +194,14 @@
     'CanvasRenderingContext2D.setMiterLimit',
     'CanvasRenderingContext2D.setShadow',
     'CanvasRenderingContext2D.setStrokeColor',
-    'Cursor.NEXT',
-    'Cursor.NEXT_NO_DUPLICATE',
-    'Cursor.PREV',
-    'Cursor.PREV_NO_DUPLICATE',
-    'DListElement.compact',
-    'DivElement.align',
+    'DOMWindow.call:blur',
+    'DOMWindow.clientInformation',
+    'DOMWindow.call:focus',
+    'DOMWindow.get:frames',
+    'DOMWindow.get:length',
+    'DOMWindow.prompt',
+    'DOMWindow.webkitCancelRequestAnimationFrame',
+    'DOMWindow.webkitIndexedDB',
     'Document.adoptNode',
     'Document.alinkColor',
     'Document.all',
@@ -226,17 +224,14 @@
     'Document.fgColor',
     'Document.get:URL',
     'Document.get:anchors',
-    'Document.get:applets',
     'Document.get:characterSet',
     'Document.get:compatMode',
-    'Document.get:compatMode',
     'Document.get:defaultCharset',
     'Document.get:doctype',
     'Document.get:documentURI',
     'Document.get:embeds',
     'Document.get:forms',
     'Document.get:height',
-    'Document.get:images',
     'Document.get:inputEncoding',
     'Document.get:links',
     'Document.get:plugins',
@@ -250,12 +245,9 @@
     'Document.importNode',
     'Document.linkColor',
     'Document.location',
-    'Document.manifest',
     'Document.open',
     'Document.releaseEvents',
-    'Document.set:documentURI',
     'Document.set:domain',
-    'Document.version',
     'Document.vlinkColor',
     'Document.webkitCurrentFullScreenElement',
     'Document.webkitFullScreenKeyboardInputAllowed',
@@ -264,18 +256,38 @@
     'Document.xmlStandalone',
     'Document.xmlVersion',
     'DocumentType.*',
+    'DOMCoreException.code',
+    'DOMCoreException.ABORT_ERR',
+    'DOMCoreException.DATA_CLONE_ERR',
+    'DOMCoreException.DOMSTRING_SIZE_ERR',
+    'DOMCoreException.HIERARCHY_REQUEST_ERR',
+    'DOMCoreException.INDEX_SIZE_ERR',
+    'DOMCoreException.INUSE_ATTRIBUTE_ERR',
+    'DOMCoreException.INVALID_ACCESS_ERR',
+    'DOMCoreException.INVALID_CHARACTER_ERR',
+    'DOMCoreException.INVALID_MODIFICATION_ERR',
+    'DOMCoreException.INVALID_NODE_TYPE_ERR',
+    'DOMCoreException.INVALID_STATE_ERR',
+    'DOMCoreException.NAMESPACE_ERR',
+    'DOMCoreException.NETWORK_ERR',
+    'DOMCoreException.NOT_FOUND_ERR',
+    'DOMCoreException.NOT_SUPPORTED_ERR',
+    'DOMCoreException.NO_DATA_ALLOWED_ERR',
+    'DOMCoreException.NO_MODIFICATION_ALLOWED_ERR',
+    'DOMCoreException.QUOTA_EXCEEDED_ERR',
+    'DOMCoreException.SECURITY_ERR',
+    'DOMCoreException.SYNTAX_ERR',
+    'DOMCoreException.TIMEOUT_ERR',
+    'DOMCoreException.TYPE_MISMATCH_ERR',
+    'DOMCoreException.URL_MISMATCH_ERR',
+    'DOMCoreException.VALIDATION_ERR',
+    'DOMCoreException.WRONG_DOCUMENT_ERR',
     'Element.accessKey',
     'Element.get:classList',
-    'Element.get:itemProp',
-    'Element.get:itemRef',
-    'Element.get:itemType',
     'Element.getAttributeNode',
     'Element.getAttributeNodeNS',
     'Element.getElementsByTagNameNS',
     'Element.innerText',
-    'Element.itemId',
-    'Element.itemScope',
-    'Element.itemValue',
     'Element.outerText',
     'Element.removeAttributeNode',
     'Element.scrollIntoView',
@@ -284,41 +296,112 @@
     'Element.setAttributeNodeNS',
     'Event.srcElement',
     'EventSource.URL',
-    'FormElement.get:elements',
-    'HRElement.align',
-    'HRElement.noShade',
-    'HRElement.size',
-    'HRElement.width',
+    'HTMLAnchorElement.charset',
+    'HTMLAnchorElement.coords',
+    'HTMLAnchorElement.rev',
+    'HTMLAnchorElement.shape',
+    'HTMLAnchorElement.text',
+    'HTMLAppletElement.*',
+    'HTMLAreaElement.noHref',
+    'HTMLBRElement.clear',
+    'HTMLBaseFontElement.*',
+    'HTMLBodyElement.aLink',
+    'HTMLBodyElement.background',
+    'HTMLBodyElement.bgColor',
+    'HTMLBodyElement.link',
+    'HTMLBodyElement.text',
+    'HTMLBodyElement.vLink',
+    'HTMLDListElement.compact',
+    'HTMLDirectoryElement.*',
+    'HTMLDivElement.align',
+    'HTMLFontElement.*',
+    'HTMLFormElement.get:elements',
     'HTMLFrameElement.*',
     'HTMLFrameSetElement.*',
-    'HTMLIsIndexElement.*',
+    'HTMLHRElement.align',
+    'HTMLHRElement.noShade',
+    'HTMLHRElement.size',
+    'HTMLHRElement.width',
+    'HTMLHeadElement.profile',
+    'HTMLHeadingElement.align',
+    'HTMLHtmlElement.manifest',
+    'HTMLHtmlElement.version',
+    'HTMLIFrameElement.align',
+    'HTMLIFrameElement.frameBorder',
+    'HTMLIFrameElement.longDesc',
+    'HTMLIFrameElement.marginHeight',
+    'HTMLIFrameElement.marginWidth',
+    'HTMLIFrameElement.scrolling',
+    'HTMLImageElement.align',
+    'HTMLImageElement.hspace',
+    'HTMLImageElement.longDesc',
+    'HTMLImageElement.name',
+    'HTMLImageElement.vspace',
+    'HTMLInputElement.align',
+    'HTMLLegendElement.align',
+    'HTMLLinkElement.charset',
+    'HTMLLinkElement.rev',
+    'HTMLLinkElement.target',
+    'HTMLMarqueeElement.*',
+    'HTMLMenuElement.compact',
+    'HTMLMetaElement.scheme',
+    'HTMLOListElement.compact',
+    'HTMLObjectElement.align',
+    'HTMLObjectElement.archive',
+    'HTMLObjectElement.border',
+    'HTMLObjectElement.codeBase',
+    'HTMLObjectElement.codeType',
+    'HTMLObjectElement.declare',
+    'HTMLObjectElement.hspace',
+    'HTMLObjectElement.standby',
+    'HTMLObjectElement.vspace',
+    'HTMLOptionElement.text',
     'HTMLOptionsCollection.*',
-    'HTMLPropertiesCollection.*',
-    'HeadElement.profile',
-    'HeadingElement.align',
-    'HtmlElement.manifest',
-    'HtmlElement.version',
-    'HtmlElement.version',
-    'IFrameElement.align',
-    'IFrameElement.frameBorder',
-    'IFrameElement.longDesc',
-    'IFrameElement.marginHeight',
-    'IFrameElement.marginWidth',
-    'IFrameElement.scrolling',
-    'ImageElement.align',
-    'ImageElement.hspace',
-    'ImageElement.longDesc',
-    'ImageElement.name',
-    'ImageElement.vspace',
-    'InputElement.align',
-    'Legend.align',
-    'LinkElement.charset',
-    'LinkElement.rev',
-    'LinkElement.target',
-    'Menu.compact',
-    'MenuElement.compact',
-    'MetaElement.scheme',
-    'NamedNodeMap.*',
+    'HTMLParagraphElement.align',
+    'HTMLParamElement.type',
+    'HTMLParamElement.valueType',
+    'HTMLPreElement.width',
+    'HTMLScriptElement.text',
+    'HTMLSelectElement.options',
+    'HTMLSelectElement.remove',
+    'HTMLSelectElement.selectedOptions',
+    'HTMLTableCaptionElement.align',
+    'HTMLTableCellElement.abbr',
+    'HTMLTableCellElement.align',
+    'HTMLTableCellElement.axis',
+    'HTMLTableCellElement.bgColor',
+    'HTMLTableCellElement.ch',
+    'HTMLTableCellElement.chOff',
+    'HTMLTableCellElement.height',
+    'HTMLTableCellElement.noWrap',
+    'HTMLTableCellElement.scope',
+    'HTMLTableCellElement.vAlign',
+    'HTMLTableCellElement.width',
+    'HTMLTableColElement.align',
+    'HTMLTableColElement.ch',
+    'HTMLTableColElement.chOff',
+    'HTMLTableColElement.vAlign',
+    'HTMLTableColElement.width',
+    'HTMLTableElement.align',
+    'HTMLTableElement.bgColor',
+    'HTMLTableElement.cellPadding',
+    'HTMLTableElement.cellSpacing',
+    'HTMLTableElement.frame',
+    'HTMLTableElement.rules',
+    'HTMLTableElement.summary',
+    'HTMLTableElement.width',
+    'HTMLTableRowElement.align',
+    'HTMLTableRowElement.bgColor',
+    'HTMLTableRowElement.ch',
+    'HTMLTableRowElement.chOff',
+    'HTMLTableRowElement.vAlign',
+    'HTMLTableSectionElement.align',
+    'HTMLTableSectionElement.ch',
+    'HTMLTableSectionElement.chOff',
+    'HTMLTableSectionElement.vAlign',
+    'HTMLTitleElement.text',
+    'HTMLUListElement.compact',
+    'HTMLUListElement.type',
     'Node.compareDocumentPosition',
     'Node.get:ATTRIBUTE_NODE',
     'Node.get:CDATA_SECTION_NODE',
@@ -340,7 +423,6 @@
     'Node.get:TEXT_NODE',
     'Node.get:baseURI',
     'Node.get:nodeName',
-    'Node.get:nodeValue',
     'Node.get:prefix',
     'Node.hasAttributes',
     'Node.isDefaultNamespace',
@@ -351,76 +433,9 @@
     'Node.lookupPrefix',
     'Node.normalize',
     'Node.set:nodeValue',
-    'Node.set:prefix',
     'NodeList.item',
-    'OListElement.compact',
-    'ObjectElement.align',
-    'ObjectElement.archive',
-    'ObjectElement.border',
-    'ObjectElement.codeBase',
-    'ObjectElement.codeType',
-    'ObjectElement.declare',
-    'ObjectElement.hspace',
-    'ObjectElement.standby',
-    'ObjectElement.vspace',
-    'OptionElement.text',
-    'ParagraphElement.align',
-    'ParamElement.type',
-    'ParamElement.valueType',
-    'PreElement.width',
-    'ScriptElement.text',
-    'SelectElement.options',
-    'SelectElement.remove',
-    'SelectElement.selectedOptions',
     'ShadowRoot.getElementsByTagNameNS',
-    'TableCaptionElement.align',
-    'TableCellElement.abbr',
-    'TableCellElement.align',
-    'TableCellElement.axis',
-    'TableCellElement.bgColor',
-    'TableCellElement.ch',
-    'TableCellElement.chOff',
-    'TableCellElement.height',
-    'TableCellElement.noWrap',
-    'TableCellElement.scope',
-    'TableCellElement.vAlign',
-    'TableCellElement.width',
-    'TableColElement.align',
-    'TableColElement.ch',
-    'TableColElement.chOff',
-    'TableColElement.vAlign',
-    'TableColElement.width',
-    'TableElement.align',
-    'TableElement.bgColor',
-    'TableElement.cellPadding',
-    'TableElement.cellSpacing',
-    'TableElement.frame',
-    'TableElement.rules',
-    'TableElement.summary',
-    'TableElement.width',
-    'TableRowElement.align',
-    'TableRowElement.bgColor',
-    'TableRowElement.ch',
-    'TableRowElement.chOff',
-    'TableRowElement.vAlign',
-    'TableSectionElement.align',
-    'TableSectionElement.ch',
-    'TableSectionElement.choff',
-    'TableSectionElement.vAlign',
-    'TitleElement.text',
-    'Transaction.READ_ONLY',
-    'Transaction.READ_WRITE',
-    'UListElement.compact',
-    'UListElement.type',
     'WheelEvent.wheelDelta',
-    'Window.blur',
-    'Window.clientInformation',
-    'Window.focus',
-    'Window.get:frames',
-    'Window.get:length',
-    'Window.prompt',
-    'Window.webkitCancelRequestAnimationFrame',
-    'Window.webkitIndexedDB',
     'WorkerContext.webkitIndexedDB',
 # TODO(jacobr): should these be removed?
     'Document.close',
@@ -449,14 +464,14 @@
     """
     interface = self._database.GetInterface(interface_name)
 
-    if self._FindMatch(interface, member, member_prefix, _removed_html_members):
+    if self.ShouldSuppressMember(interface, member, member_prefix):
       return None
 
     if 'CheckSecurityForNode' in member_node.ext_attrs:
       return None
 
     name = self._FindMatch(interface, member, member_prefix,
-                           _renamed_html_members)
+        _renamed_html_members)
 
     target_name = _renamed_html_members[name] if name else member
     if self._FindMatch(interface, member, member_prefix, _private_html_members):
@@ -467,13 +482,22 @@
       target_name = self._DartifyMemberName(target_name)
     return target_name
 
+  def ShouldSuppressMember(self, interface, member, member_prefix=''):
+    """ Returns true if the member should be suppressed."""
+    if self._FindMatch(interface, member, member_prefix,
+        _removed_html_members):
+      return True
+    return False
+
   def _FindMatch(self, interface, member, member_prefix, candidates):
     for interface in self._database.Hierarchy(interface):
-      html_interface_name = self.RenameInterface(interface)
-      member_name = html_interface_name + '.' + member
+      member_name = interface.id + '.' + member
       if member_name in candidates:
         return member_name
-      member_name = html_interface_name + '.' + member_prefix + member
+      member_name = interface.id + '.' + member_prefix + member
+      if member_name in candidates:
+        return member_name
+      member_name = interface.id + '.*'
       if member_name in candidates:
         return member_name
 
@@ -491,6 +515,9 @@
   def DartifyTypeName(self, type_name):
     """Converts a DOM name to a Dart-friendly class name. """
 
+    if type_name in html_interface_renames:
+      return html_interface_renames[type_name]
+
     # Strip off any standard prefixes.
     name = re.sub(r'^SVG', '', type_name)
     name = re.sub(r'^IDB', '', name)
diff --git a/tools/dom/scripts/idlsync.py b/tools/dom/scripts/idlsync.py
index ba4c4ee..7307845 100755
--- a/tools/dom/scripts/idlsync.py
+++ b/tools/dom/scripts/idlsync.py
@@ -12,7 +12,7 @@
 import sys
 
 SCRIPT_PATH = os.path.abspath(os.path.dirname(__file__))
-DART_PATH = os.path.abspath(os.path.join(SCRIPT_PATH, '..', '..', '..', '..'))
+DART_PATH = os.path.abspath(os.path.join(SCRIPT_PATH, '..', '..', '..'))
 
 # Path to install latest IDL.
 IDL_PATH = os.path.join(DART_PATH, 'third_party', 'WebCore')
diff --git a/tools/dom/scripts/logging.conf b/tools/dom/scripts/logging.conf
index 3b7af74..b9d3e98 100644
--- a/tools/dom/scripts/logging.conf
+++ b/tools/dom/scripts/logging.conf
@@ -1,5 +1,5 @@
 [loggers]
-keys=root,pegparser,database,databasebuilder,dartgenerator,snippet_manager
+keys=root,pegparser,database,databasebuilder,dartgenerator,snippet_manager,htmlrenamer
 
 [handlers]
 keys=consoleHandler
@@ -47,6 +47,12 @@
 formatter=simpleFormatter
 args=(sys.stdout,)
 
+[logger_htmlrenamer]
+level=INFO
+propagate=0
+handlers=consoleHandler
+qualname=htmlrenamer
+
 [formatter_simpleFormatter]
 format=%(name)s - %(levelname)s - %(message)s
 datefmt=
diff --git a/tools/dom/scripts/monitored.py b/tools/dom/scripts/monitored.py
new file mode 100644
index 0000000..aa26502
--- /dev/null
+++ b/tools/dom/scripts/monitored.py
@@ -0,0 +1,63 @@
+#!/usr/bin/python
+# Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+"""This module provides maps and sets that report unused elements."""
+
+_monitored_values = []
+
+
+def FinishMonitoring():
+  for value in _monitored_values:
+    value.CheckUsage()
+
+class MonitoredCollection(object):
+  def __init__(self, name):
+    self.name = name
+    self._used_keys = set()
+    _monitored_values.append(self)
+
+class Dict(MonitoredCollection):
+  """Wrapper for a read-only dict that reports unused keys."""
+
+  def __init__(self, name, map):
+    super(Dict, self).__init__(name)
+    self._map = map
+
+  def __getitem__(self, key):
+    self._used_keys.add(key)
+    return self._map[key]
+
+  def __contains__(self, key):
+    self._used_keys.add(key)
+    return key in self._map
+
+  def __iter__(self):
+    return self._map.__iter__()
+
+  def get(self, key, default=None):
+    self._used_keys.add(key)
+    return self._map.get(key, default)
+
+  def CheckUsage(self):
+    for v in sorted(self._map.keys()):
+      if v not in self._used_keys:
+        print "dict '%s' has unused key '%s'" % (self.name, v)
+
+
+class Set(MonitoredCollection):
+  """Wrapper for a read-only set that reports unused keys."""
+
+  def __init__(self, name, a_set):
+    super(Set, self).__init__(name)
+    self._set = a_set
+
+  def __contains__(self, key):
+    self._used_keys.add(key)
+    return key in self._set
+
+  def CheckUsage(self):
+    for v in sorted(self._set):
+      if v not in self._used_keys:
+        print "set '%s' has unused key '%s'" % (self.name, v)
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 5789c58..465645d 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -45,6 +45,7 @@
     'Element.webkitMatchesSelector',
     'Element.remove',
     'ElementEvents.mouseWheel',
+    'DOMException.name',
     'HTMLCanvasElement.getContext',
     'HTMLTableElement.createTBody',
     'IDBDatabase.transaction',
@@ -52,6 +53,7 @@
     'MouseEvent.offsetX',
     'MouseEvent.offsetY',
     'Navigator.language',
+    'Navigator.webkitGetUserMedia',
     'URL.createObjectURL',
     'URL.revokeObjectURL',
     'WheelEvent.wheelDeltaX',
@@ -70,6 +72,7 @@
 
 js_support_checks = {
   'ArrayBuffer': "JS('bool', 'typeof window.ArrayBuffer != \"undefined\"')",
+  'DOMApplicationCache': "JS('bool', '!!(window.applicationCache)')",
   'DOMFileSystem': "JS('bool', '!!(window.webkitRequestFileSystem)')",
   'HTMLContentElement': "Element.isTagSupported('content')",
   'HTMLDataListElement': "Element.isTagSupported('datalist')",
@@ -78,14 +81,13 @@
   # IE creates keygen as Block elements
   'HTMLKeygenElement': "Element.isTagSupported('keygen') "
       "&& (new Element.tag('keygen') is KeygenElement)",
-  'HTMLMarqueeElement': "Element.isTagSupported('marquee')"
-      "&& (new Element.tag('marquee') is MarqueeElement)",
   'HTMLMeterElement': "Element.isTagSupported('meter')",
   'HTMLObjectElement': "Element.isTagSupported('object')",
   'HTMLOutputElement': "Element.isTagSupported('output')",
   'HTMLProgressElement': "Element.isTagSupported('progress')",
   'HTMLShadowElement': "Element.isTagSupported('shadow')",
   'HTMLTrackElement': "Element.isTagSupported('track')",
+  'NotificationCenter': "JS('bool', '!!(window.webkitNotifications)')",
   'Performance': "JS('bool', '!!(window.performance)')",
   'WebSocket': "JS('bool', 'typeof window.WebSocket != \"undefined\"')",
 }
@@ -411,7 +413,6 @@
     self._backend.EmitHelpers(base_class)
     self._event_generator.EmitStreamProviders(
         self._interface,
-        self._interface.doc_js_name,
         self._backend.CustomJSMembers(),
         self._implementation_members_emitter)
     self._backend.AddConstructors(
@@ -435,8 +436,7 @@
     self._backend.AddSecondaryMembers(self._interface)
     self._event_generator.EmitStreamGetters(
         self._interface,
-        self._interface.doc_js_name,
-        self._backend.CustomJSMembers(),
+        [],
         self._implementation_members_emitter)
     self._backend.FinishInterface()
 
@@ -648,7 +648,6 @@
     input_type = self._NarrowInputType(attribute.type.id)
     annotations = self._Annotations(attribute.type.id, attribute.id)
     rename = self._RenamingAnnotation(attribute.id, html_name)
-    self.EmitAttributeDocumentation(attribute)
     if not read_only:
       self._members_emitter.Emit(
           '\n  $RENAME$ANNOTATIONS$TYPE $NAME;'
@@ -684,7 +683,6 @@
         TYPE=self.SecureOutputType(attribute.type.id))
 
   def _AddRenamingGetter(self, attr, html_name):
-    self.EmitAttributeDocumentation(attr)
 
     conversion = self._OutputConversion(attr.type.id, attr.id)
     if conversion:
@@ -701,7 +699,6 @@
         NATIVE_TYPE=native_type)
 
   def _AddRenamingSetter(self, attr, html_name):
-    self.EmitAttributeDocumentation(attr)
 
     conversion = self._InputConversion(attr.type.id, attr.id)
     if conversion:
@@ -756,8 +753,6 @@
     if self._HasCustomImplementation(info.name):
       return
 
-    self.EmitOperationDocumentation(info)
-
     if IsPureInterface(self._interface.id):
       self._AddInterfaceOperation(info, html_name)
     elif any(self._OperationRequiresConversions(op) for op in info.overloads):
@@ -929,16 +924,18 @@
     return ''
 
   def _Annotations(self, idl_type, idl_member_name):
+    out = ''
     annotations = FindDart2JSAnnotations(idl_type, self._interface.id,
         idl_member_name)
     if annotations:
-      return '%s\n  ' % annotations
-    return_type = self.SecureOutputType(idl_type)
-    native_type = self._NarrowToImplementationType(idl_type)
-    if native_type != return_type:
-      return "@Returns('%s') @Creates('%s')\n  " % (native_type, native_type)
-    else:
-      return ''
+      out = '%s\n  ' % annotations
+    if not AnyConversionAnnotations(idl_type, self._interface.id,
+                                  idl_member_name):
+      return_type = self.SecureOutputType(idl_type)
+      native_type = self._NarrowToImplementationType(idl_type)
+      if native_type != return_type:
+        out += "@Returns('%s') @Creates('%s')\n  " % (native_type, native_type)
+    return out
 
   def CustomJSMembers(self):
     return _js_custom_members
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index ddade57..891b287 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -428,18 +428,16 @@
       info: An OperationInfo object.
     """
 
-    operation = info.operations[0]
-
-    is_custom = 'Custom' in operation.ext_attrs
-    has_optional_arguments = any(self._IsArgumentOptionalInWebCore(operation, argument) for argument in operation.arguments)
-    needs_dispatcher = not is_custom and (len(info.operations) > 1 or has_optional_arguments)
-
     dart_declaration = '%s%s %s(%s)' % (
         'static ' if info.IsStatic() else '',
         self.SecureOutputType(info.type_name),
         html_name,
-        info.ParametersDeclaration(
-            (lambda x: 'dynamic') if needs_dispatcher else self._DartType))
+        info.ParametersDeclaration(self._DartType))
+
+    operation = info.operations[0]
+    is_custom = 'Custom' in operation.ext_attrs
+    has_optional_arguments = any(self._IsArgumentOptionalInWebCore(operation, argument) for argument in operation.arguments)
+    needs_dispatcher = not is_custom and (len(info.operations) > 1 or has_optional_arguments)
 
     if not needs_dispatcher:
       # Bind directly to native implementation
@@ -759,12 +757,9 @@
 
     native_binding = '%s_%s_%s' % (self._interface.id, idl_name, native_suffix)
     self._members_emitter.Emit(
-        '\n'
-        '\n  /** @domName $DOMINTERFACE.$DOMNAME */'
         '$ANNOTATIONS'
         '\n  $DART_DECLARATION native "$NATIVE_BINDING";\n',
         DOMINTERFACE=self._interface.id,
-        DOMNAME=idl_name,
         ANNOTATIONS=annotation_str,
         DART_DECLARATION=dart_declaration,
         NATIVE_BINDING=native_binding)
diff --git a/tools/dom/src/CssClassSet.dart b/tools/dom/src/CssClassSet.dart
index b6cbb9a..2c875b0 100644
--- a/tools/dom/src/CssClassSet.dart
+++ b/tools/dom/src/CssClassSet.dart
@@ -67,11 +67,12 @@
 
   void add(String value) {
     // TODO - figure out if we need to do any validation here
-    // or if the browser natively does enough
+    // or if the browser natively does enough.
     _modify((s) => s.add(value));
   }
 
-  bool remove(String value) {
+  bool remove(Object value) {
+    if (value is! String) return false;
     Set<String> s = readClasses();
     bool result = s.remove(value);
     writeClasses(s);
@@ -79,7 +80,7 @@
   }
 
   void addAll(Iterable<String> iterable) {
-    // TODO - see comment above about validation
+    // TODO - see comment above about validation.
     _modify((s) => s.addAll(iterable));
   }
 
@@ -87,6 +88,18 @@
     _modify((s) => s.removeAll(iterable));
   }
 
+  void retainAll(Iterable<String> iterable) {
+    _modify((s) => s.retainAll(iterable));
+  }
+
+  void removeMatching(bool test(String name)) {
+    _modify((s) => s.removeMatching(test));
+  }
+
+  void retainMatching(bool test(String name)) {
+    _modify((s) => s.retainMatching(test));
+  }
+
   bool isSubsetOf(Collection<String> collection) =>
     readClasses().isSubsetOf(collection);
 
diff --git a/tools/dom/src/EventStreamProvider.dart b/tools/dom/src/EventStreamProvider.dart
index 9c52a5d..477359a 100644
--- a/tools/dom/src/EventStreamProvider.dart
+++ b/tools/dom/src/EventStreamProvider.dart
@@ -135,3 +135,18 @@
     return new _EventStream(e, _eventType, useCapture);
   }
 }
+
+/**
+ * A factory to expose DOM events as streams, where the DOM event name has to
+ * be determined on the fly (for example, mouse wheel events).
+ */
+class _CustomEventStreamProvider<T extends Event>
+    implements EventStreamProvider<T> {
+
+  final _eventTypeGetter;
+  const _CustomEventStreamProvider(this._eventTypeGetter);
+
+  Stream<T> forTarget(EventTarget e, {bool useCapture: false}) {
+    return new _EventStream(e, _eventTypeGetter(e), useCapture);
+  }
+}
diff --git a/tools/dom/src/chrome/sample.dart b/tools/dom/src/chrome/sample.dart
new file mode 100644
index 0000000..4578b44
--- /dev/null
+++ b/tools/dom/src/chrome/sample.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of chrome;
+
+// This is an example of exposing chrome APIs in Dart and will be replaced with
+// the proper implementation in the future.
+
+class AppModule {
+  AppModule._();
+
+  WindowModule get window => new WindowModule._();
+}
+
+class WindowModule {
+  WindowModule._();
+
+  void create(String url) {
+    var chrome = JS('', 'chrome');
+
+    if (chrome == null) {
+      throw new UnsupportedError('Not supported by current browser');
+    }
+    var app = JS('', '#.app', chrome);
+    if (app == null) {
+      throw new UnsupportedError('Not supported by current browser');
+    }
+    var window = JS('', '#.window', app);
+    if (app == null) {
+      throw new UnsupportedError('Not supported by current browser');
+    }
+    JS('void', '#.create(#)', window, url);
+  }
+}
+
+final app = new AppModule._();
diff --git a/tools/dom/src/shared_FactoryProviders.dart b/tools/dom/src/shared_FactoryProviders.dart
index a5d6909..dd4bb4a 100644
--- a/tools/dom/src/shared_FactoryProviders.dart
+++ b/tools/dom/src/shared_FactoryProviders.dart
@@ -49,7 +49,7 @@
 }
 
 class _DocumentFragmentFactoryProvider {
-  /** @domName Document.createDocumentFragment */
+  @DomName('Document.createDocumentFragment')
   static DocumentFragment createDocumentFragment() =>
       document.createDocumentFragment();
 
diff --git a/tools/dom/templates/dart2js_impl.darttemplate b/tools/dom/templates/dart2js_impl.darttemplate
index 35ea8d4..068aa00 100644
--- a/tools/dom/templates/dart2js_impl.darttemplate
+++ b/tools/dom/templates/dart2js_impl.darttemplate
@@ -4,6 +4,6 @@
 
 part of $LIBRARYNAME;
 
-/// @domName $DOMNAME; @docsEditable true$ANNOTATIONS
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS}
diff --git a/tools/dom/templates/html/dart2js/chrome_dart2js.darttemplate b/tools/dom/templates/html/dart2js/chrome_dart2js.darttemplate
new file mode 100644
index 0000000..0e2723a
--- /dev/null
+++ b/tools/dom/templates/html/dart2js/chrome_dart2js.darttemplate
@@ -0,0 +1,10 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// DO NOT EDIT
+// Auto-generated dart:chrome library.
+
+library chrome;
+
+part '$AUXILIARY_DIR/chrome/sample.dart';
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index 8174cb1..c9f3130 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -9,6 +9,7 @@
 
 import 'dart:async';
 import 'dart:collection';
+import 'dart:collection-dev';
 import 'dart:html_common';
 import 'dart:indexed_db';
 import 'dart:isolate';
diff --git a/tools/dom/templates/html/dart2js/impl_ArrayBuffer.darttemplate b/tools/dom/templates/html/dart2js/impl_ArrayBuffer.darttemplate
index ab440b0..fcc61ab 100644
--- a/tools/dom/templates/html/dart2js/impl_ArrayBuffer.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_ArrayBuffer.darttemplate
@@ -3,11 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of $LIBRARYNAME;
-
-/// @domName $DOMNAME$ANNOTATIONS
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
-  /// @domName ArrayBuffer.slice;
+  @DomName('ArrayBuffer.slice')
   ArrayBuffer slice(int begin, [int end]) {
     // IE10 supports ArrayBuffers but does not have the slice method.
     if (JS('bool', '!!#.slice', this)) {
diff --git a/tools/dom/templates/html/dart2js/impl_AudioBufferSourceNode.darttemplate b/tools/dom/templates/html/dart2js/impl_AudioBufferSourceNode.darttemplate
index a8b4e65..a954da5 100644
--- a/tools/dom/templates/html/dart2js/impl_AudioBufferSourceNode.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_AudioBufferSourceNode.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of web_audio;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
   // TODO(efortuna): Remove these methods when Chrome stable also uses start
diff --git a/tools/dom/templates/html/dart2js/impl_Console.darttemplate b/tools/dom/templates/html/dart2js/impl_Console.darttemplate
index fd3c96c..1753495 100644
--- a/tools/dom/templates/html/dart2js/impl_Console.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_Console.darttemplate
@@ -3,95 +3,94 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class Console {
 
   static Console safeConsole = new Console();
 
   bool get _isConsoleDefined => JS('bool', "typeof console != 'undefined'");
 
-  /// @domName Console.memory; @docsEditable true
+  @DomName('Console.memory')
   MemoryInfo get memory => _isConsoleDefined ?
       JS('MemoryInfo', 'console.memory') : null;
 
-  /// @domName Console.profiles; @docsEditable true
+  @DomName('Console.profiles')
   List<ScriptProfile> get profiles => _isConsoleDefined ?
       JS('List<ScriptProfile>', 'console.profiles') : null;
 
-  /// @domName Console.assertCondition; @docsEditable true
+  @DomName('Console.assertCondition')
   void assertCondition(bool condition, Object arg) => _isConsoleDefined ?
       JS('void', 'console.assertCondition(#, #)', condition, arg) : null;
 
-  /// @domName Console.count; @docsEditable true
+  @DomName('Console.count')
   void count(Object arg) => _isConsoleDefined ?
       JS('void', 'console.count(#)', arg) : null;
 
-  /// @domName Console.debug; @docsEditable true
+  @DomName('Console.debug')
   void debug(Object arg) => _isConsoleDefined ?
       JS('void', 'console.debug(#)', arg) : null;
 
-  /// @domName Console.dir; @docsEditable true
+  @DomName('Console.dir')
   void dir(Object arg) => _isConsoleDefined ?
       JS('void', 'console.debug(#)', arg) : null;
 
-  /// @domName Console.dirxml; @docsEditable true
+  @DomName('Console.dirxml')
   void dirxml(Object arg) => _isConsoleDefined ?
       JS('void', 'console.dirxml(#)', arg) : null;
 
-  /// @domName Console.error; @docsEditable true
+  @DomName('Console.error')
   void error(Object arg) => _isConsoleDefined ?
       JS('void', 'console.error(#)', arg) : null;
 
-  /// @domName Console.group; @docsEditable true
+  @DomName('Console.group')
   void group(Object arg) => _isConsoleDefined ?
       JS('void', 'console.group(#)', arg) : null;
 
-  /// @domName Console.groupCollapsed; @docsEditable true
+  @DomName('Console.groupCollapsed')
   void groupCollapsed(Object arg) => _isConsoleDefined ?
       JS('void', 'console.groupCollapsed(#)', arg) : null;
 
-  /// @domName Console.groupEnd; @docsEditable true
+  @DomName('Console.groupEnd')
   void groupEnd() => _isConsoleDefined ?
       JS('void', 'console.groupEnd()') : null;
 
-  /// @domName Console.info; @docsEditable true
+  @DomName('Console.info')
   void info(Object arg) => _isConsoleDefined ?
       JS('void', 'console.info(#)', arg) : null;
 
-  /// @domName Console.log; @docsEditable true
+  @DomName('Console.log')
   void log(Object arg) => _isConsoleDefined ?
       JS('void', 'console.log(#)', arg) : null;
 
-  /// @domName Console.markTimeline; @docsEditable true
+  @DomName('Console.markTimeline')
   void markTimeline(Object arg) => _isConsoleDefined ?
       JS('void', 'console.markTimeline(#)', arg) : null;
 
-  /// @domName Console.profile; @docsEditable true
+  @DomName('Console.profile')
   void profile(String title) => _isConsoleDefined ?
       JS('void', 'console.profile(#)', title) : null;
 
-  /// @domName Console.profileEnd; @docsEditable true
+  @DomName('Console.profileEnd')
   void profileEnd(String title) => _isConsoleDefined ?
       JS('void', 'console.profileEnd(#)', title) : null;
 
-  /// @domName Console.time; @docsEditable true
+  @DomName('Console.time')
   void time(String title) => _isConsoleDefined ?
       JS('void', 'console.time(#)', title) : null;
 
-  /// @domName Console.timeEnd; @docsEditable true
+  @DomName('Console.timeEnd')
   void timeEnd(String title, Object arg) => _isConsoleDefined ?
       JS('void', 'console.timeEnd(#, #)', title, arg) : null;
 
-  /// @domName Console.timeStamp; @docsEditable true
+  @DomName('Console.timeStamp')
   void timeStamp(Object arg) => _isConsoleDefined ?
       JS('void', 'console.timeStamp(#)', arg) : null;
 
-  /// @domName Console.trace; @docsEditable true
+  @DomName('Console.trace')
   void trace(Object arg) => _isConsoleDefined ?
       JS('void', 'console.trace(#)', arg) : null;
 
-  /// @domName Console.warn; @docsEditable true
+  @DomName('Console.warn')
   void warn(Object arg) => _isConsoleDefined ?
       JS('void', 'console.warn(#)', arg) : null;
 $!MEMBERS
diff --git a/tools/dom/templates/html/dart2js/impl_HTMLTableElement.darttemplate b/tools/dom/templates/html/dart2js/impl_HTMLTableElement.darttemplate
index 5f8153c..653914c 100644
--- a/tools/dom/templates/html/dart2js/impl_HTMLTableElement.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_HTMLTableElement.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 
diff --git a/tools/dom/templates/html/dart2js/impl_IDBDatabase.darttemplate b/tools/dom/templates/html/dart2js/impl_IDBDatabase.darttemplate
index 5629a9f..7af98dc 100644
--- a/tools/dom/templates/html/dart2js/impl_IDBDatabase.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_IDBDatabase.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of indexed_db;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
   Transaction transaction(storeName_OR_storeNames, String mode) {
diff --git a/tools/dom/templates/html/dart2js/impl_KeyboardEvent.darttemplate b/tools/dom/templates/html/dart2js/impl_KeyboardEvent.darttemplate
index d6213e4..3ba329c 100644
--- a/tools/dom/templates/html/dart2js/impl_KeyboardEvent.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_KeyboardEvent.darttemplate
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName KeyboardEvent; @docsEditable true
+@DomName('KeyboardEvent')
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
   factory $CLASSNAME(String type, Window view,
@@ -17,7 +17,7 @@
     return e;
   }
 
-  /** @domName KeyboardEvent.initKeyboardEvent */
+  @DomName('KeyboardEvent.initKeyboardEvent')
   void $dom_initKeyboardEvent(String type, bool canBubble, bool cancelable,
       Window view, String keyIdentifier, int keyLocation, bool ctrlKey,
       bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) {
@@ -37,10 +37,10 @@
     }
   }
 
-  /** @domName KeyboardEvent.keyCode */
+  @DomName('KeyboardEvent.keyCode')
   int get keyCode => $dom_keyCode;
 
-  /** @domName KeyboardEvent.charCode */
+  @DomName('KeyboardEvent.charCode')
   int get charCode => $dom_charCode;
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/dart2js/impl_MouseEvent.darttemplate b/tools/dom/templates/html/dart2js/impl_MouseEvent.darttemplate
index 32ad37d..cc18046 100644
--- a/tools/dom/templates/html/dart2js/impl_MouseEvent.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_MouseEvent.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME(String type, Window view, int detail, int screenX,
       int screenY, int clientX, int clientY, int button, [bool canBubble = true,
diff --git a/tools/dom/templates/html/dart2js/impl_Navigator.darttemplate b/tools/dom/templates/html/dart2js/impl_Navigator.darttemplate
deleted file mode 100644
index 9b7117f..0000000
--- a/tools/dom/templates/html/dart2js/impl_Navigator.darttemplate
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of $LIBRARYNAME;
-
-/// @domName $DOMNAME; @docsEditable true
-class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-
-  /// @domName Navigator.language; @docsEditable true
-  String get language => JS('String', '#.language || #.userLanguage', this,
-      this);
-  $!MEMBERS
-}
diff --git a/tools/dom/templates/html/dart2js/impl_URL.darttemplate b/tools/dom/templates/html/dart2js/impl_URL.darttemplate
index beb55ec..c7b29c8 100644
--- a/tools/dom/templates/html/dart2js/impl_URL.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_URL.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
   static String createObjectUrl(blob_OR_source_OR_stream) =>
diff --git a/tools/dom/templates/html/dart2js/impl_Window.darttemplate b/tools/dom/templates/html/dart2js/impl_Window.darttemplate
index 93f9884..e353769 100644
--- a/tools/dom/templates/html/dart2js/impl_Window.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_Window.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS native "@*DOMWindow" {
 
   Document get document => JS('Document', '#.document', this);
@@ -80,7 +79,7 @@
     _addMeasurementFrameCallback(callback);
   }
 
-  /** @domName DOMWindow.requestAnimationFrame */
+  @DomName('DOMWindow.requestAnimationFrame')
   int requestAnimationFrame(RequestAnimationFrameCallback callback) {
     _ensureRequestAnimationFrame();
     return _requestAnimationFrame(callback);
@@ -157,7 +156,7 @@
     document.documentElement.attributes['dart-port:$name'] = json.stringify(serialized);
   }
 
-  /// @domName Window.console; @docsEditable true
+  @DomName('Window.console')
   Console get console => Console.safeConsole;
 
 $!MEMBERS
diff --git a/tools/dom/templates/html/dart2js/impl_WorkerContext.darttemplate b/tools/dom/templates/html/dart2js/impl_WorkerContext.darttemplate
index 62b1693..1bba286 100644
--- a/tools/dom/templates/html/dart2js/impl_WorkerContext.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_WorkerContext.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 
diff --git a/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
index 42a949b..e7863d1 100644
--- a/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
@@ -5,5 +5,6 @@
 
 import 'dart:async';
 import 'dart:html';
+import 'dart:html_common';
 
 $!GENERATED_DART_FILES
diff --git a/tools/dom/templates/html/dartium/chrome_dartium.darttemplate b/tools/dom/templates/html/dartium/chrome_dartium.darttemplate
new file mode 100644
index 0000000..38db7cd
--- /dev/null
+++ b/tools/dom/templates/html/dartium/chrome_dartium.darttemplate
@@ -0,0 +1,8 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// DO NOT EDIT
+// Auto-generated dart:chrome library.
+
+library chrome;
diff --git a/tools/dom/templates/html/dartium/dart_implementation.darttemplate b/tools/dom/templates/html/dartium/dart_implementation.darttemplate
index 8377e83..9da79a1 100644
--- a/tools/dom/templates/html/dartium/dart_implementation.darttemplate
+++ b/tools/dom/templates/html/dartium/dart_implementation.darttemplate
@@ -5,8 +5,7 @@
 // WARNING: Do not edit - generated code.
 
 part of $LIBRARYNAME;
-
-/// @domName $DOMNAME$ANNOTATIONS
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index 348f17f..a10a44a 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -9,6 +9,7 @@
 
 import 'dart:async';
 import 'dart:collection';
+import 'dart:collection-dev';
 import 'dart:html_common';
 import 'dart:indexed_db';
 import 'dart:isolate';
diff --git a/tools/dom/templates/html/dartium/impl_KeyboardEvent.darttemplate b/tools/dom/templates/html/dartium/impl_KeyboardEvent.darttemplate
index fe26600..d438f09 100644
--- a/tools/dom/templates/html/dartium/impl_KeyboardEvent.darttemplate
+++ b/tools/dom/templates/html/dartium/impl_KeyboardEvent.darttemplate
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName KeyboardEvent; @docsEditable true
+@DomName('KeyboardEvent')
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
   factory $CLASSNAME(String type, Window view,
@@ -17,10 +17,10 @@
     return e;
   }
 
-  /** @domName KeyboardEvent.keyCode */
+  @DomName('KeyboardEvent.keyCode')
   int get keyCode => $dom_keyCode;
   
-  /** @domName KeyboardEvent.charCode */
+  @DomName('KeyboardEvent.charCode')
   int get charCode => $dom_charCode;
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/dartium/impl_MouseEvent.darttemplate b/tools/dom/templates/html/dartium/impl_MouseEvent.darttemplate
index bc4e47e..428e3cf 100644
--- a/tools/dom/templates/html/dartium/impl_MouseEvent.darttemplate
+++ b/tools/dom/templates/html/dartium/impl_MouseEvent.darttemplate
@@ -5,8 +5,7 @@
 // WARNING: Do not edit - generated code.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME(String type, Window view, int detail, int screenX,
       int screenY, int clientX, int clientY, int button, [bool canBubble = true,
diff --git a/tools/dom/templates/html/dartium/impl_Window.darttemplate b/tools/dom/templates/html/dartium/impl_Window.darttemplate
index 286114d..6eb575e 100644
--- a/tools/dom/templates/html/dartium/impl_Window.darttemplate
+++ b/tools/dom/templates/html/dartium/impl_Window.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
   /**
diff --git a/tools/dom/templates/html/impl/impl_AudioContext.darttemplate b/tools/dom/templates/html/impl/impl_AudioContext.darttemplate
index 1f5569b..dbddaae 100644
--- a/tools/dom/templates/html/impl/impl_AudioContext.darttemplate
+++ b/tools/dom/templates/html/impl/impl_AudioContext.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of web_audio;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 $if DART2JS
diff --git a/tools/dom/templates/html/impl/impl_Blob.darttemplate b/tools/dom/templates/html/impl/impl_Blob.darttemplate
index a14667a..5cf4673 100644
--- a/tools/dom/templates/html/impl/impl_Blob.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Blob.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 $if DART2JS
diff --git a/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate b/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
index 2bd9338..37a1905 100644
--- a/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
@@ -20,8 +20,7 @@
   }
   return _cachedBrowserPrefix;
 }
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME() => _$(CLASSNAME)FactoryProvider.create$CLASSNAME();
   factory $CLASSNAME.css(String css) =>
diff --git a/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate b/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
index eb5ad08..8014159 100644
--- a/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 
diff --git a/tools/dom/templates/html/impl/impl_CustomEvent.darttemplate b/tools/dom/templates/html/impl/impl_CustomEvent.darttemplate
index e302fb0..e44d430 100644
--- a/tools/dom/templates/html/impl/impl_CustomEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CustomEvent.darttemplate
@@ -5,8 +5,7 @@
 // WARNING: Do not edit - generated code.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME(String type, [bool canBubble = true, bool cancelable = true,
       Object detail]) => _$(CLASSNAME)FactoryProvider.create$CLASSNAME(
diff --git a/tools/dom/templates/html/impl/impl_DOMException.darttemplate b/tools/dom/templates/html/impl/impl_DOMException.darttemplate
new file mode 100644
index 0000000..07aacbb
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_DOMException.darttemplate
@@ -0,0 +1,45 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of html;
+
+/// @domName $DOMNAME
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+
+  static const String INDEX_SIZE = 'IndexSizeError';
+  static const String HIERARCHY_REQUEST = 'HierarchyRequestError';
+  static const String WRONG_DOCUMENT = 'WrongDocumentError';
+  static const String INVALID_CHARACTER = 'InvalidCharacterError';
+  static const String NO_MODIFICATION_ALLOWED = 'NoModificationAllowedError';
+  static const String NOT_FOUND = 'NotFoundError';
+  static const String NOT_SUPPORTED = 'NotSupportedError';
+  static const String INVALID_STATE = 'InvalidStateError';
+  static const String SYNTAX = 'SyntaxError';
+  static const String INVALID_MODIFICATION = 'InvalidModificationError';
+  static const String NAMESPACE = 'NamespaceError';
+  static const String INVALID_ACCESS = 'InvalidAccessError';
+  static const String TYPE_MISMATCH = 'TypeMismatchError';
+  static const String SECURITY = 'SecurityError';
+  static const String NETWORK = 'NetworkError';
+  static const String ABORT = 'AbortError';
+  static const String URL_MISMATCH = 'URLMismatchError';
+  static const String QUOTA_EXCEEDED = 'QuotaExceededError';
+  static const String TIMEOUT = 'TimeoutError';
+  static const String INVALID_NODE_TYPE = 'InvalidNodeTypeError';
+  static const String DATA_CLONE = 'DataCloneError';
+
+$if DART2JS
+  String get name {
+    var errorName = JS('String', '#.name', this);
+    // Although Safari nightly has updated the name to SecurityError, Safari 5
+    // and 6 still return SECURITY_ERR.
+    if (_Device.isWebKit && errorName == 'SECURITY_ERR') return 'SecurityError';
+    // Chrome release still uses old string, remove this line when Chrome stable
+    // also prints out SyntaxError.
+    if (_Device.isWebKit && errorName == 'SYNTAX_ERR') return 'SyntaxError';
+    return errorName;
+  }
+$endif
+$!MEMBERS
+}
diff --git a/tools/dom/templates/html/impl/impl_Document.darttemplate b/tools/dom/templates/html/impl/impl_Document.darttemplate
index 72e2f12..1f8c502 100644
--- a/tools/dom/templates/html/impl/impl_Document.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Document.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 /**
  * The base class for all documents.
  *
diff --git a/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate b/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
index a3e8cb5..6c56346 100644
--- a/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
@@ -18,8 +18,7 @@
 
   bool get frozen => true;
 }
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME() => _$(CLASSNAME)FactoryProvider.createDocumentFragment();
 
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 24ff43e..3cc72d0 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -58,46 +58,47 @@
   }
 
   String join([String separator]) {
-    return Collections.joinList(this, separator);
+    return IterableMixinWorkaround.joinList(this, separator);
   }
 
   List mappedBy(f(Element element)) {
-    return new MappedList<Element, dynamic>(this, f);
+    return IterableMixinWorkaround.mappedByList(this, f);
   }
 
-  Iterable<Element> where(bool f(Element element))
-      => new WhereIterable(this, f);
+  Iterable<Element> where(bool f(Element element)) {
+    return IterableMixinWorkaround.where(this, f);
+  }
 
   bool get isEmpty {
     return _element.$dom_firstElementChild == null;
   }
 
   List<Element> take(int n) {
-    return new ListView<Element>(this, 0, n);
+    return IterableMixinWorkaround.takeList(this, n);
   }
 
   Iterable<Element> takeWhile(bool test(Element value)) {
-    return new TakeWhileIterable<Element>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
   List<Element> skip(int n) {
-    return new ListView<Element>(this, n, null);
+    return IterableMixinWorkaround.skipList(this, n);
   }
 
   Iterable<Element> skipWhile(bool test(Element value)) {
-    return new SkipWhileIterable<Element>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Element firstMatching(bool test(Element value), {Element orElse()}) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Element lastMatching(bool test(Element value), {Element orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Element singleMatching(bool test(Element value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Element elementAt(int index) {
@@ -116,10 +117,10 @@
     _element.$dom_replaceChild(value, _childElements[index]);
   }
 
-   void set length(int newLength) {
-     // TODO(jacobr): remove children when length is reduced.
-     throw new UnsupportedError('');
-   }
+  void set length(int newLength) {
+    // TODO(jacobr): remove children when length is reduced.
+    throw new UnsupportedError('');
+  }
 
   Element add(Element value) {
     _element.$dom_appendChild(value);
@@ -142,13 +143,38 @@
 
   dynamic reduce(dynamic initialValue,
       dynamic combine(dynamic previousValue, Element element)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
   void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
     throw new UnimplementedError();
   }
 
+  void remove(Object object) {
+    if (object is Element) {
+      Element element = object;
+      if (identical(element.parentNode, this)) {
+        _element.$dom_removeChild(element);
+      }
+    }
+  }
+
+  void removeAll(Iterable elements) {
+    Collections.removeAll(this, elements);
+  }
+
+  void retainAll(Iterable elements) {
+    Collections.retainAll(this, elements);
+  }
+
+  void removeMatching(bool test(Element element)) {
+    Collections.removeMatching(this, test);
+  }
+
+  void retainMatching(bool test(Element element)) {
+    Collections.retainMatching(this, test);
+  }
+
   void removeRange(int start, int rangeLength) {
     throw new UnimplementedError();
   }
@@ -210,11 +236,11 @@
   }
 
   Element min([int compare(Element a, Element b)]) {
-    return Collections.min(this, compare);
+    return IterableMixinWorkaround.min(this, compare);
   }
 
   Element max([int compare(Element a, Element b)]) {
-    return Collections.max(this, compare);
+    return IterableMixinWorkaround.max(this, compare);
   }
 }
 
@@ -241,15 +267,16 @@
   }
 
   String join([String separator]) {
-    return Collections.joinList(this, separator);
+    return IterableMixinWorkaround.joinList(this, separator);
   }
 
   List mappedBy(f(Element element)) {
-    return new MappedList<Element, dynamic>(this, f);
+    return IterableMixinWorkaround.mappedByList(this, f);
   }
 
-  Iterable<Element> where(bool f(Element element))
-      => new WhereIterable(this, f);
+  Iterable<Element> where(bool f(Element element)) {
+    return IterableMixinWorkaround.where(this, f);
+  }
 
   bool every(bool f(Element element)) {
     for(Element element in this) {
@@ -273,31 +300,31 @@
   Set<Element> toSet() => new Set<Element>.from(this);
 
   List<Element> take(int n) {
-    return new ListView<Element>(this, 0, n);
+    return IterableMixinWorkaround.takeList(this, n);
   }
 
   Iterable<Element> takeWhile(bool test(Element value)) {
-    return new TakeWhileIterable<Element>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
   List<Element> skip(int n) {
-    return new ListView<Element>(this, n, null);
+    return IterableMixinWorkaround.skipList(this, n);
   }
 
   Iterable<Element> skipWhile(bool test(Element value)) {
-    return new SkipWhileIterable<Element>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Element firstMatching(bool test(Element value), {Element orElse()}) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Element lastMatching(bool test(Element value), {Element orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Element singleMatching(bool test(Element value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Element elementAt(int index) {
@@ -338,7 +365,7 @@
 
   dynamic reduce(dynamic initialValue,
       dynamic combine(dynamic previousValue, Element element)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
   void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
@@ -374,6 +401,26 @@
     throw new UnsupportedError('');
   }
 
+  void remove(Object element) {
+    throw new UnsupportedError('');
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError('');
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError('');
+  }
+
+  void removeMatching(bool test(Element element)) {
+    throw new UnsupportedError('');
+  }
+
+  void retainMatching(bool test(Element element)) {
+    throw new UnsupportedError('');
+  }
+
   Element get first => _nodeList.first;
 
   Element get last => _nodeList.last;
@@ -381,11 +428,11 @@
   Element get single => _nodeList.single;
 
   Element min([int compare(Element a, Element b)]) {
-    return Collections.min(this, compare);
+    return IterableMixinWorkaround.min(this, compare);
   }
 
   Element max([int compare(Element a, Element b)]) {
-    return Collections.max(this, compare);
+    return IterableMixinWorkaround.max(this, compare);
   }
 }
 
@@ -727,6 +774,23 @@
   var xtag;
 
 $if DART2JS
+  static const EventStreamProvider<WheelEvent> mouseWheelEvent =
+      const _CustomEventStreamProvider<WheelEvent>(
+        Element._determineMouseWheelEventType);
+
+  static String _determineMouseWheelEventType(EventTarget e) {
+    if (JS('bool', '#.onwheel !== undefined', e)) {
+      // W3C spec, and should be IE9+, but IE has a bug exposing onwheel.
+      return 'wheel';
+    } else if (JS('bool', '#.onmousewheel !== undefined', e)) {
+      // Chrome & IE
+      return 'mousewheel';
+    } else {
+      // Firefox
+      return 'DOMMouseScroll';
+    }
+  }
+
   /**
    * Creates a text node and inserts it into the DOM at the specified location.
    *
@@ -846,11 +910,12 @@
 
 final _START_TAG_REGEXP = new RegExp('<(\\w+)');
 class _ElementFactoryProvider {
-  static final _CUSTOM_PARENT_TAG_MAP = const {
+  static const _CUSTOM_PARENT_TAG_MAP = const {
     'body' : 'html',
     'head' : 'html',
     'caption' : 'table',
     'td': 'tr',
+    'th': 'tr',
     'colgroup': 'table',
     'col' : 'colgroup',
     'tr' : 'tbody',
@@ -860,7 +925,20 @@
     'track' : 'audio',
   };
 
-  /** @domName Document.createElement */
+  // TODO(jmesserly): const set would be better
+  static const _TABLE_TAGS = const {
+    'caption': null,
+    'col': null,
+    'colgroup': null,
+    'tbody': null,
+    'td': null,
+    'tfoot': null,
+    'th': null,
+    'thead': null,
+    'tr': null,
+  };
+
+  @DomName('Document.createElement')
   static Element createElement_html(String html) {
     // TODO(jacobr): this method can be made more robust and performant.
     // 1) Cache the dummy parent elements required to use innerHTML rather than
@@ -873,30 +951,90 @@
     final match = _START_TAG_REGEXP.firstMatch(html);
     if (match != null) {
       tag = match.group(1).toLowerCase();
-      if (_CUSTOM_PARENT_TAG_MAP.containsKey(tag)) {
-        parentTag = _CUSTOM_PARENT_TAG_MAP[tag];
+      if (_Device.isIE && _TABLE_TAGS.containsKey(tag)) {
+        return _createTableForIE(html, tag);
       }
+      parentTag = _CUSTOM_PARENT_TAG_MAP[tag];
+      if (parentTag == null) parentTag = 'div';
     }
-    final Element temp = new Element.tag(parentTag);
+
+    final temp = new Element.tag(parentTag);
     temp.innerHtml = html;
 
     Element element;
     if (temp.children.length == 1) {
       element = temp.children[0];
     } else if (parentTag == 'html' && temp.children.length == 2) {
-      // Work around for edge case in WebKit and possibly other browsers where
-      // both body and head elements are created even though the inner html
-      // only contains a head or body element.
+      // In html5 the root <html> tag will always have a <body> and a <head>,
+      // even though the inner html only contains one of them.
       element = temp.children[tag == 'head' ? 0 : 1];
     } else {
-      throw new ArgumentError('HTML had ${temp.children.length} '
-          'top level elements but 1 expected');
+      _singleNode(temp.children);
     }
     element.remove();
     return element;
   }
 
-  /** @domName Document.createElement */
+  /**
+   * IE table elements don't support innerHTML (even in standards mode).
+   * Instead we use a div and inject the table element in the innerHtml string.
+   * This technique works on other browsers too, but it's probably slower,
+   * so we only use it when running on IE.
+   *
+   * See also innerHTML:
+   * <http://msdn.microsoft.com/en-us/library/ie/ms533897(v=vs.85).aspx>
+   * and Building Tables Dynamically:
+   * <http://msdn.microsoft.com/en-us/library/ie/ms532998(v=vs.85).aspx>.
+   */
+  static Element _createTableForIE(String html, String tag) {
+    var div = new Element.tag('div');
+    div.innerHtml = '<table>$html</table>';
+    var table = _singleNode(div.children);
+    Element element;
+    switch (tag) {
+      case 'td':
+      case 'th':
+        element = _singleNode(_singleNode(table.rows).cells);
+        break;
+      case 'tr':
+        element = _singleNode(table.rows);
+        break;
+      case 'tbody':
+        element = _singleNode(table.tBodies);
+        break;
+      case 'thead':
+        element = table.tHead;
+        break;
+      case 'tfoot':
+        element = table.tFoot;
+        break;
+      case 'caption':
+        element = table.caption;
+        break;
+      case 'colgroup':
+        element = _getColgroup(table);
+        break;
+      case 'col':
+        element = _singleNode(_getColgroup(table).children);
+        break;
+    }
+    element.remove();
+    return element;
+  }
+
+  static TableColElement _getColgroup(TableElement table) {
+    // TODO(jmesserly): is there a better way to do this?
+    return _singleNode(table.children.where((n) => n.tagName == 'COLGROUP')
+        .toList());
+  }
+
+  static Node _singleNode(List<Node> list) {
+    if (list.length == 1) return list[0];
+    throw new ArgumentError('HTML had ${list.length} '
+        'top level elements but 1 expected');
+  }
+
+  @DomName('Document.createElement')
 $if DART2JS
   // Optimization to improve performance until the dart2js compiler inlines this
   // method.
diff --git a/tools/dom/templates/html/impl/impl_Event.darttemplate b/tools/dom/templates/html/impl/impl_Event.darttemplate
index c1cf096..8e0adcd 100644
--- a/tools/dom/templates/html/impl/impl_Event.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Event.darttemplate
@@ -5,8 +5,7 @@
 // WARNING: Do not edit - generated code.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   // In JS, canBubble and cancelable are technically required parameters to
   // init*Event. In practice, though, if they aren't provided they simply
diff --git a/tools/dom/templates/html/impl/impl_EventTarget.darttemplate b/tools/dom/templates/html/impl/impl_EventTarget.darttemplate
index 9094644..a6c4383 100644
--- a/tools/dom/templates/html/impl/impl_EventTarget.darttemplate
+++ b/tools/dom/templates/html/impl/impl_EventTarget.darttemplate
@@ -64,8 +64,7 @@
     _ptr.$dom_removeEventListener(_type, listener, useCapture);
   }
 }
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 /**
  * Base class for all browser objects that support events.
  *
@@ -76,7 +75,7 @@
  */ 
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
-  /** @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent */
+  @DomName('EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent')
   Events get on => new Events(this);
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
index cb5aa2a..d0de325 100644
--- a/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 
diff --git a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
index 06afcb2..95644ff 100644
--- a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
@@ -5,24 +5,23 @@
 // WARNING: Do not edit - generated code.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
-  /** @domName Document.body */
+  @DomName('Document.body')
   BodyElement get body => document.$dom_body;
 
-  /** @domName Document.body */
+  @DomName('Document.body')
   void set body(BodyElement value) {
     document.$dom_body = value;
   }
 
-  /** @domName Document.caretRangeFromPoint */
+  @DomName('Document.caretRangeFromPoint')
   Range caretRangeFromPoint(int x, int y) {
     return document.$dom_caretRangeFromPoint(x, y);
   }
 
-  /** @domName Document.elementFromPoint */
+  @DomName('Document.elementFromPoint')
   Element elementFromPoint(int x, int y) {
     return document.$dom_elementFromPoint(x, y);
   }
@@ -65,71 +64,72 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
+  @DomName('Document.getCSSCanvasContext')
   CanvasRenderingContext getCssCanvasContext(String contextId, String name,
       int width, int height) {
     return document.$dom_getCssCanvasContext(contextId, name, width, height);
   }
 
-  /** @domName Document.head */
+  @DomName('Document.head')
   HeadElement get head => document.$dom_head;
 
-  /** @domName Document.lastModified */
+  @DomName('Document.lastModified')
   String get lastModified => document.$dom_lastModified;
 
-  /** @domName Document.preferredStylesheetSet */
+  @DomName('Document.preferredStylesheetSet')
   String get preferredStylesheetSet => document.$dom_preferredStylesheetSet;
 
-  /** @domName Document.referrer */
+  @DomName('Document.referrer')
   String get referrer => document.$dom_referrer;
 
-  /** @domName Document.selectedStylesheetSet */
+  @DomName('Document.selectedStylesheetSet')
   String get selectedStylesheetSet => document.$dom_selectedStylesheetSet;
   void set selectedStylesheetSet(String value) {
     document.$dom_selectedStylesheetSet = value;
   }
 
-  /** @domName Document.styleSheets */
+  @DomName('Document.styleSheets')
   List<StyleSheet> get styleSheets => document.$dom_styleSheets;
 
-  /** @domName Document.title */
+  @DomName('Document.title')
   String get title => document.$dom_title;
 
-  /** @domName Document.title */
+  @DomName('Document.title')
   void set title(String value) {
     document.$dom_title = value;
   }
 
-  /** @domName Document.webkitCancelFullScreen */
+  @DomName('Document.webkitCancelFullScreen')
   void webkitCancelFullScreen() {
     document.$dom_webkitCancelFullScreen();
   }
 
-  /** @domName Document.webkitExitFullscreen */
+  @DomName('Document.webkitExitFullscreen')
   void webkitExitFullscreen() {
     document.$dom_webkitExitFullscreen();
   }
 
-  /** @domName Document.webkitExitPointerLock */
+  @DomName('Document.webkitExitPointerLock')
   void webkitExitPointerLock() {
     document.$dom_webkitExitPointerLock();
   }
 
-  /** @domName Document.webkitFullscreenElement */
+  @DomName('Document.webkitFullscreenElement')
   Element get webkitFullscreenElement => document.$dom_webkitFullscreenElement;
 
-  /** @domName Document.webkitFullscreenEnabled */
+  @DomName('Document.webkitFullscreenEnabled')
   bool get webkitFullscreenEnabled => document.$dom_webkitFullscreenEnabled;
 
-  /** @domName Document.webkitHidden */
+  @DomName('Document.webkitHidden')
   bool get webkitHidden => document.$dom_webkitHidden;
 
-  /** @domName Document.webkitIsFullScreen */
+  @DomName('Document.webkitIsFullScreen')
   bool get webkitIsFullScreen => document.$dom_webkitIsFullScreen;
 
-  /** @domName Document.webkitPointerLockElement */
+  @DomName('Document.webkitPointerLockElement')
   Element get webkitPointerLockElement =>
       document.$dom_webkitPointerLockElement;
 
-  /** @domName Document.webkitVisibilityState */
+  @DomName('Document.webkitVisibilityState')
   String get webkitVisibilityState => document.$dom_webkitVisibilityState;
 }
diff --git a/tools/dom/templates/html/impl/impl_HTMLInputElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLInputElement.darttemplate
index 45da9bc..8b49685 100644
--- a/tools/dom/templates/html/impl/impl_HTMLInputElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLInputElement.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of $LIBRARYNAME;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS implements
     HiddenInputElement,
     SearchInputElement,
@@ -30,7 +29,6 @@
     ButtonInputElement
     $NATIVESPEC {
 
-  ///@docsEditable true
   factory InputElement({String type}) {
     var e = document.$dom_createElement("input");
     if (type != null) {
@@ -53,40 +51,40 @@
  * Exposes the functionality common between all InputElement types.
  */
 abstract class InputElementBase implements Element {
-  /// @domName HTMLInputElement.autofocus
+  @DomName('HTMLInputElement.autofocus')
   bool autofocus;
 
-  /// @domName HTMLInputElement.disabled
+  @DomName('HTMLInputElement.disabled')
   bool disabled;
 
-  /// @domName HTMLInputElement.incremental
+  @DomName('HTMLInputElement.incremental')
   bool incremental;
 
-  /// @domName HTMLInputElement.indeterminate
+  @DomName('HTMLInputElement.indeterminate')
   bool indeterminate;
 
-  /// @domName HTMLInputElement.labels
+  @DomName('HTMLInputElement.labels')
   List<Node> get labels;
 
-  /// @domName HTMLInputElement.name
+  @DomName('HTMLInputElement.name')
   String name;
 
-  /// @domName HTMLInputElement.validationMessage
+  @DomName('HTMLInputElement.validationMessage')
   String get validationMessage;
 
-  /// @domName HTMLInputElement.validity
+  @DomName('HTMLInputElement.validity')
   ValidityState get validity;
 
-  /// @domName HTMLInputElement.value
+  @DomName('HTMLInputElement.value')
   String value;
 
-  /// @domName HTMLInputElement.willValidate
+  @DomName('HTMLInputElement.willValidate')
   bool get willValidate;
 
-  /// @domName HTMLInputElement.checkValidity
+  @DomName('HTMLInputElement.checkValidity')
   bool checkValidity();
 
-  /// @domName HTMLInputElement.setCustomValidity
+  @DomName('HTMLInputElement.setCustomValidity')
   void setCustomValidity(String error);
 }
 
@@ -102,40 +100,40 @@
  * Base interface for all inputs which involve text editing.
  */
 abstract class TextInputElementBase implements InputElementBase {
-  /// @domName HTMLInputElement.autocomplete
+  @DomName('HTMLInputElement.autocomplete')
   String autocomplete;
 
-  /// @domName HTMLInputElement.maxLength
+  @DomName('HTMLInputElement.maxLength')
   int maxLength;
 
-  /// @domName HTMLInputElement.pattern
+  @DomName('HTMLInputElement.pattern')
   String pattern;
 
-  /// @domName HTMLInputElement.placeholder
+  @DomName('HTMLInputElement.placeholder')
   String placeholder;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
-  /// @domName HTMLInputElement.size
+  @DomName('HTMLInputElement.size')
   int size;
 
-  /// @domName HTMLInputElement.select
+  @DomName('HTMLInputElement.select')
   void select();
 
-  /// @domName HTMLInputElement.selectionDirection
+  @DomName('HTMLInputElement.selectionDirection')
   String selectionDirection;
 
-  /// @domName HTMLInputElement.selectionEnd
+  @DomName('HTMLInputElement.selectionEnd')
   int selectionEnd;
 
-  /// @domName HTMLInputElement.selectionStart
+  @DomName('HTMLInputElement.selectionStart')
   int selectionStart;
 
-  /// @domName HTMLInputElement.setSelectionRange
+  @DomName('HTMLInputElement.setSelectionRange')
   void setSelectionRange(int start, int end, [String direction]);
 }
 
@@ -152,10 +150,10 @@
 abstract class SearchInputElement implements TextInputElementBase {
   factory SearchInputElement() => new InputElement(type: 'search');
 
-  /// @domName HTMLInputElement.dirName;
+  @DomName('HTMLInputElement.dirName')
   String dirName;
 
-  /// @domName HTMLInputElement.list;
+  @DomName('HTMLInputElement.list')
   Element get list;
 
   /// Returns true if this input type is supported on the current platform.
@@ -170,10 +168,10 @@
 abstract class TextInputElement implements TextInputElementBase {
   factory TextInputElement() => new InputElement(type: 'text');
 
-  /// @domName HTMLInputElement.dirName;
+  @DomName('HTMLInputElement.dirName')
   String dirName;
 
-  /// @domName HTMLInputElement.list;
+  @DomName('HTMLInputElement.list')
   Element get list;
 }
 
@@ -189,7 +187,7 @@
 abstract class UrlInputElement implements TextInputElementBase {
   factory UrlInputElement() => new InputElement(type: 'url');
 
-  /// @domName HTMLInputElement.list;
+  @DomName('HTMLInputElement.list')
   Element get list;
 
   /// Returns true if this input type is supported on the current platform.
@@ -213,7 +211,7 @@
 abstract class TelephoneInputElement implements TextInputElementBase {
   factory TelephoneInputElement() => new InputElement(type: 'tel');
 
-  /// @domName HTMLInputElement.list;
+  @DomName('HTMLInputElement.list')
   Element get list;
 
   /// Returns true if this input type is supported on the current platform.
@@ -234,34 +232,34 @@
 abstract class EmailInputElement implements TextInputElementBase {
   factory EmailInputElement() => new InputElement(type: 'email');
 
-  /// @domName HTMLInputElement.autocomplete
+  @DomName('HTMLInputElement.autocomplete')
   String autocomplete;
 
-  /// @domName HTMLInputElement.autofocus
+  @DomName('HTMLInputElement.autofocus')
   bool autofocus;
 
-  /// @domName HTMLInputElement.list;
+  @DomName('HTMLInputElement.list')
   Element get list;
 
-  /// @domName HTMLInputElement.maxLength
+  @DomName('HTMLInputElement.maxLength')
   int maxLength;
 
-  /// @domName HTMLInputElement.multiple;
+  @DomName('HTMLInputElement.multiple')
   bool multiple;
 
-  /// @domName HTMLInputElement.pattern
+  @DomName('HTMLInputElement.pattern')
   String pattern;
 
-  /// @domName HTMLInputElement.placeholder
+  @DomName('HTMLInputElement.placeholder')
   String placeholder;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
-  /// @domName HTMLInputElement.size
+  @DomName('HTMLInputElement.size')
   int size;
 
   /// Returns true if this input type is supported on the current platform.
@@ -282,25 +280,25 @@
  */
 abstract class RangeInputElementBase implements InputElementBase {
 
-  /// @domName HTMLInputElement.list
+  @DomName('HTMLInputElement.list')
   Element get list;
 
-  /// @domName HTMLInputElement.max
+  @DomName('HTMLInputElement.max')
   String max;
 
-  /// @domName HTMLInputElement.min
+  @DomName('HTMLInputElement.min')
   String min;
 
-  /// @domName HTMLInputElement.step
+  @DomName('HTMLInputElement.step')
   String step;
 
-  /// @domName HTMLInputElement.valueAsNumber
+  @DomName('HTMLInputElement.valueAsNumber')
   num valueAsNumber;
 
-  /// @domName HTMLInputElement.stepDown
+  @DomName('HTMLInputElement.stepDown')
   void stepDown([int n]);
 
-  /// @domName HTMLInputElement.stepUp
+  @DomName('HTMLInputElement.stepUp')
   void stepUp([int n]);
 }
 
@@ -315,13 +313,13 @@
 abstract class DateTimeInputElement implements RangeInputElementBase {
   factory DateTimeInputElement() => new InputElement(type: 'datetime');
 
-  /// @domName HTMLInputElement.valueAsDate
+  @DomName('HTMLInputElement.valueAsDate')
   Date valueAsDate;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -340,13 +338,13 @@
 abstract class DateInputElement implements RangeInputElementBase {
   factory DateInputElement() => new InputElement(type: 'date');
 
-  /// @domName HTMLInputElement.valueAsDate
+  @DomName('HTMLInputElement.valueAsDate')
   Date valueAsDate;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -365,13 +363,13 @@
 abstract class MonthInputElement implements RangeInputElementBase {
   factory MonthInputElement() => new InputElement(type: 'month');
 
-  /// @domName HTMLInputElement.valueAsDate
+  @DomName('HTMLInputElement.valueAsDate')
   Date valueAsDate;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -390,13 +388,13 @@
 abstract class WeekInputElement implements RangeInputElementBase {
   factory WeekInputElement() => new InputElement(type: 'week');
 
-  /// @domName HTMLInputElement.valueAsDate
+  @DomName('HTMLInputElement.valueAsDate')
   Date valueAsDate;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -415,13 +413,13 @@
 abstract class TimeInputElement implements RangeInputElementBase {
   factory TimeInputElement() => new InputElement(type: 'time');
 
-  /// @domName HTMLInputElement.valueAsDate
+  @DomName('HTMLInputElement.valueAsDate')
   Date valueAsDate;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -442,10 +440,10 @@
   factory LocalDateTimeInputElement() =>
       new InputElement(type: 'datetime-local');
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -464,13 +462,13 @@
 abstract class NumberInputElement implements RangeInputElementBase {
   factory NumberInputElement() => new InputElement(type: 'number');
 
-  /// @domName HTMLInputElement.placeholder
+  @DomName('HTMLInputElement.placeholder')
   String placeholder;
 
-  /// @domName HTMLInputElement.readOnly
+  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -506,10 +504,10 @@
 abstract class CheckboxInputElement implements InputElementBase {
   factory CheckboxInputElement() => new InputElement(type: 'checkbox');
 
-  /// @domName HTMLInputElement.checked
+  @DomName('HTMLInputElement.checked')
   bool checked;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 }
 
@@ -528,10 +526,10 @@
 abstract class RadioButtonInputElement implements InputElementBase {
   factory RadioButtonInputElement() => new InputElement(type: 'radio');
 
-  /// @domName HTMLInputElement.checked
+  @DomName('HTMLInputElement.checked')
   bool checked;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 }
 
@@ -541,16 +539,16 @@
 abstract class FileUploadInputElement implements InputElementBase {
   factory FileUploadInputElement() => new InputElement(type: 'file');
 
-  /// @domName HTMLInputElement.accept
+  @DomName('HTMLInputElement.accept')
   String accept;
 
-  /// @domName HTMLInputElement.multiple
+  @DomName('HTMLInputElement.multiple')
   bool multiple;
 
-  /// @domName HTMLInputElement.required
+  @DomName('HTMLInputElement.required')
   bool required;
 
-  /// @domName HTMLInputElement.files
+  @DomName('HTMLInputElement.files')
   List<File> files;
 }
 
@@ -560,19 +558,19 @@
 abstract class SubmitButtonInputElement implements InputElementBase {
   factory SubmitButtonInputElement() => new InputElement(type: 'submit');
 
-  /// @domName HTMLInputElement.formAction
+  @DomName('HTMLInputElement.formAction')
   String formAction;
 
-  /// @domName HTMLInputElement.formEnctype
+  @DomName('HTMLInputElement.formEnctype')
   String formEnctype;
 
-  /// @domName HTMLInputElement.formMethod
+  @DomName('HTMLInputElement.formMethod')
   String formMethod;
 
-  /// @domName HTMLInputElement.formNoValidate
+  @DomName('HTMLInputElement.formNoValidate')
   bool formNoValidate;
 
-  /// @domName HTMLInputElement.formTarget
+  @DomName('HTMLInputElement.formTarget')
   String formTarget;
 }
 
@@ -583,31 +581,31 @@
 abstract class ImageButtonInputElement implements InputElementBase {
   factory ImageButtonInputElement() => new InputElement(type: 'image');
 
-  /// @domName HTMLInputElement.alt
+  @DomName('HTMLInputElement.alt')
   String alt;
 
-  /// @domName HTMLInputElement.formAction
+  @DomName('HTMLInputElement.formAction')
   String formAction;
 
-  /// @domName HTMLInputElement.formEnctype
+  @DomName('HTMLInputElement.formEnctype')
   String formEnctype;
 
-  /// @domName HTMLInputElement.formMethod
+  @DomName('HTMLInputElement.formMethod')
   String formMethod;
 
-  /// @domName HTMLInputElement.formNoValidate
+  @DomName('HTMLInputElement.formNoValidate')
   bool formNoValidate;
 
-  /// @domName HTMLInputElement.formTarget
+  @DomName('HTMLInputElement.formTarget')
   String formTarget;
 
-  /// @domName HTMLInputElement.height
+  @DomName('HTMLInputElement.height')
   int height;
 
-  /// @domName HTMLInputElement.src
+  @DomName('HTMLInputElement.src')
   String src;
 
-  /// @domName HTMLInputElement.width
+  @DomName('HTMLInputElement.width')
   int width;
 }
 
diff --git a/tools/dom/templates/html/impl/impl_HTMLSelectElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLSelectElement.darttemplate
index b10c4fe..de3a920 100644
--- a/tools/dom/templates/html/impl/impl_HTMLSelectElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLSelectElement.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 
diff --git a/tools/dom/templates/html/impl/impl_History.darttemplate b/tools/dom/templates/html/impl/impl_History.darttemplate
index 943d831..103f206 100644
--- a/tools/dom/templates/html/impl/impl_History.darttemplate
+++ b/tools/dom/templates/html/impl/impl_History.darttemplate
@@ -4,7 +4,7 @@
 
 part of $LIBRARYNAME;
 
-/// @domName $DOMNAME; @docsEditable true$ANNOTATIONS
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
   /**
diff --git a/tools/dom/templates/html/impl/impl_IDBFactory.darttemplate b/tools/dom/templates/html/impl/impl_IDBFactory.darttemplate
index ce1b889..3b2c04f 100644
--- a/tools/dom/templates/html/impl/impl_IDBFactory.darttemplate
+++ b/tools/dom/templates/html/impl/impl_IDBFactory.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of $LIBRARYNAME;
-
-/// @domName $DOMNAME$ANNOTATIONS
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   /**
    * Checks to see if Indexed DB is supported on the current platform.
diff --git a/tools/dom/templates/html/impl/impl_IDBKeyRange.darttemplate b/tools/dom/templates/html/impl/impl_IDBKeyRange.darttemplate
index 1ff999c..5f493ff 100644
--- a/tools/dom/templates/html/impl/impl_IDBKeyRange.darttemplate
+++ b/tools/dom/templates/html/impl/impl_IDBKeyRange.darttemplate
@@ -3,30 +3,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of indexed_db;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-  /**
-   * @domName IDBKeyRange.only
-   */
+  @DomName('IDBKeyRange.only')
   factory KeyRange.only(/*Key*/ value) =>
       _KeyRangeFactoryProvider.create$(CLASSNAME)_only(value);
 
-  /**
-   * @domName IDBKeyRange.lowerBound
-   */
+  @DomName('IDBKeyRange.lowerBound')
   factory KeyRange.lowerBound(/*Key*/ bound, [bool open = false]) =>
       _KeyRangeFactoryProvider.create$(CLASSNAME)_lowerBound(bound, open);
 
-  /**
-   * @domName IDBKeyRange.upperBound
-   */
+  @DomName('IDBKeyRange.upperBound')
   factory KeyRange.upperBound(/*Key*/ bound, [bool open = false]) =>
       _KeyRangeFactoryProvider.create$(CLASSNAME)_upperBound(bound, open);
 
-  /**
-   * @domName KeyRange.bound
-   */
+  @DomName('KeyRange.bound')
   factory KeyRange.bound(/*Key*/ lower, /*Key*/ upper,
                             [bool lowerOpen = false, bool upperOpen = false]) =>
       _KeyRangeFactoryProvider.create$(CLASSNAME)_bound(
diff --git a/tools/dom/templates/html/impl/impl_MediaStream.darttemplate b/tools/dom/templates/html/impl/impl_MediaStream.darttemplate
new file mode 100644
index 0000000..9691338
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_MediaStream.darttemplate
@@ -0,0 +1,29 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of $LIBRARYNAME;
+
+/// @domName $DOMNAME; @docsEditable true$ANNOTATIONS
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+$!MEMBERS
+
+  /**
+   * Checks if the MediaStream APIs are supported on the current platform.
+   *
+   * See also:
+   *
+   * * [Navigator.getUserMedia]
+   */
+$if DART2JS
+  static bool get supported =>
+    JS('bool', '''!!(#.getUserMedia || #.webkitGetUserMedia ||
+        #.mozGetUserMedia || #.msGetUserMedia)''',
+        window.navigator,
+        window.navigator,
+        window.navigator,
+        window.navigator);
+$else
+  static bool get supported => true;
+$endif
+}
diff --git a/tools/dom/templates/html/impl/impl_MutationObserver.darttemplate b/tools/dom/templates/html/impl/impl_MutationObserver.darttemplate
index ceffb54..d3dfa5c 100644
--- a/tools/dom/templates/html/impl/impl_MutationObserver.darttemplate
+++ b/tools/dom/templates/html/impl/impl_MutationObserver.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
diff --git a/tools/dom/templates/html/impl/impl_Navigator.darttemplate b/tools/dom/templates/html/impl/impl_Navigator.darttemplate
new file mode 100644
index 0000000..f6d7b91
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_Navigator.darttemplate
@@ -0,0 +1,79 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of $LIBRARYNAME;
+$ANNOTATIONS
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+
+$if DART2JS
+  @DomName('Navigator.language')
+  String get language => JS('String', '#.language || #.userLanguage', this,
+      this);
+$endif
+
+  /**
+   * Gets a stream (video and or audio) from the local computer.
+   *
+   * Use [MediaStream.supported] to check if this is supported by the current
+   * platform.
+   *
+   * Example use:
+   *
+   *     window.navigator.getUserMedia(audio:true, video: true).then((stream) {
+   *       var video = new VideoElement()
+   *         ..autoplay = true
+   *         ..src = Url.createObjectUrl(stream);
+   *       document.body.append(video);
+   *     });
+   *
+   * See also:
+   * * [MediaStream.supported]
+   */
+  @DomName('Navigator.webkitGetUserMedia')
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @Experimental()
+  Future<LocalMediaStream> getUserMedia({bool audio: false,
+      bool video: false}) {
+    var completer = new Completer<LocalMediaStream>();
+    var options = {
+      'audio': audio,
+      'video': video
+    };
+$if DART2JS
+    _ensureGetUserMedia();
+    this._getUserMedia(convertDartToNative_Dictionary(options),
+      (stream) {
+        completer.complete(stream);
+      },
+      (error) {
+        completer.completeError(error);
+      });
+$else
+    this._getUserMedia(options,
+      (stream) {
+        completer.complete(stream);
+      },
+      (error) {
+        completer.completeError(error);
+      });
+$endif
+    return completer.future;
+  }
+
+$if DART2JS
+  _ensureGetUserMedia() {
+    if (JS('bool', '!(#.getUserMedia)', this)) {
+      JS('void', '#.getUserMedia = '
+          '(#.getUserMedia || #.webkitGetUserMedia || #.mozGetUserMedia ||'
+          '#.msGetUserMedia)', this, this, this, this, this);
+    }
+  }
+
+  @JSName('getUserMedia')
+  void _getUserMedia(options, _NavigatorUserMediaSuccessCallback success,
+      _NavigatorUserMediaErrorCallback error) native;
+$endif
+
+$!MEMBERS
+}
diff --git a/tools/dom/templates/html/impl/impl_Node.darttemplate b/tools/dom/templates/html/impl/impl_Node.darttemplate
index d5749c6..21069d6 100644
--- a/tools/dom/templates/html/impl/impl_Node.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Node.darttemplate
@@ -52,11 +52,11 @@
 $endif
 
   Node min([int compare(Node a, Node b)]) {
-    return Collections.min(this, compare);
+    return IterableMixinWorkaround.min(this, compare);
   }
 
   Node max([int compare(Node a, Node b)]) {
-    return Collections.max(this, compare);
+    return IterableMixinWorkaround.max(this, compare);
   }
 
   void add(Node value) {
@@ -90,6 +90,29 @@
     return result;
   }
 
+  void remove(Object object) {
+    if (object is! Node) return;
+    Node node = object;
+    if (!identical(this, node.parentNode)) return;
+    _this.$dom_removeChild(node);
+  }
+
+  void removeAll(Iterable elements) {
+    IterableMixinWorkaround.removeAll(this, elements);
+  }
+
+  void retainAll(Iterable elements) {
+    IterableMixinWorkaround.retainAll(this, elements);
+  }
+
+  void removeMatching(bool test(Node node)) {
+    IterableMixinWorkaround.removeMatching(this, test);
+  }
+
+  void retainMatching(bool test(Node node)) {
+    IterableMixinWorkaround.retainMatching(this, test);
+  }
+
   void clear() {
     _this.text = '';
   }
@@ -102,28 +125,30 @@
 
   // TODO(jacobr): We can implement these methods much more efficiently by
   // looking up the nodeList only once instead of once per iteration.
-  bool contains(Node element) => Collections.contains(this, element);
+  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(Node element)) => Collections.forEach(this, f);
+  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
   dynamic reduce(dynamic initialValue,
       dynamic combine(dynamic previousValue, Node element)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
   String join([String separator]) {
-    return Collections.joinList(this, separator);
+    return IterableMixinWorkaround.joinList(this, separator);
   }
 
-  List mappedBy(f(Node element)) =>
-      new MappedList<Node, dynamic>(this, f);
+  List mappedBy(f(Node element)) {
+    return IterableMixinWorkaround.mappedByList(this, f);
+  }
 
-  Iterable<Node> where(bool f(Node element)) =>
-     new WhereIterable<Node>(this, f);
+  Iterable<Node> where(bool f(Node element)) {
+    return IterableMixinWorkaround.where(this, f);
+  }
 
-  bool every(bool f(Node element)) => Collections.every(this, f);
+  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(Node element)) => Collections.any(this, f);
+  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);
 
   List<Node> toList() => new List<Node>.from(this);
   Set<Node> toSet() => new Set<Node>.from(this);
@@ -133,31 +158,31 @@
   // From List<Node>:
 
   List<Node> take(int n) {
-    return new ListView<Node>(this, 0, n);
+    return IterableMixinWorkaround.takeList(this, n);
   }
 
   Iterable<Node> takeWhile(bool test(Node value)) {
-    return new TakeWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
   List<Node> skip(int n) {
-    return new ListView<Node>(this, n, null);
+    return IterableMixinWorkaround.skipList(this, n);
   }
 
   Iterable<Node> skipWhile(bool test(Node value)) {
-    return new SkipWhileIterable<Node>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   Node firstMatching(bool test(Node value), {Node orElse()}) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   Node lastMatching(bool test(Node value), {Node orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   Node singleMatching(bool test(Node value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   Node elementAt(int index) {
@@ -205,8 +230,7 @@
 
   Node operator[](int index) => _this.$dom_childNodes[index];
 }
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   List<Node> get nodes {
     return new _ChildNodeListLazy(this);
@@ -224,8 +248,8 @@
 
   /**
    * Removes this node from the DOM.
-   * @domName Node.removeChild
    */
+  @DomName('Node.removeChild')
   void remove() {
     // TODO(jacobr): should we throw an exception if parent is already null?
     // TODO(vsm): Use the native remove when available.
@@ -237,8 +261,8 @@
 
   /**
    * Replaces this node with another node.
-   * @domName Node.replaceChild
    */
+  @DomName('Node.replaceChild')
   Node replaceWith(Node otherNode) {
     try {
       final Node parent = this.parentNode;
diff --git a/tools/dom/templates/html/impl/impl_Range.darttemplate b/tools/dom/templates/html/impl/impl_Range.darttemplate
index 3bf4767..e94acda 100644
--- a/tools/dom/templates/html/impl/impl_Range.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Range.darttemplate
@@ -5,8 +5,7 @@
 // WARNING: Do not edit - generated code.
 
 part of $LIBRARYNAME;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME() => document.$dom_createRange();
 
diff --git a/tools/dom/templates/html/impl/impl_SVGElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGElement.darttemplate
index ef3305d..cf03ecf 100644
--- a/tools/dom/templates/html/impl/impl_SVGElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_SVGElement.darttemplate
@@ -30,8 +30,7 @@
     _element.attributes['class'] = Strings.join(list, ' ');
   }
 }
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME.tag(String tag) =>
       _$(CLASSNAME)FactoryProvider.create$(CLASSNAME)_tag(tag);
@@ -88,17 +87,17 @@
 
   // Unsupported methods inherited from Element.
 
-  /** @domName Element.insertAdjacentText */
+  @DomName('Element.insertAdjacentText')
   void insertAdjacentText(String where, String text) {
     throw new UnsupportedError("Cannot invoke insertAdjacentText on SVG.");
   }
 
-  /** @domName Element.insertAdjacentHTML */
+  @DomName('Element.insertAdjacentHTML')
   void insertAdjacentHtml(String where, String text) {
     throw new UnsupportedError("Cannot invoke insertAdjacentHtml on SVG.");
   }
 
-  /** @domName Element.insertAdjacentHTML */
+  @DomName('Element.insertAdjacentHTML')
   Element insertAdjacentElement(String where, Element element) {
     throw new UnsupportedError("Cannot invoke insertAdjacentElement on SVG.");
   }
diff --git a/tools/dom/templates/html/impl/impl_SVGSVGElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGSVGElement.darttemplate
index cc7ba42..fbfefe7 100644
--- a/tools/dom/templates/html/impl/impl_SVGSVGElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_SVGSVGElement.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of svg;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME() => _$(CLASSNAME)FactoryProvider.createSvgSvgElement();
 
diff --git a/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate b/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate
index 2f87efe..7fac06a 100644
--- a/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate
+++ b/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate
@@ -5,8 +5,7 @@
 // WARNING: Do not edit - generated code.
 
 part of html;
-
-/// @domName $DOMNAME$ANNOTATIONS
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 $if DART2JS
diff --git a/tools/dom/templates/html/impl/impl_Storage.darttemplate b/tools/dom/templates/html/impl/impl_Storage.darttemplate
index d200bb8..d285685 100644
--- a/tools/dom/templates/html/impl/impl_Storage.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Storage.darttemplate
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS implements Map<String, String> $NATIVESPEC {
 
   // TODO(nweiz): update this when maps support lazy iteration
diff --git a/tools/dom/templates/html/impl/impl_Text.darttemplate b/tools/dom/templates/html/impl/impl_Text.darttemplate
index 74e385c..47d7bb7 100644
--- a/tools/dom/templates/html/impl/impl_Text.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Text.darttemplate
@@ -5,8 +5,7 @@
 // WARNING: Do not edit - generated code.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME(String data) => _$(CLASSNAME)FactoryProvider.create$CLASSNAME(data);
 $!MEMBERS
diff --git a/tools/dom/templates/html/impl/impl_UIEvent.darttemplate b/tools/dom/templates/html/impl/impl_UIEvent.darttemplate
index ce957c8..9aa0221 100644
--- a/tools/dom/templates/html/impl/impl_UIEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_UIEvent.darttemplate
@@ -5,8 +5,7 @@
 // WARNING: Do not edit - generated code.
 
 part of html;
-
-/// @domName $DOMNAME; @docsEditable true
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   // In JS, canBubble and cancelable are technically required parameters to
   // init*Event. In practice, though, if they aren't provided they simply
diff --git a/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate b/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
index d660a21..215a149 100644
--- a/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
@@ -3,13 +3,77 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of html;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+
+  factory WheelEvent(String type, Window view, int wheelDeltaX, int wheelDeltaY,
+      int detail, int screenX, int screenY, int clientX, int clientY,
+      int button,
+      [bool canBubble = true, bool cancelable = true, bool ctrlKey = false,
+      bool altKey = false, bool shiftKey = false, bool metaKey = false,
+      EventTarget relatedTarget = null]) {
+
+    var eventType = 'WheelEvent';
+    if (_Device.isFirefox) {
+      eventType = 'MouseScrollEvents';
+    }
+    final event = document.$dom_createEvent(eventType);
+$if DART2JS
+    if (event._hasInitWheelEvent) {
+      var modifiers = [];
+      if (ctrlKey) {
+        modifiers.push('Control');
+      }
+      if (altKey) {
+        modifiers.push('Alt');
+      }
+      if (shiftKey) {
+        modifiers.push('Shift');
+      }
+      if (metaKey) {
+        modifiers.push('Meta');
+      }
+      event._initWheelEvent(type, canBubble, cancelable, view, detail, screenX,
+          screenY, clientX, clientY, button, relatedTarget, modifiers.join(' '),
+          wheelDeltaX, wheelDeltaY, 0, 0);
+    } else if (event._hasInitMouseScrollEvent) {
+      var axis = 0;
+      var detail = 0;
+      if (wheelDeltaX != 0 && wheelDeltaY != 0) {
+        throw UnsupportedError(
+            'Cannot modify wheelDeltaX and wheelDeltaY simultaneously');
+      }
+      if (wheelDeltaY != 0) {
+        detail = wheelDeltaY;
+        axis = JS('int', 'MouseScrollEvent.VERTICAL_AXIS');
+      } else if (wheelDeltaX != 0) {
+        detail = wheelDeltaX;
+        axis = JS('int', 'MouseScrollEvent.HORIZONTAL_AXIS');
+      }
+      event._initMouseScrollEvent(type, canBubble, cancelable, view, detail,
+          screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
+          metaKey, button, relatedTarget, axis);
+    } else {
+$endif
+      // Fallthrough for Dartium.
+      event.$dom_initMouseEvent(type, canBubble, cancelable, view, detail,
+          screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
+          metaKey, button, relatedTarget);
+      event.$dom_initWebKitWheelEvent(wheelDeltaX,
+          wheelDeltaY ~/ 120, // Chrome does an auto-convert to pixels.
+          view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
+          metaKey);
+$if DART2JS
+    }
+$endif
+
+    return event;
+  }
+
 $!MEMBERS
 
 $if DART2JS
-  /** @domName WheelEvent.deltaY */
+  @DomName('WheelEvent.deltaY')
   num get deltaY {
     if (JS('bool', '#.deltaY !== undefined', this)) {
       // W3C WheelEvent
@@ -37,7 +101,7 @@
         'deltaY is not supported');
   }
 
-  /** @domName WheelEvent.deltaX */
+  @DomName('WheelEvent.deltaX')
   num get deltaX {
     if (JS('bool', '#.deltaX !== undefined', this)) {
       // W3C WheelEvent
@@ -51,7 +115,8 @@
 
       // Handle DOMMouseScroll case where it uses detail and the axis to
       // differentiate.
-      if (JS('bool', '#.axis !== undefined && #.axis == MouseScrollEvent.HORIZONTAL_AXIS', this, this)) {
+      if (JS('bool', '#.axis !== undefined && '
+        '#.axis == MouseScrollEvent.HORIZONTAL_AXIS', this, this)) {
         var detail = this._detail;
         // Firefox is normally the number of lines to scale (normally 3)
         // so multiply it by 40 to get pixels to move, matching IE & WebKit.
@@ -81,12 +146,55 @@
   num get _detail => JS('num', '#.detail', this);
   int get _deltaMode => JS('int', '#.deltaMode', this);
 
+  bool get _hasInitMouseScrollEvent =>
+      JS('bool', '!!(#.initMouseScrollEvent)', this);
+
+  @JSName('initMouseScrollEvent')
+  void _initMouseScrollEvent(
+      String type,
+      bool canBubble,
+      bool cancelable,
+      Window view,
+      int detail,
+      int screenX,
+      int screenY,
+      int clientX,
+      int clientY,
+      bool ctrlKey,
+      bool altKey,
+      bool shiftKey,
+      bool metaKey,
+      int button,
+      EventTarget relatedTarget,
+      int axis) native;
+
+  bool get _hasInitWheelEvent =>
+      JS('bool', '!!(#.initWheelEvent)', this);
+  @JSName('initWheelEvent')
+  void _initWheelEvent(
+      String eventType,
+      bool canBubble,
+      bool cancelable,
+      Window view,
+      int detail,
+      int screenX,
+      int screenY,
+      int clientX,
+      int clientY,
+      int button,
+      EventTarget relatedTarget,
+      String modifiersList,
+      int deltaX,
+      int deltaY,
+      int deltaZ,
+      int deltaMode) native;
+
 $else
-  /** @domName WheelEvent.deltaX */
+  @DomName('WheelEvent.deltaX')
   num get deltaX => $dom_wheelDeltaX;
-  /** @domName WheelEvent.deltaY */
+  @DomName('WheelEvent.deltaY')
   num get deltaY => $dom_wheelDeltaY;
-  /** @domName WheelEvent.deltaMode */
+  @DomName('WheelEvent.deltaMode')
   int get deltaMode => 0;
 
 $endif
diff --git a/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate b/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
index ea113b6..ab55590 100644
--- a/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
+++ b/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
@@ -29,7 +29,7 @@
  * * [JS XMLHttpRequest](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest)
  * * [Using XMLHttpRequest](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Using_XMLHttpRequest)
  */
-/// @domName XMLHttpRequest
+@DomName('XMLHttpRequest')
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   /**
    * Creates a URL get request for the specified `url`.
diff --git a/tools/dom/templates/html/impl/pure_interface.darttemplate b/tools/dom/templates/html/impl/pure_interface.darttemplate
index 139e82f..869eff2 100644
--- a/tools/dom/templates/html/impl/pure_interface.darttemplate
+++ b/tools/dom/templates/html/impl/pure_interface.darttemplate
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 part of $LIBRARYNAME;
-
-/// @domName $DOMNAME
+$ANNOTATIONS
 abstract class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS}
diff --git a/tools/dom/templates/immutable_list_mixin.darttemplate b/tools/dom/templates/immutable_list_mixin.darttemplate
index bf2bf4c..b7c8507 100644
--- a/tools/dom/templates/immutable_list_mixin.darttemplate
+++ b/tools/dom/templates/immutable_list_mixin.darttemplate
@@ -15,54 +15,54 @@
   int get length => numberOfItems;
 $endif
   dynamic reduce(dynamic initialValue, dynamic combine(dynamic, $E)) {
-    return Collections.reduce(this, initialValue, combine);
+    return IterableMixinWorkaround.reduce(this, initialValue, combine);
   }
 
 $if DEFINE_CONTAINS
-  bool contains($E element) => Collections.contains(this, element);
+  bool contains($E element) => IterableMixinWorkaround.contains(this, element);
 $else
   // contains() defined by IDL.
 $endif
 
-  void forEach(void f($E element)) => Collections.forEach(this, f);
+  void forEach(void f($E element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) => Collections.joinList(this, separator);
+  String join([String separator]) => IterableMixinWorkaround.joinList(this, separator);
 
-  List mappedBy(f($E element)) => new MappedList<$E, dynamic>(this, f);
+  List mappedBy(f($E element)) => IterableMixinWorkaround.mappedByList(this, f);
 
-  Iterable<$E> where(bool f($E element)) => new WhereIterable<$E>(this, f);
+  Iterable<$E> where(bool f($E element)) => IterableMixinWorkaround.where(this, f);
 
-  bool every(bool f($E element)) => Collections.every(this, f);
+  bool every(bool f($E element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f($E element)) => Collections.any(this, f);
+  bool any(bool f($E element)) => IterableMixinWorkaround.any(this, f);
 
   List<$E> toList() => new List<$E>.from(this);
   Set<$E> toSet() => new Set<$E>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  List<$E> take(int n) => new ListView<$E>(this, 0, n);
+  List<$E> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
   Iterable<$E> takeWhile(bool test($E value)) {
-    return new TakeWhileIterable<$E>(this, test);
+    return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  List<$E> skip(int n) => new ListView<$E>(this, n, null);
+  List<$E> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
   Iterable<$E> skipWhile(bool test($E value)) {
-    return new SkipWhileIterable<$E>(this, test);
+    return IterableMixinWorkaround.skipWhile(this, test);
   }
 
   $E firstMatching(bool test($E value), { $E orElse() }) {
-    return Collections.firstMatching(this, test, orElse);
+    return IterableMixinWorkaround.firstMatching(this, test, orElse);
   }
 
   $E lastMatching(bool test($E value), {$E orElse()}) {
-    return Collections.lastMatchingInList(this, test, orElse);
+    return IterableMixinWorkaround.lastMatchingInList(this, test, orElse);
   }
 
   $E singleMatching(bool test($E value)) {
-    return Collections.singleMatching(this, test);
+    return IterableMixinWorkaround.singleMatching(this, test);
   }
 
   $E elementAt(int index) {
@@ -95,7 +95,7 @@
     throw new UnsupportedError("Cannot clear immutable List.");
   }
 $else
-  // contains() defined by IDL.
+  // clear() defined by IDL.
 $endif
 
   void sort([int compare($E a, $E b)]) {
@@ -126,16 +126,36 @@
     throw new StateError("More than one element");
   }
 
-  $E min([int compare($E a, $E b)]) => Collections.min(this, compare);
+  $E min([int compare($E a, $E b)]) => IterableMixinWorkaround.min(this, compare);
 
-  $E max([int compare($E a, $E b)]) => Collections.max(this, compare);
+  $E max([int compare($E a, $E b)]) => IterableMixinWorkaround.max(this, compare);
 
   $E removeAt(int pos) {
-    throw new UnsupportedError("Cannot removeAt on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   $E removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void remove(Object object) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainAll(Iterable elements) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void removeMatching(bool test($E element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
+  }
+
+  void retainMatching(bool test($E element)) {
+    throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
   void setRange(int start, int rangeLength, List<$E> from, [int startFrom]) {
diff --git a/tools/gyp/configurations.gypi b/tools/gyp/configurations.gypi
index 0641a19..0a3574f 100644
--- a/tools/gyp/configurations.gypi
+++ b/tools/gyp/configurations.gypi
@@ -23,6 +23,8 @@
     ['"<(target_arch)"=="x64"', { 'dart_target_arch': 'X64', }],
     ['"<(target_arch)"=="arm"', { 'dart_target_arch': 'ARM', }],
     ['"<(target_arch)"=="simarm"', { 'dart_target_arch': 'SIMARM', }],
+    ['"<(target_arch)"=="mips"', { 'dart_target_arch': 'MIPS', }],
+    ['"<(target_arch)"=="simmips"', { 'dart_target_arch': 'SIMMIPS', }],
   ],
   },
   'conditions': [
@@ -60,6 +62,20 @@
         ],
       },
 
+      'Dart_simmips_Base': {
+        'abstract': 1,
+        'defines': [
+          'TARGET_ARCH_MIPS',
+        ]
+      },
+
+      'Dart_mips_Base': {
+        'abstract': 1,
+        'defines': [
+          'TARGET_ARCH_MIPS',
+        ],
+      },
+
       'Dart_Debug': {
         'abstract': 1,
       },
@@ -98,11 +114,7 @@
       },
 
       'ReleaseSIMARM': {
-        # Should not inherit from Dart_Release (see DebugSIMARM).
-        'inherit_from': ['Dart_Base', 'Dart_simarm_Base'],
-        'defines': [
-          'NDEBUG',
-        ],
+        'inherit_from': ['Dart_Base', 'Dart_simarm_Base', 'Dart_Release'],
       },
 
       'DebugARM': {
@@ -113,6 +125,28 @@
         'inherit_from': ['Dart_Base', 'Dart_arm_Base', 'Dart_Release'],
       },
 
+      'DebugSIMMIPS': {
+        # Should not inherit from Dart_Debug because Dart_simmips_Base defines
+        # the optimization level to be -O3, as the simulator runs too slow
+        # otherwise.
+        'inherit_from': ['Dart_Base', 'Dart_simmips_Base'],
+        'defines': [
+          'DEBUG',
+        ],
+      },
+
+      'ReleaseSIMMIPS': {
+        'inherit_from': ['Dart_Base', 'Dart_simmips_Base', 'Dart_Release'],
+      },
+
+      'DebugMIPS': {
+        'inherit_from': ['Dart_Base', 'Dart_mips_Base', 'Dart_Debug'],
+      },
+
+      'ReleaseMIPS': {
+        'inherit_from': ['Dart_Base', 'Dart_mips_Base', 'Dart_Release'],
+      },
+
       # These targets assume that target_arch is passed in explicitly
       # by the containing project (e.g., chromium).
       'Debug': {
diff --git a/tools/gyp/configurations_make.gypi b/tools/gyp/configurations_make.gypi
index b4679b5..efe19cb 100644
--- a/tools/gyp/configurations_make.gypi
+++ b/tools/gyp/configurations_make.gypi
@@ -55,6 +55,19 @@
         ],
       },
 
+      'Dart_simmips_Base': {
+        'cflags': [ '-O3', '-m32', ],
+        'ldflags': [ '-m32', ],
+      },
+
+      'Dart_mips_Base': {
+        'cflags': [
+          '-march=mips32r2',
+          '-mhard-float',
+          '-fno-strict-overflow',
+        ],
+      },
+
       'Dart_Debug': {
         'cflags': [ '-O<(dart_debug_optimization_level)' ],
       },
diff --git a/tools/test-runtime.dart b/tools/test-runtime.dart
index 95c24d4..a959f23 100755
--- a/tools/test-runtime.dart
+++ b/tools/test-runtime.dart
@@ -50,8 +50,8 @@
   var verbose = firstConf['verbose'];
   var printTiming = firstConf['time'];
   var listTests = firstConf['list'];
-  
-  if (!firstConf['append_flaky_log'])  {
+
+  if (!firstConf['append_logs'])  {
     var file = new File(TestUtils.flakyFileName());
     if (file.existsSync()) {
       file.deleteSync();
@@ -72,25 +72,21 @@
     print(Strings.join(output_words, ' '));
   }
 
-  var configurationIterator = configurations.iterator;
-  void enqueueConfiguration(ProcessQueue queue) {
-    if (!configurationIterator.moveNext()) return;
-
-    var conf = configurationIterator.current;
+  var testSuites = new List<TestSuite>();
+  for (var conf in configurations) {
     if (selectors.containsKey('co19')) {
-      queue.addTestSuite(new Co19TestSuite(conf));
+      testSuites.add(new Co19TestSuite(conf));
     }
     if (conf['runtime'] == 'vm' && selectors.containsKey('vm')) {
       // vm tests contain both cc tests (added here) and dart tests (added in
       // [TEST_SUITE_DIRECTORIES]).
-      queue.addTestSuite(new VMTestSuite(conf));
+      testSuites.add(new VMTestSuite(conf));
     }
 
     for (final testSuiteDir in TEST_SUITE_DIRECTORIES) {
       final name = testSuiteDir.filename;
       if (selectors.containsKey(name)) {
-        queue.addTestSuite(
-            new StandardTestSuite.forDirectory(conf, testSuiteDir));
+        testSuites.add(new StandardTestSuite.forDirectory(conf, testSuiteDir));
       }
     }
   }
@@ -112,8 +108,8 @@
       progressIndicator,
       startTime,
       printTiming,
-      enqueueConfiguration,
-      () => terminateHttpServer(),
+      testSuites,
+      () => TestingServerRunner.terminateHttpServers(),
       verbose,
       listTests);
 }
diff --git a/tools/test.dart b/tools/test.dart
index 984e57d..3077ac6 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -30,6 +30,7 @@
 import "testing/dart/test_suite.dart";
 import "testing/dart/test_progress.dart";
 import "testing/dart/http_server.dart";
+import "testing/dart/utils.dart";
 
 import "../compiler/tests/dartc/test_config.dart";
 import "../runtime/tests/vm/test_config.dart";
@@ -48,6 +49,7 @@
     new Path('runtime/tests/vm'),
     new Path('samples/tests/samples'),
     new Path('tests/benchmark_smoke'),
+    new Path('tests/chrome'),
     new Path('tests/compiler/dart2js'),
     new Path('tests/compiler/dart2js_extra'),
     new Path('tests/compiler/dart2js_foreign'),
@@ -82,13 +84,16 @@
   var printTiming = firstConf['time'];
   var listTests = firstConf['list'];
 
-  if (!firstConf['append_flaky_log'])  {
+  if (!firstConf['append_logs'])  {
     var file = new File(TestUtils.flakyFileName());
     if (file.existsSync()) {
       file.deleteSync();
     }
   }
 
+  DebugLogger.init(firstConf['write_debug_log'] ?
+      TestUtils.debugLogfile() : null, append: firstConf['append_logs']);
+
   // Print the configurations being run by this execution of
   // test.dart. However, don't do it if the silent progress indicator
   // is used. This is only needed because of the junit tests.
@@ -120,43 +125,44 @@
     }
   }
 
-  var configurationIterator = configurations.iterator;
-  void enqueueConfiguration(ProcessQueue queue) {
-    if (!configurationIterator.moveNext()) return;
-
-    var conf = configurationIterator.current;
+  var testSuites = new List<TestSuite>();
+  for (var conf in configurations) {
     TestingServerRunner.setPackageRootDir(conf);
-
     for (String key in selectors.keys) {
       if (key == 'co19') {
-        queue.addTestSuite(new Co19TestSuite(conf));
+        testSuites.add(new Co19TestSuite(conf));
       } else if (conf['runtime'] == 'vm' && key == 'vm') {
         // vm tests contain both cc tests (added here) and dart tests (added in
         // [TEST_SUITE_DIRECTORIES]).
-        queue.addTestSuite(new VMTestSuite(conf));
+        testSuites.add(new VMTestSuite(conf));
       } else if (conf['compiler'] == 'dartc' && key == 'dartc') {
-        queue.addTestSuite(new SamplesDartcTestSuite(conf));
-        queue.addTestSuite(new JUnitDartcTestSuite(conf));
+        testSuites.add(new SamplesDartcTestSuite(conf));
+        testSuites.add(new JUnitDartcTestSuite(conf));
       }
     }
 
     for (final testSuiteDir in TEST_SUITE_DIRECTORIES) {
       final name = testSuiteDir.filename;
       if (selectors.containsKey(name)) {
-        queue.addTestSuite(
+        testSuites.add(
             new StandardTestSuite.forDirectory(conf, testSuiteDir,
             serverList: TestingServerRunner.serverList));
       }
     }
   }
 
+  void allTestsFinished() {
+    TestingServerRunner.terminateHttpServers();
+    DebugLogger.close();
+  }
+
   // Start process queue.
   new ProcessQueue(maxProcesses,
                    progressIndicator,
                    startTime,
                    printTiming,
-                   enqueueConfiguration,
-                   () => TestingServerRunner.terminateHttpServers(),
+                   testSuites,
+                   allTestsFinished,
                    verbose,
                    listTests);
 }
diff --git a/tools/testing/dart/http_server.dart b/tools/testing/dart/http_server.dart
index b774319..dcc37a6 100644
--- a/tools/testing/dart/http_server.dart
+++ b/tools/testing/dart/http_server.dart
@@ -7,7 +7,10 @@
 import 'dart:io';
 import 'dart:isolate';
 import 'test_suite.dart';  // For TestUtils.
-import '../../../pkg/args/lib/args.dart';
+// TODO(efortuna): Rewrite to not use the args library and simply take an
+// expected number of arguments, so test.dart doesn't rely on the args library?
+// See discussion on https://codereview.chromium.org/11931025/.
+import 'vendored_pkg/args/args.dart';
 
 main() {
   /** Convenience method for local testing. */
@@ -73,11 +76,8 @@
     var httpServer = new HttpServer();
     var packagesDirName = 'packages';
     httpServer.onError = (e) {
-      // Consider errors in the builtin http server fatal.
-      // Intead of just throwing the exception we print
-      // a message that makes it clearer what happened.
+      // TODO(ricow): Once we have a debug log we should write this out there.
       print('Test http server error: $e');
-      exit(1);
     };
     httpServer.defaultRequestHandler = (request, resp) {
       var requestPath = new Path(request.path.substring(1)).canonicalize();
diff --git a/tools/testing/dart/multitest.dart b/tools/testing/dart/multitest.dart
index abc4441..85a9d1b 100644
--- a/tools/testing/dart/multitest.dart
+++ b/tools/testing/dart/multitest.dart
@@ -7,6 +7,7 @@
 import "dart:async";
 import "dart:io";
 import "test_suite.dart";
+import "utils.dart";
 
 // Multitests are Dart test scripts containing lines of the form
 // " [some dart code] /// [key]: [error type]"
@@ -58,15 +59,8 @@
   // Read the entire file into a byte buffer and transform it to a
   // String. This will treat the file as ascii but the only parts
   // we are interested in will be ascii in any case.
-  RandomAccessFile file = new File.fromPath(filePath).openSync(FileMode.READ);
-  List chars = new List(file.lengthSync());
-  int offset = 0;
-  while (offset != chars.length) {
-    offset += file.readListSync(chars, offset, chars.length - offset);
-  }
-  file.closeSync();
-  String contents = new String.fromCharCodes(chars);
-  chars = null;
+  List bytes = new File.fromPath(filePath).readAsBytesSync();
+  String contents = decodeUtf8(bytes);
   int first_newline = contents.indexOf('\n');
   final String line_separator =
       (first_newline == 0 || contents[first_newline - 1] != '\r')
@@ -74,6 +68,7 @@
       : '\r\n';
   List<String> lines = contents.split(line_separator);
   if (lines.last == '') lines.removeLast();
+  bytes = null;
   contents = null;
   Set<String> validMultitestOutcomes = new Set<String>.from(
       ['compile-time error', 'runtime error',
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index fa2edd5..44b7f2e 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -108,7 +108,7 @@
               'arch',
               'The architecture to run tests for',
               ['-a', '--arch'],
-              ['all', 'ia32', 'x64', 'simarm'],
+              ['all', 'ia32', 'x64', 'simarm', 'simmips'],
               'ia32'),
           new _TestOptionSpecification(
               'system',
@@ -270,9 +270,17 @@
               false,
               'bool'),
           new _TestOptionSpecification(
-              'append_flaky_log',
-              'Do not delete the old flaky log but rather append to it.',
-              ['--append_flaky_log'],
+              'append_logs',
+              'Do not delete old logs but rather append to them.',
+              ['--append_logs'],
+              [],
+              false,
+              'bool'
+              ),
+          new _TestOptionSpecification(
+              'write_debug_log',
+              'Don\'t write debug messages to stdout but rather to a logfile.',
+              ['--write-debug-log'],
               [],
               false,
               'bool'
diff --git a/tools/testing/dart/test_progress.dart b/tools/testing/dart/test_progress.dart
index c74025e..7a45a41 100644
--- a/tools/testing/dart/test_progress.dart
+++ b/tools/testing/dart/test_progress.dart
@@ -5,10 +5,12 @@
 library test_progress;
 
 import "dart:io";
+import "dart:io" as io;
+import "http_server.dart" as http_server;
+import "status_file_parser.dart";
 import "test_runner.dart";
 import "test_suite.dart";
-import "status_file_parser.dart";
-import "http_server.dart" as http_server;
+import "utils.dart";
 
 class ProgressIndicator {
   ProgressIndicator(this._startTime, this._printTiming)
@@ -109,7 +111,9 @@
     _printTimingInformation();
     stdout.close();
     stderr.close();
-    if (_failedTests > 0) exit(1);
+    if (_failedTests > 0) {
+      io.exitCode = 1;
+    }
   }
 
   void _printStartProgress(TestCase test) {}
@@ -188,13 +192,13 @@
         output.add('DRT pixel test failed! stdout is not printed because it '
                    'contains binary data!');
       } else {
-        output.add(new String.fromCharCodes(test.lastCommandOutput.stdout));
+        output.add(decodeUtf8(test.lastCommandOutput.stdout));
       }
     }
     if (!test.lastCommandOutput.stderr.isEmpty) {
       output.add('');
       output.add('stderr:');
-      output.add(new String.fromCharCodes(test.lastCommandOutput.stderr));
+      output.add(decodeUtf8(test.lastCommandOutput.stderr));
     }
     if (test is BrowserTestCase) {
       // Additional command for rerunning the steps locally after the fact.
@@ -286,7 +290,9 @@
     }
     stdout.close();
     stderr.close();
-    if (_failedTests > 0) exit(1);
+    if (_failedTests > 0) {
+      io.exitCode = 1;
+    }
   }
 
   void allTestsKnown() {
@@ -336,7 +342,7 @@
   addColorWrapped(List<int> codes, String string, int color) {
     codes.add(27);
     codes.addAll('[${color}m'.charCodes);
-    codes.addAll(string.charCodes);
+    codes.addAll(encodeUtf8(string));
     codes.add(27);
     codes.addAll('[0m'.charCodes);
   }
@@ -360,7 +366,7 @@
   String _header(String header) {
     var result = [];
     addColorWrapped(result, header, BOLD);
-    return new String.fromCharCodes(result);
+    return decodeUtf8(result);
   }
 }
 
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index 20c10ac..297d8d2 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -17,10 +17,11 @@
 import "dart:io" as io;
 import "dart:isolate";
 import "dart:uri";
+import "http_server.dart" as http_server;
 import "status_file_parser.dart";
 import "test_progress.dart";
 import "test_suite.dart";
-import "http_server.dart" as http_server;
+import "utils.dart";
 
 const int NO_TIMEOUT = 0;
 const int SLOW_TIMEOUT_MULTIPLIER = 4;
@@ -625,7 +626,7 @@
     // and the virtual framebuffer X server didn't hook up, or DRT crashed with
     // a core dump. Sometimes DRT crashes after it has set the stdout to PASS,
     // so we have to do this check first.
-    var stderrLines = new String.fromCharCodes(super.stderr).split("\n");
+    var stderrLines = decodeUtf8(super.stderr).split("\n");
     for (String line in stderrLines) {
       // TODO(kustermann,ricow): Issue: 7564
       // This seems to happen quite frequently, we need to figure out why.
@@ -700,7 +701,7 @@
     // Browser tests fail unless stdout contains
     // 'Content-Type: text/plain' followed by 'PASS'.
     bool has_content_type = false;
-    var stdoutLines = new String.fromCharCodes(super.stdout).split("\n");
+    var stdoutLines = decodeUtf8(super.stdout).split("\n");
     for (String line in stdoutLines) {
       switch (line) {
         case 'Content-Type: text/plain':
@@ -773,7 +774,7 @@
     List<String> staticWarnings = [];
 
     // Read the returned list of errors and stuff them away.
-    var stderrLines = new String.fromCharCodes(super.stderr).split("\n");
+    var stderrLines = decodeUtf8(super.stderr).split("\n");
     for (String line in stderrLines) {
       if (line.length == 0) continue;
       List<String> fields = splitMachineError(line);
@@ -949,9 +950,9 @@
         && testCase.configuration['verbose']) {
       print(testCase.displayName);
 
-      print(new String.fromCharCodes(lastCommandOutput.stderr));
+      print(decodeUtf8(lastCommandOutput.stderr));
       if (!lastCommandOutput.command.isPixelTest) {
-        print(new String.fromCharCodes(lastCommandOutput.stdout));
+        print(decodeUtf8(lastCommandOutput.stdout));
       } else {
         print("DRT pixel test failed! stdout is not printed because it "
               "contains binary data!");
@@ -1319,7 +1320,8 @@
         } else if (line.startsWith('>>> ')) {
           throw new Exception('Unexpected command from dartc batch runner.');
         } else {
-          buffer.addAll("$line\n".charCodes);
+          buffer.addAll(encodeUtf8(line));
+          buffer.addAll("\n".charCodes);
         }
         line = stream.readLine();
       }
@@ -1346,7 +1348,8 @@
         if (line.startsWith('>>> EOF STDERR')) {
           _stderrDone();
         } else {
-          buffer.addAll("$line\n".charCodes);
+          buffer.addAll(encodeUtf8(line));
+          buffer.addAll("\n".charCodes);
         }
         line = stream.readLine();
       }
@@ -1423,15 +1426,14 @@
  */
 class ProcessQueue {
   int _numProcesses = 0;
-  int _activeTestListers = 0;
   int _maxProcesses;
+  bool _allTestsWereEnqueued = false;
 
   /** The number of tests we allow to actually fail before we stop retrying. */
   int _MAX_FAILED_NO_RETRY = 4;
   bool _verbose;
   bool _listTests;
   Function _allDone;
-  EnqueueMoreWork _enqueueMoreWork;
   Queue<TestCase> _tests;
   ProgressIndicator _progress;
 
@@ -1465,7 +1467,7 @@
                String progress,
                Date startTime,
                bool printTiming,
-               this._enqueueMoreWork,
+               testSuites,
                this._allDone,
                [bool verbose = false,
                 bool listTests = false])
@@ -1477,20 +1479,7 @@
                                                    printTiming),
         _batchProcesses = new Map<String, List<BatchRunnerProcess>>(),
         _testCache = new Map<String, List<TestInformation>>() {
-    _checkDone();
-  }
-
-  /**
-   * Registers a TestSuite so that all of its tests will be run.
-   */
-  void addTestSuite(TestSuite testSuite) {
-    _activeTestListers++;
-    testSuite.forEachTest(_runTest, _testCache, _testListerDone);
-  }
-
-  void _testListerDone() {
-    _activeTestListers--;
-    _checkDone();
+    _runTests(testSuites);
   }
 
   /**
@@ -1501,24 +1490,33 @@
     _allDone();
     if (browserUsed != '' && _seleniumServer != null) {
       _seleniumServer.kill();
-    } else {
-      _progress.allDone();
     }
+    _progress.allDone();
   }
 
   void _checkDone() {
-    // When there are no more active test listers ask for more work
-    // from process queue users.
-    if (_activeTestListers == 0) {
-     _enqueueMoreWork(this);
+    if (_allTestsWereEnqueued && _tests.isEmpty && _numProcesses == 0) {
+      _terminateBatchRunners().then((_) => _cleanupAndMarkDone());
     }
-    // If there is still no work, we are done.
-    if (_activeTestListers == 0) {
-      _progress.allTestsKnown();
-      if (_tests.isEmpty && _numProcesses == 0) {
-        _terminateBatchRunners().then((_) => _cleanupAndMarkDone());
+  }
+
+  void _runTests(List<TestSuite> testSuites) {
+    // FIXME: For some reason we cannot call this method on all test suites
+    // in parallel.
+    // If we do, not all tests get enqueued (if --arch=all was specified,
+    // we don't get twice the number of tests [tested on -rvm -cnone])
+    // Issue: 7927
+    Iterator<TestSuite> iterator = testSuites.iterator;
+    void enqueueNextSuite() {
+      if (!iterator.moveNext()) {
+        _allTestsWereEnqueued = true;
+        _progress.allTestsKnown();
+        _checkDone();
+      } else {
+        iterator.current.forEachTest(_runTest, _testCache, enqueueNextSuite);
       }
     }
+    enqueueNextSuite();
   }
 
   /**
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index c458e52..2b3075f 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -17,12 +17,15 @@
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
+import "dart:uri";
+import "drt_updater.dart";
+import "multitest.dart";
 import "status_file_parser.dart";
 import "test_runner.dart";
-import "multitest.dart";
-import "drt_updater.dart";
-import "dart:uri";
-import '../../../pkg/path/lib/path.dart' as pathLib;
+import "utils.dart";
+
+// TODO(efortuna,whess): Remove this import.
+import 'vendored_pkg/path/path.dart' as pathLib;
 
 part "browser_test.dart";
 
@@ -415,6 +418,8 @@
    */
   List serverList;
 
+  static final RegExp multiTestRegExp = new RegExp(r"/// [0-9][0-9]:(.*)");
+
   StandardTestSuite(Map configuration,
                     String suiteName,
                     Path suiteDirectory,
@@ -1287,11 +1292,13 @@
    * configurations, so it may not use [configuration].
    */
   static Map readOptionsFromFile(Path filePath) {
+    if (filePath.segments().contains('co19')) {
+      return readOptionsFromCo19File(filePath);
+    }
     RegExp testOptionsRegExp = new RegExp(r"// VMOptions=(.*)");
     RegExp dartOptionsRegExp = new RegExp(r"// DartOptions=(.*)");
     RegExp otherScriptsRegExp = new RegExp(r"// OtherScripts=(.*)");
     RegExp packageRootRegExp = new RegExp(r"// PackageRoot=(.*)");
-    RegExp multiTestRegExp = new RegExp(r"/// [0-9][0-9]:(.*)");
     RegExp multiHtmlTestRegExp =
         new RegExp(r"useHtmlIndividualConfiguration()");
     RegExp staticTypeRegExp =
@@ -1309,25 +1316,14 @@
     RegExp sourceOrImportRegExp =
         new RegExp("^(#source|#import|part)[ \t]+[\('\"]", multiLine: true);
 
-    // Read the entire file into a byte buffer and transform it to a
-    // String. This will treat the file as ascii but the only parts
-    // we are interested in will be ascii in any case.
-    RandomAccessFile file = new File.fromPath(filePath).openSync(FileMode.READ);
-    List chars = new List(file.lengthSync());
-    var offset = 0;
-    while (offset != chars.length) {
-      offset += file.readListSync(chars, offset, chars.length - offset);
-    }
-    file.closeSync();
-    String contents = new String.fromCharCodes(chars);
-    chars = null;
+    var bytes = new File.fromPath(filePath).readAsBytesSync();
+    String contents = decodeUtf8(bytes);
+    bytes = null;
 
     // Find the options in the file.
     List<List> result = new List<List>();
     List<String> dartOptions;
     String packageRoot;
-    bool hasCompileError = contents.contains("@compile-error");
-    bool hasRuntimeError = contents.contains("@runtime-error");
     bool isStaticClean = false;
 
     Iterable<Match> matches = testOptionsRegExp.allMatches(contents);
@@ -1407,8 +1403,8 @@
     return { "vmOptions": result,
              "dartOptions": dartOptions,
              "packageRoot": packageRoot,
-             "hasCompileError": hasCompileError,
-             "hasRuntimeError": hasRuntimeError,
+             "hasCompileError": false,
+             "hasRuntimeError": false,
              "isStaticClean" : isStaticClean,
              "otherScripts": otherScripts,
              "isMultitest": isMultitest,
@@ -1436,6 +1432,64 @@
     // may lead to reads from empty files.
     return [vmOptions[0]];
   }
+
+  /**
+   * Read options from a co19 test file.
+   *
+   * The reason this is different from [readOptionsFromFile] is that
+   * co19 is developed based on a contract which defines certain test
+   * tags. These tags may appear unused, but should not be removed
+   * without consulting with the co19 team.
+   *
+   * Also, [readOptionsFromFile] recognizes a number of additional
+   * tags that are not appropriate for use in general tests of
+   * conformance to the Dart language. Any Dart implementation must
+   * pass the co19 test suite as is, and not require extra flags,
+   * environment variables, configuration files, etc.
+   */
+  static Map readOptionsFromCo19File(Path filePath) {
+    String contents = decodeUtf8(new File.fromPath(filePath).readAsBytesSync());
+
+    bool hasCompileError = contents.contains("@compile-error");
+    bool hasRuntimeError = contents.contains("@runtime-error");
+    bool hasDynamicTypeError = contents.contains("@dynamic-type-error");
+    bool hasStaticWarning = contents.contains("@static-warning");
+    bool isMultitest = multiTestRegExp.hasMatch(contents);
+
+    if (hasDynamicTypeError) {
+      // TODO(ahe): Remove this warning when co19 no longer uses this tag.
+
+      // @dynamic-type-error has been replaced by tests that use
+      // tests/co19/src/Utils/dynamic_check.dart to dynamically detect
+      // if a test is running in checked mode or not and change its
+      // expectations accordingly.
+
+      // Using stderr.writeString to avoid breaking dartc/junit_tests
+      // which parses the output of the --list option.
+      stderr.writeString(
+          "Warning: deprecated @dynamic-type-error tag used in $filePath\n");
+    }
+
+    return {
+      "vmOptions": <List>[[]],
+      "dartOptions": null,
+      "packageRoot": null,
+      "hasCompileError": hasCompileError,
+      "hasRuntimeError": hasRuntimeError,
+      "isStaticClean" : !hasStaticWarning,
+      "otherScripts": <String>[],
+      "isMultitest": isMultitest,
+      "isMultiHtmlTest": false,
+      "subtestNames": <String>[],
+      "containsLeadingHash": false,
+      "isolateStubs": '',
+      "containsDomImport": false,
+      "isLibraryDefinition": false,
+      "containsSourceOrImport": false,
+      "numStaticTypeAnnotations": 0,
+      "numCompileTimeAnnotations": 0,
+    };
+  }
 }
 
 
@@ -1660,6 +1714,10 @@
     return completer.future;
   }
 
+  static Path debugLogfile() {
+    return new Path(".debug.log");
+  }
+
   static String flakyFileName() {
     // If a flaky test did fail, infos about it (i.e. test name, stdin, stdout)
     // will be written to this file. This is useful for the debugging of
diff --git a/tools/testing/dart/utils.dart b/tools/testing/dart/utils.dart
new file mode 100644
index 0000000..7c2bbf7
--- /dev/null
+++ b/tools/testing/dart/utils.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library utils;
+
+import 'dart:io';
+import 'dart:utf' as utf;
+
+class DebugLogger {
+  static OutputStream _stream;
+
+  /**
+   * If [path] was null, the DebugLogger will write messages to stdout.
+   */
+  static init(Path path, {append: false}) {
+    if (path != null) {
+      var mode = append ? FileMode.APPEND : FileMode.WRITE;
+      _stream = new File.fromPath(path).openOutputStream(mode);
+    }
+  }
+
+  static void close() {
+    if (_stream != null) {
+      _stream.close();
+      _stream = null;
+    }
+  }
+
+  static void info(String msg) {
+    _print("Info: $msg");
+  }
+
+  static void warning(String msg) {
+    _print("Warning: $msg");
+  }
+
+  static void error(String msg) {
+    _print("Error: $msg");
+  }
+
+  static void _print(String msg) {
+    if (_stream != null) {
+      _stream.write(encodeUtf8(msg));
+      _stream.write([0x0a]);
+    } else {
+      print(msg);
+    }
+  }
+}
+
+List<int> encodeUtf8(String string) {
+  return utf.encodeUtf8(string);
+}
+
+// TODO(kustermann,ricow): As soon we have a debug log we should log
+// invalid utf8-encoded input to the log.
+// Currently invalid bytes will be replaced by a replacement character.
+String decodeUtf8(List<int> bytes) {
+  return utf.decodeUtf8(bytes);
+}
+
diff --git a/tools/testing/dart/vendored_pkg/README.txt b/tools/testing/dart/vendored_pkg/README.txt
new file mode 100644
index 0000000..0d4c1a7
--- /dev/null
+++ b/tools/testing/dart/vendored_pkg/README.txt
@@ -0,0 +1,4 @@
+The files in this folder are copies of libraries in the pkg directory. We have
+copies here to prevent a bootstrapping issue when running the test.dart binary
+in case breaking changes are made to the language in future revisions, we can
+still test with a known stable version.
diff --git a/tools/testing/dart/vendored_pkg/args/args.dart b/tools/testing/dart/vendored_pkg/args/args.dart
new file mode 100644
index 0000000..29da1e2
--- /dev/null
+++ b/tools/testing/dart/vendored_pkg/args/args.dart
@@ -0,0 +1,402 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * This library lets you define parsers for parsing raw command-line arguments
+ * into a set of options and values using [GNU][] and [POSIX][] style options.
+ *
+ * ## Defining options ##
+ *
+ * To use this library, you create an [ArgParser] object which will contain
+ * the set of options you support:
+ *
+ *     var parser = new ArgParser();
+ *
+ * Then you define a set of options on that parser using [addOption()] and
+ * [addFlag()]. The minimal way to create an option is:
+ *
+ *     parser.addOption('name');
+ *
+ * This creates an option named "name". Options must be given a value on the
+ * command line. If you have a simple on/off flag, you can instead use:
+ *
+ *     parser.addFlag('name');
+ *
+ * Flag options will, by default, accept a 'no-' prefix to negate the option.
+ * This can be disabled like so:
+ *
+ *     parser.addFlag('name', negatable: false);
+ *
+ * (From here on out "option" will refer to both "regular" options and flags.
+ * In cases where the distinction matters, we'll use "non-flag option".)
+ *
+ * Options may have an optional single-character abbreviation:
+ *
+ *     parser.addOption('mode', abbr: 'm');
+ *     parser.addFlag('verbose', abbr: 'v');
+ *
+ * They may also specify a default value. The default value will be used if the
+ * option isn't provided:
+ *
+ *     parser.addOption('mode', defaultsTo: 'debug');
+ *     parser.addFlag('verbose', defaultsTo: false);
+ *
+ * The default value for non-flag options can be any [String]. For flags, it
+ * must be a [bool].
+ *
+ * To validate non-flag options, you may provide an allowed set of values. When
+ * you do, it will throw a [FormatException] when you parse the arguments if
+ * the value for an option is not in the allowed set:
+ *
+ *     parser.addOption('mode', allowed: ['debug', 'release']);
+ *
+ * You can provide a callback when you define an option. When you later parse
+ * a set of arguments, the callback for that option will be invoked with the
+ * value provided for it:
+ *
+ *     parser.addOption('mode', callback: (mode) => print('Got mode $mode));
+ *     parser.addFlag('verbose', callback: (verbose) {
+ *       if (verbose) print('Verbose');
+ *     });
+ *
+ * The callback for each option will *always* be called when you parse a set of
+ * arguments. If the option isn't provided in the args, the callback will be
+ * passed the default value, or `null` if there is none set.
+ *
+ * ## Parsing arguments ##
+ *
+ * Once you have an [ArgParser] set up with some options and flags, you use it
+ * by calling [ArgParser.parse()] with a set of arguments:
+ *
+ *     var results = parser.parse(['some', 'command', 'line', 'args']);
+ *
+ * These will usually come from `new Options().arguments`, but you can pass in
+ * any list of strings. It returns an instance of [ArgResults]. This is a
+ * map-like object that will return the value of any parsed option.
+ *
+ *     var parser = new ArgParser();
+ *     parser.addOption('mode');
+ *     parser.addFlag('verbose', defaultsTo: true);
+ *     var results = parser.parse('['--mode', 'debug', 'something', 'else']);
+ *
+ *     print(results['mode']); // debug
+ *     print(results['verbose']); // true
+ *
+ * The [parse()] method will stop as soon as it reaches `--` or anything that
+ * it doesn't recognize as an option, flag, or option value. If there are still
+ * arguments left, they will be provided to you in
+ * [ArgResults.rest].
+ *
+ *     print(results.rest); // ['something', 'else']
+ *
+ * ## Specifying options ##
+ *
+ * To actually pass in options and flags on the command line, use GNU or POSIX
+ * style. If you define an option like:
+ *
+ *     parser.addOption('name', abbr: 'n');
+ *
+ * Then a value for it can be specified on the command line using any of:
+ *
+ *     --name=somevalue
+ *     --name somevalue
+ *     -nsomevalue
+ *     -n somevalue
+ *
+ * Given this flag:
+ *
+ *     parser.addFlag('name', abbr: 'n');
+ *
+ * You can set it on using one of:
+ *
+ *     --name
+ *     -n
+ *
+ * Or set it off using:
+ *
+ *     --no-name
+ *
+ * Multiple flag abbreviation can also be collapsed into a single argument. If
+ * you define:
+ *
+ *     parser.addFlag('verbose', abbr: 'v');
+ *     parser.addFlag('french', abbr: 'f');
+ *     parser.addFlag('iambic-pentameter', abbr: 'i');
+ *
+ * Then all three flags could be set using:
+ *
+ *     -vfi
+ *
+ * By default, an option has only a single value, with later option values
+ * overriding earlier ones; for example:
+ *
+ *     var parser = new ArgParser();
+ *     parser.addOption('mode');
+ *     var results = parser.parse(['--mode', 'on', '--mode', 'off']);
+ *     print(results['mode']); // prints 'off'
+ *
+ * If you need multiple values, set the [allowMultiple] flag. In that
+ * case the option can occur multiple times and when parsing arguments a
+ * List of values will be returned:
+ *
+ *     var parser = new ArgParser();
+ *     parser.addOption('mode', allowMultiple: true);
+ *     var results = parser.parse(['--mode', 'on', '--mode', 'off']);
+ *     print(results['mode']); // prints '[on, off]'
+ *
+ * ## Defining commands ##
+ *
+ * In addition to *options*, you can also define *commands*. A command is a
+ * named argument that has its own set of options. For example, when you run:
+ *
+ *     $ git commit -a
+ *
+ * The executable is `git`, the command is `commit`, and the `-a` option is an
+ * option passed to the command. You can add a command like so:
+ *
+ *     var parser = new ArgParser();
+ *     var command = parser.addCommand("commit");
+ *     command.addFlag('all', abbr: 'a');
+ *
+ * It returns another [ArgParser] which you can use to define options and
+ * subcommands on that command. When an argument list is parsed, you can then
+ * determine which command was entered and what options were provided for it.
+ *
+ *     var results = parser.parse(['commit', '-a']);
+ *     print(results.command.name); // "commit"
+ *     print(results.command['a']); // true
+ *
+ * ## Displaying usage ##
+ *
+ * This library can also be used to automatically generate nice usage help
+ * text like you get when you run a program with `--help`. To use this, you
+ * will also want to provide some help text when you create your options. To
+ * define help text for the entire option, do:
+ *
+ *     parser.addOption('mode', help: 'The compiler configuration',
+ *         allowed: ['debug', 'release']);
+ *     parser.addFlag('verbose', help: 'Show additional diagnostic info');
+ *
+ * For non-flag options, you can also provide detailed help for each expected
+ * value using a map:
+ *
+ *     parser.addOption('arch', help: 'The architecture to compile for',
+ *         allowedHelp: {
+ *           'ia32': 'Intel x86',
+ *           'arm': 'ARM Holding 32-bit chip'
+ *         });
+ *
+ * If you define a set of options like the above, then calling this:
+ *
+ *     print(parser.getUsage());
+ *
+ * Will display something like:
+ *
+ *     --mode            The compiler configuration
+ *                       [debug, release]
+ *
+ *     --[no-]verbose    Show additional diagnostic info
+ *     --arch            The architecture to compile for
+ *
+ *           [arm]       ARM Holding 32-bit chip
+ *           [ia32]      Intel x86
+ *
+ * To assist the formatting of the usage help, single line help text will
+ * be followed by a single new line. Options with multi-line help text
+ * will be followed by two new lines. This provides spatial diversity between
+ * options.
+ *
+ * [posix]: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02
+ * [gnu]: http://www.gnu.org/prep/standards/standards.html#Command_002dLine-Interfaces
+ */
+library args;
+
+import 'src/parser.dart';
+import 'src/usage.dart';
+
+/**
+ * A class for taking a list of raw command line arguments and parsing out
+ * options and flags from them.
+ */
+class ArgParser {
+  /**
+   * The options that have been defined for this parser.
+   */
+  final Map<String, Option> options = <String, Option>{};
+
+  /**
+   * The commands that have been defined for this parser.
+   */
+  final Map<String, ArgParser> commands = <String, ArgParser>{};
+
+  /** Creates a new ArgParser. */
+  ArgParser();
+
+  /**
+   * Defines a command. A command is a named argument which may in turn
+   * define its own options and subcommands. Returns an [ArgParser] that can
+   * be used to define the command's options.
+   */
+  ArgParser addCommand(String name) {
+    // Make sure the name isn't in use.
+    if (commands.containsKey(name)) {
+      throw new ArgumentError('Duplicate command "$name".');
+    }
+
+    var command = new ArgParser();
+    commands[name] = command;
+    return command;
+  }
+
+  /**
+   * Defines a flag. Throws an [ArgumentError] if:
+   *
+   * * There is already an option named [name].
+   * * There is already an option using abbreviation [abbr].
+   */
+  void addFlag(String name, {String abbr, String help, bool defaultsTo: false,
+      bool negatable: true, void callback(bool value)}) {
+    _addOption(name, abbr, help, null, null, defaultsTo, callback,
+        isFlag: true, negatable: negatable);
+  }
+
+  /**
+   * Defines a value-taking option. Throws an [ArgumentError] if:
+   *
+   * * There is already an option with name [name].
+   * * There is already an option using abbreviation [abbr].
+   */
+  void addOption(String name, {String abbr, String help, List<String> allowed,
+      Map<String, String> allowedHelp, String defaultsTo,
+      void callback(value), bool allowMultiple: false}) {
+    _addOption(name, abbr, help, allowed, allowedHelp, defaultsTo,
+        callback, isFlag: false, allowMultiple: allowMultiple);
+  }
+
+  void _addOption(String name, String abbr, String help, List<String> allowed,
+      Map<String, String> allowedHelp, defaultsTo,
+      void callback(value), {bool isFlag, bool negatable: false,
+      bool allowMultiple: false}) {
+    // Make sure the name isn't in use.
+    if (options.containsKey(name)) {
+      throw new ArgumentError('Duplicate option "$name".');
+    }
+
+    // Make sure the abbreviation isn't too long or in use.
+    if (abbr != null) {
+      if (abbr.length > 1) {
+        throw new ArgumentError(
+            'Abbreviation "$abbr" is longer than one character.');
+      }
+
+      var existing = findByAbbreviation(abbr);
+      if (existing != null) {
+        throw new ArgumentError(
+            'Abbreviation "$abbr" is already used by "${existing.name}".');
+      }
+    }
+
+    options[name] = new Option(name, abbr, help, allowed, allowedHelp,
+        defaultsTo, callback, isFlag: isFlag, negatable: negatable,
+        allowMultiple: allowMultiple);
+  }
+
+  /**
+   * Parses [args], a list of command-line arguments, matches them against the
+   * flags and options defined by this parser, and returns the result.
+   */
+  ArgResults parse(List<String> args) =>
+      new Parser(null, this, args.toList()).parse();
+
+  /**
+   * Generates a string displaying usage information for the defined options.
+   * This is basically the help text shown on the command line.
+   */
+  String getUsage() => new Usage(this).generate();
+
+  /**
+   * Get the default value for an option. Useful after parsing to test
+   * if the user specified something other than the default.
+   */
+  getDefault(String option) {
+    if (!options.containsKey(option)) {
+      throw new ArgumentError('No option named $option');
+    }
+    return options[option].defaultValue;
+  }
+
+  /**
+   * Finds the option whose abbreviation is [abbr], or `null` if no option has
+   * that abbreviation.
+   */
+  Option findByAbbreviation(String abbr) {
+    return options.values.firstMatching((option) => option.abbreviation == abbr,
+        orElse: () => null);
+  }
+}
+
+/**
+ * A command-line option. Includes both flags and options which take a value.
+ */
+class Option {
+  final String name;
+  final String abbreviation;
+  final List allowed;
+  final defaultValue;
+  final Function callback;
+  final String help;
+  final Map<String, String> allowedHelp;
+  final bool isFlag;
+  final bool negatable;
+  final bool allowMultiple;
+
+  Option(this.name, this.abbreviation, this.help, this.allowed,
+      this.allowedHelp, this.defaultValue, this.callback, {this.isFlag,
+      this.negatable, this.allowMultiple: false});
+}
+
+/**
+ * The results of parsing a series of command line arguments using
+ * [ArgParser.parse()]. Includes the parsed options and any remaining unparsed
+ * command line arguments.
+ */
+class ArgResults {
+  final Map _options;
+
+  /**
+   * If these are the results for parsing a command's options, this will be
+   * the name of the command. For top-level results, this returns `null`.
+   */
+  final String name;
+
+  /**
+   * The command that was selected, or `null` if none was. This will contain
+   * the options that were selected for that command.
+   */
+  final ArgResults command;
+
+  /**
+   * The remaining command-line arguments that were not parsed as options or
+   * flags. If `--` was used to separate the options from the remaining
+   * arguments, it will not be included in this list.
+   */
+  final List<String> rest;
+
+  /** Creates a new [ArgResults]. */
+  ArgResults(this._options, this.name, this.command, this.rest);
+
+  /** Gets the parsed command-line option named [name]. */
+  operator [](String name) {
+    if (!_options.containsKey(name)) {
+      throw new ArgumentError(
+          'Could not find an option named "$name".');
+    }
+
+    return _options[name];
+  }
+
+  /** Get the names of the options as a [Collection]. */
+  Collection<String> get options => _options.keys.toList();
+}
+
diff --git a/tools/testing/dart/vendored_pkg/args/src/parser.dart b/tools/testing/dart/vendored_pkg/args/src/parser.dart
new file mode 100644
index 0000000..d35f9ea
--- /dev/null
+++ b/tools/testing/dart/vendored_pkg/args/src/parser.dart
@@ -0,0 +1,281 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library args.src.parser;
+
+import '../args.dart';
+
+final _SOLO_OPT = new RegExp(r'^-([a-zA-Z0-9])$');
+final _ABBR_OPT = new RegExp(r'^-([a-zA-Z0-9]+)(.*)$');
+final _LONG_OPT = new RegExp(r'^--([a-zA-Z\-_0-9]+)(=(.*))?$');
+
+/**
+ * The actual parsing class. Unlike [ArgParser] which is really more an "arg
+ * grammar", this is the class that does the parsing and holds the mutable
+ * state required during a parse.
+ */
+class Parser {
+  /**
+   * If parser is parsing a command's options, this will be the name of the
+   * command. For top-level results, this returns `null`.
+   */
+  final String commandName;
+
+  /**
+   * The parser for the supercommand of this command parser, or `null` if this
+   * is the top-level parser.
+   */
+  final Parser parent;
+
+  /** The grammar being parsed. */
+  final ArgParser grammar;
+
+  /** The arguments being parsed. */
+  final List<String> args;
+
+  /** The accumulated parsed options. */
+  final Map results = {};
+
+  Parser(this.commandName, this.grammar, this.args, [this.parent]);
+
+  /** The current argument being parsed. */
+  String get current => args[0];
+
+  /** Parses the arguments. This can only be called once. */
+  ArgResults parse() {
+    var commandResults = null;
+
+    // Initialize flags to their defaults.
+    grammar.options.forEach((name, option) {
+      if (option.allowMultiple) {
+        results[name] = [];
+      } else {
+        results[name] = option.defaultValue;
+      }
+    });
+
+    // Parse the args.
+    while (args.length > 0) {
+      if (current == '--') {
+        // Reached the argument terminator, so stop here.
+        args.removeAt(0);
+        break;
+      }
+
+      // Try to parse the current argument as a command. This happens before
+      // options so that commands can have option-like names.
+      var command = grammar.commands[current];
+      if (command != null) {
+        var commandName = args.removeAt(0);
+        var commandParser = new Parser(commandName, command, args, this);
+        commandResults = commandParser.parse();
+        continue;
+      }
+
+      // Try to parse the current argument as an option. Note that the order
+      // here matters.
+      if (parseSoloOption()) continue;
+      if (parseAbbreviation(this)) continue;
+      if (parseLongOption()) continue;
+
+      // If we got here, the argument doesn't look like an option, so stop.
+      break;
+    }
+
+    // Set unspecified multivalued arguments to their default value,
+    // if any, and invoke the callbacks.
+    grammar.options.forEach((name, option) {
+      if (option.allowMultiple &&
+          results[name].length == 0 &&
+          option.defaultValue != null) {
+        results[name].add(option.defaultValue);
+      }
+      if (option.callback != null) option.callback(results[name]);
+    });
+
+    // Add in the leftover arguments we didn't parse to the innermost command.
+    var rest = args.toList();
+    args.clear();
+    return new ArgResults(results, commandName, commandResults, rest);
+  }
+
+  /**
+   * Pulls the value for [option] from the second argument in [args]. Validates
+   * that there is a valid value there.
+   */
+  void readNextArgAsValue(Option option) {
+    // Take the option argument from the next command line arg.
+    validate(args.length > 0,
+        'Missing argument for "${option.name}".');
+
+    // Make sure it isn't an option itself.
+    validate(!_ABBR_OPT.hasMatch(current) && !_LONG_OPT.hasMatch(current),
+        'Missing argument for "${option.name}".');
+
+    setOption(results, option, current);
+    args.removeAt(0);
+  }
+
+  /**
+   * Tries to parse the current argument as a "solo" option, which is a single
+   * hyphen followed by a single letter. We treat this differently than
+   * collapsed abbreviations (like "-abc") to handle the possible value that
+   * may follow it.
+   */
+  bool parseSoloOption() {
+    var soloOpt = _SOLO_OPT.firstMatch(current);
+    if (soloOpt == null) return false;
+
+    var option = grammar.findByAbbreviation(soloOpt[1]);
+    if (option == null) {
+      // Walk up to the parent command if possible.
+      validate(parent != null,
+          'Could not find an option or flag "-${soloOpt[1]}".');
+      return parent.parseSoloOption();
+    }
+
+    args.removeAt(0);
+
+    if (option.isFlag) {
+      setOption(results, option, true);
+    } else {
+      readNextArgAsValue(option);
+    }
+
+    return true;
+  }
+
+  /**
+   * Tries to parse the current argument as a series of collapsed abbreviations
+   * (like "-abc") or a single abbreviation with the value directly attached
+   * to it (like "-mrelease").
+   */
+  bool parseAbbreviation(Parser innermostCommand) {
+    var abbrOpt = _ABBR_OPT.firstMatch(current);
+    if (abbrOpt == null) return false;
+
+    // If the first character is the abbreviation for a non-flag option, then
+    // the rest is the value.
+    var c = abbrOpt[1].substring(0, 1);
+    var first = grammar.findByAbbreviation(c);
+    if (first == null) {
+      // Walk up to the parent command if possible.
+      validate(parent != null,
+          'Could not find an option with short name "-$c".');
+      return parent.parseAbbreviation(innermostCommand);
+    } else if (!first.isFlag) {
+      // The first character is a non-flag option, so the rest must be the
+      // value.
+      var value = '${abbrOpt[1].substring(1)}${abbrOpt[2]}';
+      setOption(results, first, value);
+    } else {
+      // If we got some non-flag characters, then it must be a value, but
+      // if we got here, it's a flag, which is wrong.
+      validate(abbrOpt[2] == '',
+        'Option "-$c" is a flag and cannot handle value '
+        '"${abbrOpt[1].substring(1)}${abbrOpt[2]}".');
+
+      // Not an option, so all characters should be flags.
+      // We use "innermostCommand" here so that if a parent command parses the
+      // *first* letter, subcommands can still be found to parse the other
+      // letters.
+      for (var i = 0; i < abbrOpt[1].length; i++) {
+        var c = abbrOpt[1].substring(i, i + 1);
+        innermostCommand.parseShortFlag(c);
+      }
+    }
+
+    args.removeAt(0);
+    return true;
+  }
+
+  void parseShortFlag(String c) {
+    var option = grammar.findByAbbreviation(c);
+    if (option == null) {
+      // Walk up to the parent command if possible.
+      validate(parent != null,
+          'Could not find an option with short name "-$c".');
+      parent.parseShortFlag(c);
+      return;
+    }
+
+    // In a list of short options, only the first can be a non-flag. If
+    // we get here we've checked that already.
+    validate(option.isFlag,
+        'Option "-$c" must be a flag to be in a collapsed "-".');
+
+    setOption(results, option, true);
+  }
+
+  /**
+   * Tries to parse the current argument as a long-form named option, which
+   * may include a value like "--mode=release" or "--mode release".
+   */
+  bool parseLongOption() {
+    var longOpt = _LONG_OPT.firstMatch(current);
+    if (longOpt == null) return false;
+
+    var name = longOpt[1];
+    var option = grammar.options[name];
+    if (option != null) {
+      args.removeAt(0);
+      if (option.isFlag) {
+        validate(longOpt[3] == null,
+            'Flag option "$name" should not be given a value.');
+
+        setOption(results, option, true);
+      } else if (longOpt[3] != null) {
+        // We have a value like --foo=bar.
+        setOption(results, option, longOpt[3]);
+      } else {
+        // Option like --foo, so look for the value as the next arg.
+        readNextArgAsValue(option);
+      }
+    } else if (name.startsWith('no-')) {
+      // See if it's a negated flag.
+      name = name.substring('no-'.length);
+      option = grammar.options[name];
+      if (option == null) {
+        // Walk up to the parent command if possible.
+        validate(parent != null, 'Could not find an option named "$name".');
+        return parent.parseLongOption();
+      }
+
+      args.removeAt(0);
+      validate(option.isFlag, 'Cannot negate non-flag option "$name".');
+      validate(option.negatable, 'Cannot negate option "$name".');
+
+      setOption(results, option, false);
+    } else {
+      // Walk up to the parent command if possible.
+      validate(parent != null, 'Could not find an option named "$name".');
+      return parent.parseLongOption();
+    }
+
+    return true;
+  }
+
+  /**
+   * Called during parsing to validate the arguments. Throws a
+   * [FormatException] if [condition] is `false`.
+   */
+  validate(bool condition, String message) {
+    if (!condition) throw new FormatException(message);
+  }
+
+  /** Validates and stores [value] as the value for [option]. */
+  setOption(Map results, Option option, value) {
+    // See if it's one of the allowed values.
+    if (option.allowed != null) {
+      validate(option.allowed.any((allow) => allow == value),
+          '"$value" is not an allowed value for option "${option.name}".');
+    }
+
+    if (option.allowMultiple) {
+      results[option.name].add(value);
+    } else {
+      results[option.name] = value;
+    }
+  }
+}
diff --git a/tools/testing/dart/vendored_pkg/args/src/usage.dart b/tools/testing/dart/vendored_pkg/args/src/usage.dart
new file mode 100644
index 0000000..72525e2
--- /dev/null
+++ b/tools/testing/dart/vendored_pkg/args/src/usage.dart
@@ -0,0 +1,238 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library args.src.usage;
+
+import 'dart:math';
+
+import '../args.dart';
+
+/**
+ * Takes an [ArgParser] and generates a string of usage (i.e. help) text for its
+ * defined options. Internally, it works like a tabular printer. The output is
+ * divided into three horizontal columns, like so:
+ *
+ *     -h, --help  Prints the usage information
+ *     |  |        |                                 |
+ *
+ * It builds the usage text up one column at a time and handles padding with
+ * spaces and wrapping to the next line to keep the cells correctly lined up.
+ */
+class Usage {
+  static const NUM_COLUMNS = 3; // Abbreviation, long name, help.
+
+  /** The parser this is generating usage for. */
+  final ArgParser args;
+
+  /** The working buffer for the generated usage text. */
+  StringBuffer buffer;
+
+  /**
+   * The column that the "cursor" is currently on. If the next call to
+   * [write()] is not for this column, it will correctly handle advancing to
+   * the next column (and possibly the next row).
+   */
+  int currentColumn = 0;
+
+  /** The width in characters of each column. */
+  List<int> columnWidths;
+
+  /**
+   * The number of sequential lines of text that have been written to the last
+   * column (which shows help info). We track this so that help text that spans
+   * multiple lines can be padded with a blank line after it for separation.
+   * Meanwhile, sequential options with single-line help will be compacted next
+   * to each other.
+   */
+  int numHelpLines = 0;
+
+  /**
+   * How many newlines need to be rendered before the next bit of text can be
+   * written. We do this lazily so that the last bit of usage doesn't have
+   * dangling newlines. We only write newlines right *before* we write some
+   * real content.
+   */
+  int newlinesNeeded = 0;
+
+  Usage(this.args);
+
+  /**
+   * Generates a string displaying usage information for the defined options.
+   * This is basically the help text shown on the command line.
+   */
+  String generate() {
+    buffer = new StringBuffer();
+
+    calculateColumnWidths();
+
+    args.options.forEach((name, option) {
+      write(0, getAbbreviation(option));
+      write(1, getLongOption(option));
+
+      if (option.help != null) write(2, option.help);
+
+      if (option.allowedHelp != null) {
+        var allowedNames = option.allowedHelp.keys.toList();
+        allowedNames.sort();
+        newline();
+        for (var name in allowedNames) {
+          write(1, getAllowedTitle(name));
+          write(2, option.allowedHelp[name]);
+        }
+        newline();
+      } else if (option.allowed != null) {
+        write(2, buildAllowedList(option));
+      } else if (option.defaultValue != null) {
+        if (option.isFlag && option.defaultValue == true) {
+          write(2, '(defaults to on)');
+        } else if (!option.isFlag) {
+          write(2, '(defaults to "${option.defaultValue}")');
+        }
+      }
+
+      // If any given option displays more than one line of text on the right
+      // column (i.e. help, default value, allowed options, etc.) then put a
+      // blank line after it. This gives space where it's useful while still
+      // keeping simple one-line options clumped together.
+      if (numHelpLines > 1) newline();
+    });
+
+    return buffer.toString();
+  }
+
+  String getAbbreviation(Option option) {
+    if (option.abbreviation != null) {
+      return '-${option.abbreviation}, ';
+    } else {
+      return '';
+    }
+  }
+
+  String getLongOption(Option option) {
+    if (option.negatable) {
+      return '--[no-]${option.name}';
+    } else {
+      return '--${option.name}';
+    }
+  }
+
+  String getAllowedTitle(String allowed) {
+    return '      [$allowed]';
+  }
+
+  void calculateColumnWidths() {
+    int abbr = 0;
+    int title = 0;
+    args.options.forEach((name, option) {
+      // Make room in the first column if there are abbreviations.
+      abbr = max(abbr, getAbbreviation(option).length);
+
+      // Make room for the option.
+      title = max(title, getLongOption(option).length);
+
+      // Make room for the allowed help.
+      if (option.allowedHelp != null) {
+        for (var allowed in option.allowedHelp.keys) {
+          title = max(title, getAllowedTitle(allowed).length);
+        }
+      }
+    });
+
+    // Leave a gutter between the columns.
+    title += 4;
+    columnWidths = [abbr, title];
+  }
+
+  newline() {
+    newlinesNeeded++;
+    currentColumn = 0;
+    numHelpLines = 0;
+  }
+
+  write(int column, String text) {
+    var lines = text.split('\n');
+
+    // Strip leading and trailing empty lines.
+    while (lines.length > 0 && lines[0].trim() == '') {
+      lines.removeRange(0, 1);
+    }
+
+    while (lines.length > 0 && lines[lines.length - 1].trim() == '') {
+      lines.removeLast();
+    }
+
+    for (var line in lines) {
+      writeLine(column, line);
+    }
+  }
+
+  writeLine(int column, String text) {
+    // Write any pending newlines.
+    while (newlinesNeeded > 0) {
+      buffer.add('\n');
+      newlinesNeeded--;
+    }
+
+    // Advance until we are at the right column (which may mean wrapping around
+    // to the next line.
+    while (currentColumn != column) {
+      if (currentColumn < NUM_COLUMNS - 1) {
+        buffer.add(padRight('', columnWidths[currentColumn]));
+      } else {
+        buffer.add('\n');
+      }
+      currentColumn = (currentColumn + 1) % NUM_COLUMNS;
+    }
+
+    if (column < columnWidths.length) {
+      // Fixed-size column, so pad it.
+      buffer.add(padRight(text, columnWidths[column]));
+    } else {
+      // The last column, so just write it.
+      buffer.add(text);
+    }
+
+    // Advance to the next column.
+    currentColumn = (currentColumn + 1) % NUM_COLUMNS;
+
+    // If we reached the last column, we need to wrap to the next line.
+    if (column == NUM_COLUMNS - 1) newlinesNeeded++;
+
+    // Keep track of how many consecutive lines we've written in the last
+    // column.
+    if (column == NUM_COLUMNS - 1) {
+      numHelpLines++;
+    } else {
+      numHelpLines = 0;
+    }
+  }
+
+  buildAllowedList(Option option) {
+    var allowedBuffer = new StringBuffer();
+    allowedBuffer.add('[');
+    bool first = true;
+    for (var allowed in option.allowed) {
+      if (!first) allowedBuffer.add(', ');
+      allowedBuffer.add(allowed);
+      if (allowed == option.defaultValue) {
+        allowedBuffer.add(' (default)');
+      }
+      first = false;
+    }
+    allowedBuffer.add(']');
+    return allowedBuffer.toString();
+  }
+}
+
+/** Pads [source] to [length] by adding spaces at the end. */
+String padRight(String source, int length) {
+  final result = new StringBuffer();
+  result.add(source);
+
+  while (result.length < length) {
+    result.add(' ');
+  }
+
+  return result.toString();
+}
\ No newline at end of file
diff --git a/tools/testing/dart/vendored_pkg/path/path.dart b/tools/testing/dart/vendored_pkg/path/path.dart
new file mode 100644
index 0000000..f27d558
--- /dev/null
+++ b/tools/testing/dart/vendored_pkg/path/path.dart
@@ -0,0 +1,689 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A comprehensive, cross-platform path manipulation library.
+library path;
+
+import 'dart:io' as io;
+
+/// An internal builder for the current OS so we can provide a straight
+/// functional interface and not require users to create one.
+final _builder = new Builder();
+
+/// Gets the path to the current working directory.
+String get current => new io.Directory.current().path;
+
+/// Gets the path separator for the current platform. On Mac and Linux, this
+/// is `/`. On Windows, it's `\`.
+String get separator => _builder.separator;
+
+/// Converts [path] to an absolute path by resolving it relative to the current
+/// working directory. If [path] is already an absolute path, just returns it.
+///
+///     path.absolute('foo/bar.txt'); // -> /your/current/dir/foo/bar.txt
+String absolute(String path) => join(current, path);
+
+/// Gets the part of [path] after the last separator.
+///
+///     path.basename('path/to/foo.dart'); // -> 'foo.dart'
+///     path.basename('path/to');          // -> 'to'
+///
+/// Trailing separators are ignored.
+///
+///     builder.dirname('path/to/'); // -> 'to'
+String basename(String path) => _builder.basename(path);
+
+/// Gets the part of [path] after the last separator, and without any trailing
+/// file extension.
+///
+///     path.basenameWithoutExtension('path/to/foo.dart'); // -> 'foo'
+///
+/// Trailing separators are ignored.
+///
+///     builder.dirname('path/to/foo.dart/'); // -> 'foo'
+String basenameWithoutExtension(String path) =>
+    _builder.basenameWithoutExtension(path);
+
+/// Gets the part of [path] before the last separator.
+///
+///     path.dirname('path/to/foo.dart'); // -> 'path/to'
+///     path.dirname('path/to');          // -> 'to'
+///
+/// Trailing separators are ignored.
+///
+///     builder.dirname('path/to/'); // -> 'path'
+String dirname(String path) => _builder.dirname(path);
+
+/// Gets the file extension of [path]: the portion of [basename] from the last
+/// `.` to the end (including the `.` itself).
+///
+///     path.extension('path/to/foo.dart');    // -> '.dart'
+///     path.extension('path/to/foo');         // -> ''
+///     path.extension('path.to/foo');         // -> ''
+///     path.extension('path/to/foo.dart.js'); // -> '.js'
+///
+/// If the file name starts with a `.`, then that is not considered the
+/// extension:
+///
+///     path.extension('~/.bashrc');    // -> ''
+///     path.extension('~/.notes.txt'); // -> '.txt'
+String extension(String path) => _builder.extension(path);
+
+// TODO(nweiz): add a UNC example for Windows once issue 7323 is fixed.
+/// Returns the root of [path], if it's absolute, or the empty string if it's
+/// relative.
+///
+///     // Unix
+///     path.rootPrefix('path/to/foo'); // -> ''
+///     path.rootPrefix('/path/to/foo'); // -> '/'
+///
+///     // Windows
+///     path.rootPrefix(r'path\to\foo'); // -> ''
+///     path.rootPrefix(r'C:\path\to\foo'); // -> r'C:\'
+String rootPrefix(String path) => _builder.rootPrefix(path);
+
+/// Returns `true` if [path] is an absolute path and `false` if it is a
+/// relative path. On POSIX systems, absolute paths start with a `/` (forward
+/// slash). On Windows, an absolute path starts with `\\`, or a drive letter
+/// followed by `:/` or `:\`.
+bool isAbsolute(String path) => _builder.isAbsolute(path);
+
+/// Returns `true` if [path] is a relative path and `false` if it is absolute.
+/// On POSIX systems, absolute paths start with a `/` (forward slash). On
+/// Windows, an absolute path starts with `\\`, or a drive letter followed by
+/// `:/` or `:\`.
+bool isRelative(String path) => _builder.isRelative(path);
+
+/// Joins the given path parts into a single path using the current platform's
+/// [separator]. Example:
+///
+///     path.join('path', 'to', 'foo'); // -> 'path/to/foo'
+///
+/// If any part ends in a path separator, then a redundant separator will not
+/// be added:
+///
+///     path.join('path/', 'to', 'foo'); // -> 'path/to/foo
+///
+/// If a part is an absolute path, then anything before that will be ignored:
+///
+///     path.join('path', '/to', 'foo'); // -> '/to/foo'
+String join(String part1, [String part2, String part3, String part4,
+            String part5, String part6, String part7, String part8]) =>
+  _builder.join(part1, part2, part3, part4, part5, part6, part7, part8);
+
+// TODO(nweiz): add a UNC example for Windows once issue 7323 is fixed.
+/// Splits [path] into its components using the current platform's [separator].
+///
+///     path.split('path/to/foo'); // -> ['path', 'to', 'foo']
+///
+/// The path will *not* be normalized before splitting.
+///
+///     path.split('path/../foo'); // -> ['path', '..', 'foo']
+///
+/// If [path] is absolute, the root directory will be the first element in the
+/// array. Example:
+///
+///     // Unix
+///     path.split('/path/to/foo'); // -> ['/', 'path', 'to', 'foo']
+///
+///     // Windows
+///     path.split(r'C:\path\to\foo'); // -> [r'C:\', 'path', 'to', 'foo']
+List<String> split(String path) => _builder.split(path);
+
+/// Normalizes [path], simplifying it by handling `..`, and `.`, and
+/// removing redundant path separators whenever possible.
+///
+///     path.normalize('path/./to/..//file.text'); // -> 'path/file.txt'
+String normalize(String path) => _builder.normalize(path);
+
+/// Attempts to convert [path] to an equivalent relative path from the current
+/// directory.
+///
+///     // Given current directory is /root/path:
+///     path.relative('/root/path/a/b.dart'); // -> 'a/b.dart'
+///     path.relative('/root/other.dart'); // -> '../other.dart'
+///
+/// If the [from] argument is passed, [path] is made relative to that instead.
+///
+///     path.relative('/root/path/a/b.dart',
+///         from: '/root/path'); // -> 'a/b.dart'
+///     path.relative('/root/other.dart',
+///         from: '/root/path'); // -> '../other.dart'
+///
+/// Since there is no relative path from one drive letter to another on Windows,
+/// this will return an absolute path in that case.
+///
+///     path.relative(r'D:\other', from: r'C:\home'); // -> 'D:\other'
+String relative(String path, {String from}) =>
+    _builder.relative(path, from: from);
+
+/// Removes a trailing extension from the last part of [path].
+///
+///     withoutExtension('path/to/foo.dart'); // -> 'path/to/foo'
+String withoutExtension(String path) => _builder.withoutExtension(path);
+
+/// An instantiable class for manipulating paths. Unlike the top-level
+/// functions, this lets you explicitly select what platform the paths will use.
+class Builder {
+  /// Creates a new path builder for the given style and root directory.
+  ///
+  /// If [style] is omitted, it uses the host operating system's path style. If
+  /// [root] is omitted, it defaults to the current working directory. If [root]
+  /// is relative, it is considered relative to the current working directory.
+  factory Builder({Style style, String root}) {
+    if (style == null) {
+      if (io.Platform.operatingSystem == 'windows') {
+        style = Style.windows;
+      } else {
+        style = Style.posix;
+      }
+    }
+
+    if (root == null) root = current;
+
+    return new Builder._(style, root);
+  }
+
+  Builder._(this.style, this.root);
+
+  /// The style of path that this builder works with.
+  final Style style;
+
+  /// The root directory that relative paths will be relative to.
+  final String root;
+
+  /// Gets the path separator for the builder's [style]. On Mac and Linux,
+  /// this is `/`. On Windows, it's `\`.
+  String get separator => style.separator;
+
+  /// Gets the part of [path] after the last separator on the builder's
+  /// platform.
+  ///
+  ///     builder.basename('path/to/foo.dart'); // -> 'foo.dart'
+  ///     builder.basename('path/to');          // -> 'to'
+  ///
+  /// Trailing separators are ignored.
+  ///
+  ///     builder.dirname('path/to/'); // -> 'to'
+  String basename(String path) => _parse(path).basename;
+
+  /// Gets the part of [path] after the last separator on the builder's
+  /// platform, and without any trailing file extension.
+  ///
+  ///     builder.basenameWithoutExtension('path/to/foo.dart'); // -> 'foo'
+  ///
+  /// Trailing separators are ignored.
+  ///
+  ///     builder.dirname('path/to/foo.dart/'); // -> 'foo'
+  String basenameWithoutExtension(String path) =>
+    _parse(path).basenameWithoutExtension;
+
+  /// Gets the part of [path] before the last separator.
+  ///
+  ///     builder.dirname('path/to/foo.dart'); // -> 'path/to'
+  ///     builder.dirname('path/to');          // -> 'path'
+  ///
+  /// Trailing separators are ignored.
+  ///
+  ///     builder.dirname('path/to/'); // -> 'path'
+  String dirname(String path) {
+    var parsed = _parse(path);
+    parsed.removeTrailingSeparators();
+    if (parsed.parts.isEmpty) return parsed.root == null ? '.' : parsed.root;
+    if (parsed.parts.length == 1) {
+      return parsed.root == null ? '.' : parsed.root;
+    }
+    parsed.parts.removeLast();
+    parsed.separators.removeLast();
+    parsed.removeTrailingSeparators();
+    return parsed.toString();
+  }
+
+  /// Gets the file extension of [path]: the portion of [basename] from the last
+  /// `.` to the end (including the `.` itself).
+  ///
+  ///     builder.extension('path/to/foo.dart'); // -> '.dart'
+  ///     builder.extension('path/to/foo'); // -> ''
+  ///     builder.extension('path.to/foo'); // -> ''
+  ///     builder.extension('path/to/foo.dart.js'); // -> '.js'
+  ///
+  /// If the file name starts with a `.`, then it is not considered an
+  /// extension:
+  ///
+  ///     builder.extension('~/.bashrc');    // -> ''
+  ///     builder.extension('~/.notes.txt'); // -> '.txt'
+  String extension(String path) => _parse(path).extension;
+
+  // TODO(nweiz): add a UNC example for Windows once issue 7323 is fixed.
+  /// Returns the root of [path], if it's absolute, or an empty string if it's
+  /// relative.
+  ///
+  ///     // Unix
+  ///     builder.rootPrefix('path/to/foo'); // -> ''
+  ///     builder.rootPrefix('/path/to/foo'); // -> '/'
+  ///
+  ///     // Windows
+  ///     builder.rootPrefix(r'path\to\foo'); // -> ''
+  ///     builder.rootPrefix(r'C:\path\to\foo'); // -> r'C:\'
+  String rootPrefix(String path) {
+    var root = _parse(path).root;
+    return root == null ? '' : root;
+  }
+
+  /// Returns `true` if [path] is an absolute path and `false` if it is a
+  /// relative path. On POSIX systems, absolute paths start with a `/` (forward
+  /// slash). On Windows, an absolute path starts with `\\`, or a drive letter
+  /// followed by `:/` or `:\`.
+  bool isAbsolute(String path) => _parse(path).isAbsolute;
+
+  /// Returns `true` if [path] is a relative path and `false` if it is absolute.
+  /// On POSIX systems, absolute paths start with a `/` (forward slash). On
+  /// Windows, an absolute path starts with `\\`, or a drive letter followed by
+  /// `:/` or `:\`.
+  bool isRelative(String path) => !isAbsolute(path);
+
+  /// Joins the given path parts into a single path. Example:
+  ///
+  ///     builder.join('path', 'to', 'foo'); // -> 'path/to/foo'
+  ///
+  /// If any part ends in a path separator, then a redundant separator will not
+  /// be added:
+  ///
+  ///     builder.join('path/', 'to', 'foo'); // -> 'path/to/foo
+  ///
+  /// If a part is an absolute path, then anything before that will be ignored:
+  ///
+  ///     builder.join('path', '/to', 'foo'); // -> '/to/foo'
+  ///
+  String join(String part1, [String part2, String part3, String part4,
+              String part5, String part6, String part7, String part8]) {
+    var buffer = new StringBuffer();
+    var needsSeparator = false;
+
+    var parts = [part1, part2, part3, part4, part5, part6, part7, part8];
+    for (var i = 1; i < parts.length; i++) {
+      if (parts[i] != null && parts[i - 1] == null) {
+        throw new ArgumentError("join(): part ${i - 1} was null, but part $i "
+            "was not.");
+      }
+    }
+
+    for (var part in parts) {
+      if (part == null) continue;
+
+      if (this.isAbsolute(part)) {
+        // An absolute path discards everything before it.
+        buffer.clear();
+        buffer.add(part);
+      } else {
+        if (part.length > 0 && part[0].contains(style.separatorPattern)) {
+          // The part starts with a separator, so we don't need to add one.
+        } else if (needsSeparator) {
+          buffer.add(separator);
+        }
+
+        buffer.add(part);
+      }
+
+      // Unless this part ends with a separator, we'll need to add one before
+      // the next part.
+      needsSeparator = part.length > 0 &&
+          !part[part.length - 1].contains(style.separatorPattern);
+    }
+
+    return buffer.toString();
+  }
+
+  // TODO(nweiz): add a UNC example for Windows once issue 7323 is fixed.
+  /// Splits [path] into its components using the current platform's
+  /// [separator]. Example:
+  ///
+  ///     builder.split('path/to/foo'); // -> ['path', 'to', 'foo']
+  ///
+  /// The path will *not* be normalized before splitting.
+  ///
+  ///     builder.split('path/../foo'); // -> ['path', '..', 'foo']
+  ///
+  /// If [path] is absolute, the root directory will be the first element in the
+  /// array. Example:
+  ///
+  ///     // Unix
+  ///     builder.split('/path/to/foo'); // -> ['/', 'path', 'to', 'foo']
+  ///
+  ///     // Windows
+  ///     builder.split(r'C:\path\to\foo'); // -> [r'C:\', 'path', 'to', 'foo']
+  List<String> split(String path) {
+    var parsed = _parse(path);
+    // Filter out empty parts that exist due to multiple separators in a row.
+    parsed.parts = parsed.parts.where((part) => !part.isEmpty).toList();
+    if (parsed.root != null) parsed.parts.insertRange(0, 1, parsed.root);
+    return parsed.parts;
+  }
+
+  /// Normalizes [path], simplifying it by handling `..`, and `.`, and
+  /// removing redundant path separators whenever possible.
+  ///
+  ///     builder.normalize('path/./to/..//file.text'); // -> 'path/file.txt'
+  String normalize(String path) {
+    if (path == '') return path;
+
+    var parsed = _parse(path);
+    parsed.normalize();
+    return parsed.toString();
+  }
+
+  /// Creates a new path by appending the given path parts to the [root].
+  /// Equivalent to [join()] with [root] as the first argument. Example:
+  ///
+  ///     var builder = new Builder(root: 'root');
+  ///     builder.resolve('path', 'to', 'foo'); // -> 'root/path/to/foo'
+  String resolve(String part1, [String part2, String part3, String part4,
+              String part5, String part6, String part7]) {
+    if (!?part2) return join(root, part1);
+    if (!?part3) return join(root, part1, part2);
+    if (!?part4) return join(root, part1, part2, part3);
+    if (!?part5) return join(root, part1, part2, part3, part4);
+    if (!?part6) return join(root, part1, part2, part3, part4, part5);
+    if (!?part7) return join(root, part1, part2, part3, part4, part5, part6);
+    return join(root, part1, part2, part3, part4, part5, part6, part7);
+  }
+
+  /// Attempts to convert [path] to an equivalent relative path relative to
+  /// [root].
+  ///
+  ///     var builder = new Builder(root: '/root/path');
+  ///     builder.relative('/root/path/a/b.dart'); // -> 'a/b.dart'
+  ///     builder.relative('/root/other.dart'); // -> '../other.dart'
+  ///
+  /// If the [from] argument is passed, [path] is made relative to that instead.
+  ///
+  ///     builder.relative('/root/path/a/b.dart',
+  ///         from: '/root/path'); // -> 'a/b.dart'
+  ///     builder.relative('/root/other.dart',
+  ///         from: '/root/path'); // -> '../other.dart'
+  ///
+  /// Since there is no relative path from one drive letter to another on
+  /// Windows, this will return an absolute path in that case.
+  ///
+  ///     builder.relative(r'D:\other', from: r'C:\other'); // -> 'D:\other'
+  ///
+  /// This will also return an absolute path if an absolute [path] is passed to
+  /// a builder with a relative [root].
+  ///
+  ///     var builder = new Builder(r'some/relative/path');
+  ///     builder.relative(r'/absolute/path'); // -> '/absolute/path'
+  String relative(String path, {String from}) {
+    if (path == '') return '.';
+
+    from = from == null ? root : this.join(root, from);
+
+    // We can't determine the path from a relative path to an absolute path.
+    if (this.isRelative(from) && this.isAbsolute(path)) {
+      return this.normalize(path);
+    }
+
+    // If the given path is relative, resolve it relative to the root of the
+    // builder.
+    if (this.isRelative(path)) path = this.resolve(path);
+
+    // If the path is still relative and `from` is absolute, we're unable to
+    // find a path from `from` to `path`.
+    if (this.isRelative(path) && this.isAbsolute(from)) {
+      throw new ArgumentError('Unable to find a path to "$path" from "$from".');
+    }
+
+    var fromParsed = _parse(from)..normalize();
+    var pathParsed = _parse(path)..normalize();
+
+    // If the root prefixes don't match (for example, different drive letters
+    // on Windows), then there is no relative path, so just return the absolute
+    // one. In Windows, drive letters are case-insenstive and we allow
+    // calculation of relative paths, even if a path has not been normalized.
+    if (fromParsed.root != pathParsed.root &&
+        ((fromParsed.root ==  null || pathParsed.root == null) ||
+          fromParsed.root.toLowerCase().replaceAll('/', '\\') !=
+          pathParsed.root.toLowerCase().replaceAll('/', '\\'))) {
+      return pathParsed.toString();
+    }
+
+    // Strip off their common prefix.
+    while (fromParsed.parts.length > 0 && pathParsed.parts.length > 0 &&
+           fromParsed.parts[0] == pathParsed.parts[0]) {
+      fromParsed.parts.removeAt(0);
+      fromParsed.separators.removeAt(0);
+      pathParsed.parts.removeAt(0);
+      pathParsed.separators.removeAt(0);
+    }
+
+    // If there are any directories left in the root path, we need to walk up
+    // out of them.
+    pathParsed.parts.insertRange(0, fromParsed.parts.length, '..');
+    pathParsed.separators.insertRange(0, fromParsed.parts.length,
+        style.separator);
+
+    // Corner case: the paths completely collapsed.
+    if (pathParsed.parts.length == 0) return '.';
+
+    // Make it relative.
+    pathParsed.root = '';
+    pathParsed.removeTrailingSeparators();
+
+    return pathParsed.toString();
+  }
+
+  /// Removes a trailing extension from the last part of [path].
+  ///
+  ///     builder.withoutExtension('path/to/foo.dart'); // -> 'path/to/foo'
+  String withoutExtension(String path) {
+    var parsed = _parse(path);
+
+    for (var i = parsed.parts.length - 1; i >= 0; i--) {
+      if (!parsed.parts[i].isEmpty) {
+        parsed.parts[i] = parsed.basenameWithoutExtension;
+        break;
+      }
+    }
+
+    return parsed.toString();
+  }
+
+  _ParsedPath _parse(String path) {
+    var before = path;
+
+    // Remove the root prefix, if any.
+    var root = style.getRoot(path);
+    if (root != null) path = path.substring(root.length);
+
+    // Split the parts on path separators.
+    var parts = [];
+    var separators = [];
+    var start = 0;
+    for (var match in style.separatorPattern.allMatches(path)) {
+      parts.add(path.substring(start, match.start));
+      separators.add(match[0]);
+      start = match.end;
+    }
+
+    // Add the final part, if any.
+    if (start < path.length) {
+      parts.add(path.substring(start));
+      separators.add('');
+    }
+
+    return new _ParsedPath(style, root, parts, separators);
+  }
+}
+
+/// An enum type describing a "flavor" of path.
+class Style {
+  /// POSIX-style paths use "/" (forward slash) as separators. Absolute paths
+  /// start with "/". Used by UNIX, Linux, Mac OS X, and others.
+  static final posix = new Style._('posix', '/', '/', '/');
+
+  /// Windows paths use "\" (backslash) as separators. Absolute paths start with
+  /// a drive letter followed by a colon (example, "C:") or two backslashes
+  /// ("\\") for UNC paths.
+  // TODO(rnystrom): The UNC root prefix should include the drive name too, not
+  // just the "\\".
+  static final windows = new Style._('windows', '\\', r'[/\\]',
+      r'\\\\|[a-zA-Z]:[/\\]');
+
+  Style._(this.name, this.separator, String separatorPattern,
+      String rootPattern)
+    : separatorPattern = new RegExp(separatorPattern),
+      _rootPattern = new RegExp('^$rootPattern');
+
+  /// The name of this path style. Will be "posix" or "windows".
+  final String name;
+
+  /// The path separator for this style. On POSIX, this is `/`. On Windows,
+  /// it's `\`.
+  final String separator;
+
+  /// The [Pattern] that can be used to match a separator for a path in this
+  /// style. Windows allows both "/" and "\" as path separators even though
+  /// "\" is the canonical one.
+  final Pattern separatorPattern;
+
+  // TODO(nweiz): make this a Pattern when issue 7080 is fixed.
+  /// The [RegExp] that can be used to match the root prefix of an absolute
+  /// path in this style.
+  final RegExp _rootPattern;
+
+  /// Gets the root prefix of [path] if path is absolute. If [path] is relative,
+  /// returns `null`.
+  String getRoot(String path) {
+    var match = _rootPattern.firstMatch(path);
+    if (match == null) return null;
+    return match[0];
+  }
+
+  String toString() => name;
+}
+
+// TODO(rnystrom): Make this public?
+class _ParsedPath {
+  /// The [Style] that was used to parse this path.
+  Style style;
+
+  /// The absolute root portion of the path, or `null` if the path is relative.
+  /// On POSIX systems, this will be `null` or "/". On Windows, it can be
+  /// `null`, "//" for a UNC path, or something like "C:\" for paths with drive
+  /// letters.
+  String root;
+
+  /// The path-separated parts of the path. All but the last will be
+  /// directories.
+  List<String> parts;
+
+  /// The path separators following each part. The last one will be an empty
+  /// string unless the path ends with a trailing separator.
+  List<String> separators;
+
+  /// The file extension of the last part, or "" if it doesn't have one.
+  String get extension => _splitExtension()[1];
+
+  /// `true` if this is an absolute path.
+  bool get isAbsolute => root != null;
+
+  _ParsedPath(this.style, this.root, this.parts, this.separators);
+
+  String get basename {
+    var copy = this.clone();
+    copy.removeTrailingSeparators();
+    if (copy.parts.isEmpty) return root == null ? '' : root;
+    return copy.parts.last;
+  }
+
+  String get basenameWithoutExtension {
+    var copy = this.clone();
+    copy.removeTrailingSeparators();
+    if (copy.parts.isEmpty) return root == null ? '' : root;
+    return copy._splitExtension()[0];
+  }
+
+  void removeTrailingSeparators() {
+    while (!parts.isEmpty && parts.last == '') {
+      parts.removeLast();
+      separators.removeLast();
+    }
+    if (separators.length > 0) separators[separators.length - 1] = '';
+  }
+
+  void normalize() {
+    // Handle '.', '..', and empty parts.
+    var leadingDoubles = 0;
+    var newParts = [];
+    for (var part in parts) {
+      if (part == '.' || part == '') {
+        // Do nothing. Ignore it.
+      } else if (part == '..') {
+        // Pop the last part off.
+        if (newParts.length > 0) {
+          newParts.removeLast();
+        } else {
+          // Backed out past the beginning, so preserve the "..".
+          leadingDoubles++;
+        }
+      } else {
+        newParts.add(part);
+      }
+    }
+
+    // A relative path can back out from the start directory.
+    if (!isAbsolute) {
+      newParts.insertRange(0, leadingDoubles, '..');
+    }
+
+    // If we collapsed down to nothing, do ".".
+    if (newParts.length == 0 && !isAbsolute) {
+      newParts.add('.');
+    }
+
+    // Canonicalize separators.
+    var newSeparators = [];
+    newSeparators.insertRange(0, newParts.length, style.separator);
+
+    parts = newParts;
+    separators = newSeparators;
+
+    // Normalize the Windows root if needed.
+    if (root != null && style == Style.windows) {
+      root = root.replaceAll('/', '\\');
+    }
+    removeTrailingSeparators();
+  }
+
+  String toString() {
+    var builder = new StringBuffer();
+    if (root != null) builder.add(root);
+    for (var i = 0; i < parts.length; i++) {
+      builder.add(parts[i]);
+      builder.add(separators[i]);
+    }
+
+    return builder.toString();
+  }
+
+  /// Splits the last part of the path into a two-element list. The first is
+  /// the name of the file without any extension. The second is the extension
+  /// or "" if it has none.
+  List<String> _splitExtension() {
+    if (parts.isEmpty) return ['', ''];
+
+    var file = parts.last;
+    if (file == '..') return ['..', ''];
+
+    var lastDot = file.lastIndexOf('.');
+
+    // If there is no dot, or it's the first character, like '.bashrc', it
+    // doesn't count.
+    if (lastDot <= 0) return [file, ''];
+
+    return [file.substring(0, lastDot), file.substring(lastDot)];
+  }
+
+  _ParsedPath clone() => new _ParsedPath(
+      style, root, new List.from(parts), new List.from(separators));
+}
diff --git a/utils/apidoc/apidoc.dart b/utils/apidoc/apidoc.dart
index 3f19eaa..3bcb9ee 100644
--- a/utils/apidoc/apidoc.dart
+++ b/utils/apidoc/apidoc.dart
@@ -95,14 +95,6 @@
   _diff = new HtmlDiff(printWarnings:false);
   _diff.run();
 
-  // Process handwritten HTML documentation.
-  print('Processing handwritten HTML documentation...');
-  final htmldoc = new Htmldoc();
-  htmldoc.includeApi = true;
-  htmldoc.documentLibraries(
-    <Path>[doc.scriptDir.append('../../tools/dom/doc/html.dartdoc')],
-    libPath, pkgPath);
-
   // Process libraries.
 
   // TODO(johnniwinther): Libraries for the compilation seem to be more like
@@ -138,7 +130,7 @@
 
   lister.onDone = (success) {
     print('Generating docs...');
-    final apidoc = new Apidoc(mdn, htmldoc, outputDir, mode, generateAppCache,
+    final apidoc = new Apidoc(mdn, outputDir, mode, generateAppCache,
         excludedLibraries);
     apidoc.dartdocPath =
         doc.scriptDir.append('../../sdk/lib/_internal/dartdoc/');
@@ -158,99 +150,10 @@
   };
 }
 
-/**
- * This class is purely here to scrape handwritten HTML documentation.
- * This scraped documentation will later be merged with the generated
- * HTML library.
- */
-class Htmldoc extends doc.Dartdoc {
-  doc.DocComment libraryComment;
-
-  /**
-   * Map from qualified type names to comments.
-   */
-  Map<String, doc.DocComment> typeComments;
-
-  /**
-   * Map from qualified member names to comments.
-   */
-  Map<String, doc.DocComment> memberComments;
-
-  Htmldoc() {
-    typeComments = new Map<String, doc.DocComment>();
-    memberComments = new Map<String, doc.DocComment>();
-  }
-
-  // Suppress any actual writing to file.  This is only for analysis.
-  void endFile() {
-  }
-
-  void write(String s) {
-  }
-
-  doc.DocComment getRecordedLibraryComment(LibraryMirror library) {
-    if (HTML_LIBRARY_NAMES.contains(doc.displayName(library))) {
-      return libraryComment;
-    }
-    return null;
-  }
-
-  doc.DocComment getRecordedTypeComment(TypeMirror type) {
-    if (typeComments.containsKey(type.qualifiedName)) {
-      return typeComments[type.qualifiedName];
-    }
-    return null;
-  }
-
-  doc.DocComment getRecordedMemberComment(MemberMirror member) {
-    if (memberComments.containsKey(member.qualifiedName)) {
-      return memberComments[member.qualifiedName];
-    }
-    return null;
-  }
-
-  // These methods are subclassed and used for internal processing.
-  // Do not invoke outside of this class.
-  doc.DocComment getLibraryComment(LibraryMirror library) {
-    doc.DocComment comment = super.getLibraryComment(library);
-    libraryComment = comment;
-    return comment;
-  }
-
-  doc.DocComment getTypeComment(TypeMirror type) {
-    doc.DocComment comment = super.getTypeComment(type);
-    recordTypeComment(type, comment);
-    return comment;
-  }
-
-  doc.DocComment getMemberComment(MemberMirror member) {
-    doc.DocComment comment = super.getMemberComment(member);
-    recordMemberComment(member, comment);
-    return comment;
-  }
-
-  void recordTypeComment(TypeMirror type, doc.DocComment comment) {
-    if (comment != null && comment.text.contains('@domName')) {
-      // This is not a handwritten comment.
-      return;
-    }
-    typeComments[type.qualifiedName] = comment;
-  }
-
-  void recordMemberComment(MemberMirror member, doc.DocComment comment) {
-    if (comment != null && comment.text.contains('@domName')) {
-      // This is not a handwritten comment.
-      return;
-    }
-    memberComments[member.qualifiedName] = comment;
-  }
-}
-
 class Apidoc extends doc.Dartdoc {
   /** Big ball of JSON containing the scraped MDN documentation. */
   final Map mdn;
 
-  final Htmldoc htmldoc;
 
   static const disqusShortname = 'dartapidocs';
 
@@ -267,7 +170,7 @@
    */
   String mdnUrl = null;
 
-  Apidoc(this.mdn, this.htmldoc, Path outputDir, int mode,
+  Apidoc(this.mdn, Path outputDir, int mode,
          bool generateAppCache, [excludedLibraries]) {
     if (?excludedLibraries) {
       this.excludedLibraries = excludedLibraries;
@@ -394,30 +297,21 @@
   }
 
   doc.DocComment getLibraryComment(LibraryMirror library) {
-    if (HTML_LIBRARY_NAMES.contains(doc.displayName(library))) {
-      return htmldoc.libraryComment;
-    }
     return super.getLibraryComment(library);
   }
 
   doc.DocComment getTypeComment(TypeMirror type) {
     return _mergeDocs(
-        includeMdnTypeComment(type), super.getTypeComment(type),
-        htmldoc.getRecordedTypeComment(type));
+        includeMdnTypeComment(type), super.getTypeComment(type));
   }
 
   doc.DocComment getMemberComment(MemberMirror member) {
     return _mergeDocs(
-        includeMdnMemberComment(member), super.getMemberComment(member),
-        htmldoc.getRecordedMemberComment(member));
+        includeMdnMemberComment(member), super.getMemberComment(member));
   }
 
   doc.DocComment _mergeDocs(MdnComment mdnComment,
-                            doc.DocComment fileComment,
-                            doc.DocComment handWrittenComment) {
-    // Prefer the hand-written comment first.
-    if (handWrittenComment != null) return handWrittenComment;
-
+                            doc.DocComment fileComment) {
     // Otherwise, prefer comment from the (possibly generated) Dart file.
     if (fileComment != null) return fileComment;
 
diff --git a/utils/apidoc/html_diff.dart b/utils/apidoc/html_diff.dart
index f39cb12..776ed1a 100644
--- a/utils/apidoc/html_diff.dart
+++ b/utils/apidoc/html_diff.dart
@@ -9,6 +9,8 @@
 library html_diff;
 
 import 'dart:io';
+import 'dart:async';
+import '../../sdk/lib/html/html_common/metadata.dart';
 
 // TODO(rnystrom): Use "package:" URL (#4968).
 import '../../sdk/lib/_internal/dartdoc/lib/dartdoc.dart';
@@ -33,38 +35,36 @@
  * based on two indicators:
  *
  *   1. Auto-detected wrappers. Most `dart:html` types correspond
- *      straightforwardly to a single `@domName` type, and
+ *      straightforwardly to a single `@DomName` type, and
  *      have the same name.  In addition, most `dart:html` methods
- *      just call a single `@domName` method. This class
+ *      just call a single `@DomName` method. This class
  *      detects these simple correspondences automatically.
  *
  *   2. Manual annotations. When it's not clear which
- *      `@domName` items a given `dart:html` item
+ *      `@DomName` items a given `dart:html` item
  *      corresponds to, the `dart:html` item can be annotated in the
- *      documentation comments using the `@domName` annotation.
+ *      documentation comments using the `@DomName` annotation.
  *
- * The `@domName` annotations for types and members are of the form
- * `@domName NAME(, NAME)*`, where the `NAME`s refer to the
- * `@domName` types/members that correspond to the
+ * The `@DomName` annotations for types and members are of the form
+ * `@DomName NAME(, NAME)*`, where the `NAME`s refer to the
+ * `@DomName` types/members that correspond to the
  * annotated `dart:html` type/member. `NAME`s on member annotations
  * can refer to either fully-qualified member names (e.g.
  * `Document.createElement`) or unqualified member names
  * (e.g. `createElement`).  Unqualified member names are assumed to
- * refer to members of one of the corresponding `@domName`
+ * refer to members of one of the corresponding `@DomName`
  * types.
  */
 class HtmlDiff {
   /**
    * A map from `dart:html` members to the corresponding fully qualified
-   * `@domName` member(s).
+   * `@DomName` member(s).
    */
   final Map<String, Set<String>> htmlToDom;
 
-  /** A map from `dart:html` types to corresponding `@domName` types. */
+  /** A map from `dart:html` types to corresponding `@DomName` types. */
   final Map<String, Set<String>> htmlTypesToDom;
 
-  final CommentMap comments;
-
   /** If true, then print warning messages. */
   final bool _printWarnings;
 
@@ -88,8 +88,7 @@
   HtmlDiff({bool printWarnings: false}) :
     _printWarnings = printWarnings,
     htmlToDom = new Map<String, Set<String>>(),
-    htmlTypesToDom = new Map<String, Set<String>>(),
-    comments = new CommentMap();
+    htmlTypesToDom = new Map<String, Set<String>>();
 
   void warn(String s) {
     if (_printWarnings) {
@@ -98,7 +97,7 @@
   }
 
   /**
-   * Computes the `@domName` to `dart:html` mapping, and
+   * Computes the `@DomName` to `dart:html` mapping, and
    * places it in [htmlToDom] and [htmlTypesToDom]. Before this is run, dart2js
    * should be initialized (via [parseOptions] and [initializeWorld]) and
    * [HtmlDiff.initialize] should be called.
@@ -124,9 +123,9 @@
   }
 
   /**
-   * Records the `@domName` to `dart:html` mapping for
+   * Records the `@DomName` to `dart:html` mapping for
    * [htmlMember] (from `dart:html`). [domTypes] are the
-   * `@domName` type values that correspond to [htmlMember]'s
+   * `@DomName` type values that correspond to [htmlMember]'s
    * defining type.
    */
   void _addMemberDiff(MemberMirror htmlMember, List<String> domTypes,
@@ -146,18 +145,21 @@
   }
 
   /**
-   * Returns the `@domName` type values that correspond to
+   * Returns the `@DomName` type values that correspond to
    * [htmlType] from `dart:html`. This can be the empty list if no
    * correspondence is found.
    */
   List<String> htmlToDomTypes(ClassMirror htmlType) {
-    if (htmlType.simpleName == null) return [];
-    final tags = _getTags(comments.find(htmlType.location));
-    if (tags.containsKey('domName')) {
+    if (htmlType.simpleName == null) return <String>[];
+
+    final domNameMetadata = _findMetadata(htmlType.metadata, 'DomName');
+    if (domNameMetadata != null) {
       var domNames = <String>[];
-      for (var s in tags['domName'].split(',')) {
+      var tags = deprecatedFutureValue(domNameMetadata.getField('name'));
+      for (var s in tags.reflectee.split(',')) {
         domNames.add(s.trim());
       }
+
       if (domNames.length == 1 && domNames[0] == 'none') return <String>[];
       return domNames;
     }
@@ -165,20 +167,23 @@
   }
 
   /**
-   * Returns the `@domName` member values that correspond to
+   * Returns the `@DomName` member values that correspond to
    * [htmlMember] from `dart:html`. This can be the empty set if no
    * correspondence is found.  [domTypes] are the
-   * `@domName` type values that correspond to [htmlMember]'s
+   * `@DomName` type values that correspond to [htmlMember]'s
    * defining type.
    */
   Set<String> htmlToDomMembers(MemberMirror htmlMember, List<String> domTypes) {
     if (htmlMember.isPrivate) return new Set();
-    final tags = _getTags(comments.find(htmlMember.location));
-    if (tags.containsKey('domName')) {
+
+    final domNameMetadata = _findMetadata(htmlMember.metadata, 'DomName');
+    if (domNameMetadata != null) {
       var domNames = <String>[];
-      for (var s in tags['domName'].split(',')) {
+      var tags = deprecatedFutureValue(domNameMetadata.getField('name'));
+      for (var s in tags.reflectee.split(',')) {
         domNames.add(s.trim());
       }
+
       if (domNames.length == 1 && domNames[0] == 'none') return new Set();
       final members = new Set();
       domNames.forEach((name) {
@@ -204,12 +209,12 @@
   }
 
   /**
-   * Returns the `@domName` strings that are indicated by
+   * Returns the `@DomName` strings that are indicated by
    * [name]. [name] can be either an unqualified member name
    * (e.g. `createElement`), in which case it's treated as the name of
    * a member of one of [defaultTypes], or a fully-qualified member
    * name (e.g. `Document.createElement`), in which case it's treated as a
-   * member of the @domName element (`Document` in this case).
+   * member of the @DomName element (`Document` in this case).
    */
   Set<String> _membersFromName(String name, List<String> defaultTypes) {
     if (!name.contains('.', 0)) {
@@ -229,21 +234,11 @@
     return new Set.from([name]);
   }
 
-  /**
-   * Extracts a [Map] from tag names to values from [comment], which is parsed
-   * from a Dart source file via dartdoc. Tags are of the form `@NAME VALUE`,
-   * where `NAME` is alphabetic and `VALUE` can contain any character other than
-   * `;`. Multiple tags can be separated by semicolons.
-   *
-   * At time of writing, the only tag that's used is `@domName`.
-   */
-  Map<String, String> _getTags(String comment) {
-    if (comment == null) return const <String, String>{};
-    final re = new RegExp("@([a-zA-Z]+) ([^;]+)(?:;|\$)");
-    final tags = <String, String>{};
-    for (var m in re.allMatches(comment.trim())) {
-      tags[m[1]] = m[2];
-    }
-    return tags;
-  }
+}
+
+/// Returns the metadata for the given string or null if not found.
+InstanceMirror _findMetadata(List<InstanceMirror> metadataList, String find) {
+  return metadataList.firstMatching(
+      (metadata) => metadata.type.simpleName == find,
+      orElse: () => null);
 }
diff --git a/utils/archive/Makefile b/utils/archive/Makefile
deleted file mode 100644
index 6e1892c..0000000
--- a/utils/archive/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# TODO(nweiz): replace this with a .gypi file
-
-CC = gcc
-CFLAGS = -fPIC -m32 -I ../../runtime/include/ -g
-LDFLAGS = -shared -m32 -g -larchive -Wl,-soname,libdart_archive.so
-
-all: libdart_archive.so
-
-libdart_archive.so: dart_archive.o entry.o messaging.o reader.o
-	$(CC) $(LDFLAGS) -o $@ dart_archive.o entry.o messaging.o reader.o
-
-dart_archive.o: dart_archive.c dart_archive.h
-	$(CC) $(CFLAGS) -c $<
-
-entry.o: entry.c entry.h messaging.h dart_archive.h
-	$(CC) $(CFLAGS) -c $<
-
-messaging.o: messaging.c messaging.h dart_archive.h
-	$(CC) $(CFLAGS) -c $<
-
-reader.o: reader.c reader.h entry.h messaging.h dart_archive.h
-	$(CC) $(CFLAGS) -c $<
diff --git a/utils/archive/archive.dart b/utils/archive/archive.dart
deleted file mode 100644
index 48fab29..0000000
--- a/utils/archive/archive.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * The primary library file for the archive library. This is the only file that
- * should be imported by clients.
- */
-library archive;
-
-import 'entry.dart' as entry;
-import 'reader.dart' as reader;
-
-// TODO(nweiz): Remove this when 3071 is fixed.
-/** An error raised by the archive library. */
-abstract class ArchiveException {
-  /** A description of the error that occurred. */
-  final String message;
-
-  /** The error code for the error, or null. */
-  final int errno;
-}
-
-// TODO(nweiz): Remove this when 3071 is fixed.
-/** See [reader.ArchiveReader]. */
-class ArchiveReader extends reader.ArchiveReader {}
-
-// TODO(nweiz): Remove this when 3071 is fixed.
-/** See [entry.ArchiveEntry]. */
-class ArchiveEntry extends entry.ArchiveEntry {
-  ArchiveEntry.internal(List properties, int archiveId)
-    : super.internal(properties, archiveId);
-
-  /** Create a new [ArchiveEntry] with default values for all of its fields. */
-  static Future<ArchiveEntry> create() => entry.ArchiveEntry.create();
-}
diff --git a/utils/archive/dart_archive.c b/utils/archive/dart_archive.c
deleted file mode 100644
index da284a6..0000000
--- a/utils/archive/dart_archive.c
+++ /dev/null
@@ -1,415 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "dart_archive.h"
-#include "entry.h"
-#include "messaging.h"
-#include "reader.h"
-
-/** The enumeration of request types for communicating with Dart. */
-enum RequestType {
-  kArchiveReadNew = 0,
-  kArchiveReadSupportFilterAll,
-  kArchiveReadSupportFilterBzip2,
-  kArchiveReadSupportFilterCompress,
-  kArchiveReadSupportFilterGzip,
-  kArchiveReadSupportFilterLzma,
-  kArchiveReadSupportFilterXz,
-  kArchiveReadSupportFilterProgram,
-  kArchiveReadSupportFilterProgramSignature,
-  kArchiveReadSupportFormatAll,
-  kArchiveReadSupportFormatAr,
-  kArchiveReadSupportFormatCpio,
-  kArchiveReadSupportFormatEmpty,
-  kArchiveReadSupportFormatIso9660,
-  kArchiveReadSupportFormatMtree,
-  kArchiveReadSupportFormatRaw,
-  kArchiveReadSupportFormatTar,
-  kArchiveReadSupportFormatZip,
-  kArchiveReadSetFilterOption,
-  kArchiveReadSetFormatOption,
-  kArchiveReadSetOption,
-  kArchiveReadOpenFilename,
-  kArchiveReadOpenMemory,
-  kArchiveReadNextHeader,
-  kArchiveReadDataBlock,
-  kArchiveReadDataSkip,
-  kArchiveReadClose,
-  kArchiveReadFree,
-  kArchiveEntryClone,
-  kArchiveEntryFree,
-  kArchiveEntryNew,
-  kArchiveEntrySetHardlink,
-  kArchiveEntrySetPathname,
-  kArchiveEntrySetSymlink,
-  kArchiveEntrySetGid,
-  kArchiveEntrySetUid,
-  kArchiveEntrySetPerm,
-  kArchiveEntrySetGname,
-  kArchiveEntrySetUname,
-  kArchiveEntrySetFflagsSet,
-  kArchiveEntrySetFflagsClear,
-  kArchiveEntrySetFflagsText,
-  kArchiveEntrySetFiletype,
-  kArchiveEntrySetMode,
-  kArchiveEntrySetSize,
-  kArchiveEntrySetDev,
-  kArchiveEntrySetDevmajor,
-  kArchiveEntrySetDevminor,
-  kArchiveEntrySetIno,
-  kArchiveEntrySetNlink,
-  kArchiveEntrySetRdev,
-  kArchiveEntrySetRdevmajor,
-  kArchiveEntrySetRdevminor,
-  kArchiveEntrySetAtime,
-  kArchiveEntrySetBirthtime,
-  kArchiveEntrySetCtime,
-  kArchiveEntrySetMtime,
-  kNumberOfRequestTypes
-};
-
-/**
- * Dispatches a message from Dart to its native function equivalent.
- *
- * In addition to matching up a message with its respective function, this
- * parses out the standard archive struct argument from the message and resolves
- * it to an actual pointer to an archive struct.
- */
-static void archiveDispatch(Dart_Port dest_port_id,
-                            Dart_Port reply_port_id,
-                            Dart_CObject* message) {
-  if (message->type != kArray) {
-    postInvalidArgument(reply_port_id, "Message was not an array.");
-    return;
-  } else if (message->value.as_array.length < 2) {
-    postInvalidArgument(reply_port_id, "Message array had %d elements, " \
-      "expected at least 2.", message->value.as_array.length);
-    return;
-  }
-
-  Dart_CObject* wrapped_request_type = message->value.as_array.values[0];
-  if (wrapped_request_type->type != kInt32) {
-    postInvalidArgument(reply_port_id, "Invalid request type %d.",
-      wrapped_request_type->type);
-    return;
-  }
-  enum RequestType request_type = wrapped_request_type->value.as_int32;
-
-  Dart_CObject* id = message->value.as_array.values[1];
-  void* ptr;
-  if (id->type == kNull) {
-    ptr = NULL;
-  } else if (id->type == kInt64 || id->type == kInt32) {
-    ptr = (void*) (intptr_t) getInteger(id);
-  } else {
-    postInvalidArgument(reply_port_id, "Invalid id type %d.", id->type);
-    return;
-  }
-
-  switch (request_type) {
-  case kArchiveReadNew:
-    archiveReadNew(reply_port_id);
-    break;
-  case kArchiveReadSupportFilterAll:
-    archiveReadSupportFilterAll(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadSupportFilterBzip2:
-    archiveReadSupportFilterBzip2(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadSupportFilterCompress:
-    archiveReadSupportFilterCompress(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadSupportFilterGzip:
-    archiveReadSupportFilterGzip(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadSupportFilterLzma:
-    archiveReadSupportFilterLzma(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadSupportFilterXz:
-    archiveReadSupportFilterXz(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadSupportFilterProgram:
-    archiveReadSupportFilterProgram(
-      reply_port_id, (struct archive*) ptr, message);
-    break;
-  case kArchiveReadSupportFilterProgramSignature:
-    archiveReadSupportFilterProgramSignature(
-        reply_port_id, (struct archive*) ptr, message);
-    break;
-  case kArchiveReadSupportFormatAll:
-    archiveReadSupportFormatAll(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadSupportFormatAr:
-    archiveReadSupportFormatAr(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadSupportFormatCpio:
-    archiveReadSupportFormatCpio(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadSupportFormatEmpty:
-    archiveReadSupportFormatEmpty(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadSupportFormatIso9660:
-    archiveReadSupportFormatIso9660(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadSupportFormatMtree:
-    archiveReadSupportFormatMtree(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadSupportFormatRaw:
-    archiveReadSupportFormatRaw(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadSupportFormatTar:
-    archiveReadSupportFormatTar(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadSupportFormatZip:
-    archiveReadSupportFormatZip(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadSetFilterOption:
-    archiveReadSetFilterOption(reply_port_id, (struct archive*) ptr, message);
-    break;
-  case kArchiveReadSetFormatOption:
-    archiveReadSetFormatOption(reply_port_id, (struct archive*) ptr, message);
-    break;
-  case kArchiveReadSetOption:
-    archiveReadSetOption(reply_port_id, (struct archive*) ptr, message);
-    break;
-  case kArchiveReadOpenFilename:
-    archiveReadOpenFilename(reply_port_id, (struct archive*) ptr, message);
-    break;
-  case kArchiveReadOpenMemory:
-    archiveReadOpenMemory(reply_port_id, (struct archive*) ptr, message);
-    break;
-  case kArchiveReadNextHeader:
-    archiveReadNextHeader(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadDataBlock:
-    archiveReadDataBlock(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadDataSkip:
-    archiveReadDataSkip(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadClose:
-    archiveReadClose(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveReadFree:
-    archiveReadFree(reply_port_id, (struct archive*) ptr);
-    break;
-  case kArchiveEntryClone:
-    archiveEntryClone(reply_port_id, (struct archive_entry*) ptr);
-    break;
-  case kArchiveEntryFree:
-    archiveEntryFree(reply_port_id, (struct archive_entry*) ptr);
-    break;
-  case kArchiveEntryNew:
-    archiveEntryNew(reply_port_id);
-    break;
-  case kArchiveEntrySetHardlink:
-    archiveEntrySetHardlink(
-        reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetPathname:
-    archiveEntrySetPathname(
-        reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetSymlink:
-    archiveEntrySetSymlink(reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetGid:
-    archiveEntrySetGid(reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetUid:
-    archiveEntrySetUid(reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetPerm:
-    archiveEntrySetPerm(reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetGname:
-    archiveEntrySetGname(reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetUname:
-    archiveEntrySetUname(reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetFflagsSet:
-    archiveEntrySetFflagsSet(
-        reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetFflagsClear:
-    archiveEntrySetFflagsClear(
-        reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetFiletype:
-    archiveEntrySetFiletype(
-        reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetMode:
-    archiveEntrySetMode(reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetSize:
-    archiveEntrySetSize(reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetDev:
-    archiveEntrySetDev(reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetDevmajor:
-    archiveEntrySetDevmajor(
-        reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetDevminor:
-    archiveEntrySetDevminor(
-        reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetIno:
-    archiveEntrySetIno(reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetNlink:
-    archiveEntrySetNlink(reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetRdev:
-    archiveEntrySetRdev(reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetRdevmajor:
-    archiveEntrySetRdevmajor(
-        reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetRdevminor:
-    archiveEntrySetRdevminor(
-        reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetAtime:
-    archiveEntrySetAtime(reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetBirthtime:
-    archiveEntrySetBirthtime(
-        reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetCtime:
-    archiveEntrySetCtime(reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  case kArchiveEntrySetMtime:
-    archiveEntrySetMtime(reply_port_id, (struct archive_entry*) ptr, message);
-    break;
-  default:
-    postInvalidArgument(reply_port_id, "Invalid request id %d.", request_type);
-    break;
-  }
-}
-
-/**
- * Checks if [handle] represents an error and, if so, propagates it to Dart.
- * Otherwise, returns [handle].
- */
-static Dart_Handle handleError(Dart_Handle handle) {
-  if (Dart_IsError(handle)) Dart_PropagateError(handle);
-  return handle;
-}
-
-/**
- * A function exposed to Dart that creates a [ServicePort] for two-way
- * communication between Dart and C.
- *
- * Takes no arguments and returns a [ServicePort].
- */
-static void archiveServicePort(Dart_NativeArguments arguments) {
-  Dart_EnterScope();
-  Dart_SetReturnValue(arguments, Dart_Null());
-  Dart_Port service_port =
-      Dart_NewNativePort("ArchiveService", archiveDispatch, false);
-  if (service_port != ILLEGAL_PORT) {
-    Dart_Handle send_port = handleError(Dart_NewSendPort(service_port));
-    Dart_SetReturnValue(arguments, send_port);
-  }
-  Dart_ExitScope();
-}
-
-/**
- * The C callback that runs the Dart finalizer for an object. Set up by
- * [attachDartFinalizer]. [handle] is the object that's been collected, and
- * [peerPtr] is a Dart list containing the callback and its argument.
- */
-static void runDartFinalizer(Dart_Handle handle, void* peerPtr) {
-  Dart_EnterScope();
-  Dart_Handle wrappedPeer = (Dart_Handle) peerPtr;
-  Dart_Handle callback = handleError(Dart_ListGetAt(wrappedPeer, 0));
-  Dart_Handle peer = handleError(Dart_ListGetAt(wrappedPeer, 1));
-
-  handleError(Dart_InvokeClosure(callback, 1, &peer));
-  Dart_DeletePersistentHandle(wrappedPeer);
-  Dart_ExitScope();
-}
-
-/**
- * Attaches a finalizer callback to a Dart object.
- *
- * This takes a Dart object, a callback function, and an argument to pass to the
- * callback function. The callback will be called with the given argument some
- * time after the object has been garbage collected.
- */
-static void attachDartFinalizer(Dart_NativeArguments arguments) {
-  Dart_EnterScope();
-  Dart_SetReturnValue(arguments, Dart_Null());
-  Dart_Handle object = handleError(Dart_GetNativeArgument(arguments, 0));
-  Dart_Handle callback = handleError(Dart_GetNativeArgument(arguments, 1));
-  Dart_Handle peer = handleError(Dart_GetNativeArgument(arguments, 2));
-
-  Dart_Handle wrappedPeer = handleError(Dart_NewList(2));
-  handleError(Dart_ListSetAt(wrappedPeer, 0, callback));
-  handleError(Dart_ListSetAt(wrappedPeer, 1, peer));
-  wrappedPeer = handleError(Dart_NewPersistentHandle(wrappedPeer));
-
-  handleError(Dart_NewWeakPersistentHandle(
-      object, wrappedPeer, runDartFinalizer));
-  Dart_ExitScope();
-}
-
-/**
- * A struct representing a function exposed to Dart and the name under which it
- * can be looked up.
- */
-struct FunctionLookup {
-  const char* name;
-  Dart_NativeFunction function;
-};
-
-/** The list of functions exposed to Dart. */
-struct FunctionLookup function_list[] = {
-  {"Archive_ServicePort", archiveServicePort},
-  {"Archive_AttachFinalizer", attachDartFinalizer},
-  {NULL, NULL}
-};
-
-/**
- * Resolves a Dart name as provided in a `native` declaration and returns the
- * C function that should be invoked for that name.
- */
-static Dart_NativeFunction resolveName(Dart_Handle name, int argc) {
-  if (!Dart_IsString8(name)) return NULL;
-  Dart_EnterScope();
-  const char* cname;
-  handleError(Dart_StringToCString(name, &cname));
-
-  Dart_NativeFunction result = NULL;
-  int i;
-  for (i = 0; function_list[i].name != NULL; ++i) {
-    if (strcmp(function_list[i].name, cname) == 0) {
-      result = function_list[i].function;
-      break;
-    }
-  }
-  Dart_ExitScope();
-  return result;
-}
-
-/** Initializes the C extension. */
-DART_EXPORT Dart_Handle dart_archive_Init(Dart_Handle parent_library) {
-  if (Dart_IsError(parent_library)) return parent_library;
-
-  Dart_Handle result_code = Dart_SetNativeResolver(parent_library, resolveName);
-  if (Dart_IsError(result_code)) return result_code;
-
-  return Dart_Null();
-}
diff --git a/utils/archive/dart_archive.h b/utils/archive/dart_archive.h
deleted file mode 100644
index 67bb916..0000000
--- a/utils/archive/dart_archive.h
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef DART_ARCHIVE_H_
-#define DART_ARCHIVE_H_
-
-#include "dart_api.h"
-#include "archive.h"
-#include "archive_entry.h"
-
-#endif  // DART_ARCHIVE_H_
diff --git a/utils/archive/entry.c b/utils/archive/entry.c
deleted file mode 100644
index 81cc018..0000000
--- a/utils/archive/entry.c
+++ /dev/null
@@ -1,376 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "entry.h"
-#include "messaging.h"
-
-#define DART_TIMESTAMP(name)                                      \
-  Dart_CObject name;                                              \
-  if (archive_entry_ ## name ## _is_set(e)) {                     \
-    int64_t seconds = archive_entry_ ## name(e);                  \
-    int64_t nanoseconds = archive_entry_ ## name ## _nsec(e);     \
-    name.type = kInt64;                                           \
-    name.value.as_int64 = seconds * 1000 + nanoseconds / 1000000; \
-  } else {                                                        \
-    name.type = kNull;                                            \
-  }
-
-#define RAW_ARCHIVE_SIZE 29
-
-void postArchiveEntryArray(Dart_Port p, struct archive_entry* e) {
-  if (checkPointerError(p, e, "archive entry")) return;
-
-  Dart_CObject* archive_entry_array[RAW_ARCHIVE_SIZE];
-
-  DART_INT64(id, (intptr_t) e);
-  archive_entry_array[0] = &id;
-
-  // archive_entry_paths(3)
-  DART_STRING(hardlink, (char*) archive_entry_hardlink(e));
-  archive_entry_array[1] = &hardlink;
-  DART_STRING(pathname, (char*) archive_entry_pathname(e));
-  archive_entry_array[2] = &pathname;
-  DART_STRING(sourcepath, (char*) archive_entry_sourcepath(e));
-  archive_entry_array[3] = &sourcepath;
-  DART_STRING(symlink, (char*) archive_entry_symlink(e));
-  archive_entry_array[4] = &symlink;
-
-  // archive_entry_perms(3)
-  DART_INT32(gid, archive_entry_gid(e));
-  archive_entry_array[5] = &gid;
-  DART_INT32(uid, archive_entry_uid(e));
-  archive_entry_array[6] = &uid;
-  DART_INT32(perm, archive_entry_perm(e));
-  archive_entry_array[7] = &perm;
-  DART_STRING(strmode, (char*) archive_entry_strmode(e));
-  archive_entry_array[8] = &strmode;
-  DART_STRING(gname, (char*) archive_entry_gname(e));
-  archive_entry_array[9] = &gname;
-  DART_STRING(uname, (char*) archive_entry_uname(e));
-  archive_entry_array[10] = &uname;
-
-  unsigned long fflags_set;
-  unsigned long fflags_clear;
-  archive_entry_fflags(e, &fflags_set, &fflags_clear);
-  DART_INT64(wrapped_fflags_set, fflags_set);
-  archive_entry_array[11] = &wrapped_fflags_set;
-  DART_INT64(wrapped_fflags_clear, fflags_clear);
-  archive_entry_array[12] = &wrapped_fflags_clear;
-
-  DART_STRING(fflags_text, (char*) archive_entry_fflags_text(e));
-  archive_entry_array[13] = &fflags_text;
-
-  // archive_entry_stat(3)
-  DART_INT32(filetype, archive_entry_filetype(e));
-  archive_entry_array[14] = &filetype;
-  DART_INT32(mode, archive_entry_mode(e));
-  archive_entry_array[15] = &mode;
-
-  Dart_CObject size;
-  if (archive_entry_size_is_set(e)) {
-    size.type = kInt64;
-    size.value.as_int64 = archive_entry_size(e);
-  } else {
-    size.type = kNull;
-  }
-  archive_entry_array[16] = &size;
-
-  Dart_CObject dev;
-  if (archive_entry_dev_is_set(e)) {
-    dev.type = kInt64;
-    dev.value.as_int64 = archive_entry_dev(e);
-  } else {
-    dev.type = kNull;
-  }
-  archive_entry_array[17] = &dev;
-
-  DART_INT64(devmajor, archive_entry_devmajor(e));
-  archive_entry_array[18] = &devmajor;
-  DART_INT64(devminor, archive_entry_devminor(e));
-  archive_entry_array[19] = &devminor;
-
-  Dart_CObject ino;
-  if (archive_entry_ino_is_set(e)) {
-    ino.type = kInt64;
-    ino.value.as_int64 = archive_entry_ino64(e);
-  } else {
-    ino.type = kNull;
-  }
-  archive_entry_array[20] = &ino;
-
-  DART_INT64(nlink, archive_entry_nlink(e));
-  archive_entry_array[21] = &nlink;
-  DART_INT64(rdev, archive_entry_rdev(e));
-  archive_entry_array[22] = &rdev;
-  DART_INT64(rdevmajor, archive_entry_rdevmajor(e));
-  archive_entry_array[23] = &rdevmajor;
-  DART_INT64(rdevminor, archive_entry_rdevminor(e));
-  archive_entry_array[24] = &rdevminor;
-
-  // archive_entry_time(3)
-  DART_TIMESTAMP(atime);
-  archive_entry_array[25] = &atime;
-  DART_TIMESTAMP(birthtime);
-  archive_entry_array[26] = &birthtime;
-  DART_TIMESTAMP(ctime);
-  archive_entry_array[27] = &ctime;
-  DART_TIMESTAMP(mtime);
-  archive_entry_array[28] = &mtime;
-  // If you add entries, don't forget to increase RAW_ARCHIVE_SIZE.
-
-  Dart_CObject wrapped_archive_entry;
-  wrapped_archive_entry.type = kArray;
-  wrapped_archive_entry.value.as_array.values = archive_entry_array;
-  wrapped_archive_entry.value.as_array.length = RAW_ARCHIVE_SIZE;
-
-  postSuccess(p, &wrapped_archive_entry);
-}
-
-void archiveEntryClone(Dart_Port p, struct archive_entry* e) {
-  postArchiveEntryArray(p, archive_entry_clone(e));
-}
-
-void archiveEntryFree(Dart_Port p, struct archive_entry* e) {
-  archive_entry_free(e);
-  postSuccess(p, NULL);
-}
-
-void archiveEntryNew(Dart_Port p) {
-  postArchiveEntryArray(p, archive_entry_new());
-}
-
-void archiveEntrySetHardlink(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getNullableStringArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_hardlink(e, getNullableString(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetPathname(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getNullableStringArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_pathname(e, getNullableString(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetSymlink(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getNullableStringArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_symlink(e, getNullableString(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetGid(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_gid(e, getInteger(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetUid(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_uid(e, getInteger(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetPerm(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_perm(e, getInteger(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetGname(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getNullableStringArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_update_gname_utf8(e, getNullableString(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetUname(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getNullableStringArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_update_uname_utf8(e, getNullableString(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetFflagsSet(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_fflags(e, getInteger(value), 0);
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetFflagsClear(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_fflags(e, 0, getInteger(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetFiletype(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_filetype(e, getInteger(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetMode(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_mode(e, getInteger(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetSize(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  if (request->type == kNull) {
-    archive_entry_unset_size(e);
-    postSuccess(p, NULL);
-    return;
-  }
-
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_size(e, getInteger(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetDev(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_dev(e, getInteger(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetDevmajor(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_devmajor(e, getInteger(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetDevminor(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_devminor(e, getInteger(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetIno(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_ino64(e, getInteger(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetNlink(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_nlink(e, getInteger(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetRdev(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_rdev(e, getInteger(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetRdevmajor(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_rdevmajor(e, getInteger(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetRdevminor(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  archive_entry_set_rdevminor(e, getInteger(value));
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetAtime(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  if (request->type == kNull) {
-    archive_entry_unset_atime(e);
-    postSuccess(p, NULL);
-    return;
-  }
-
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  int64_t atime = getInteger(value);
-  archive_entry_set_atime(e, atime / 1000, (atime % 1000) * 1000000);
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetBirthtime(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  if (request->type == kNull) {
-    archive_entry_unset_birthtime(e);
-    postSuccess(p, NULL);
-    return;
-  }
-
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  int64_t birthtime = getInteger(value);
-  archive_entry_set_birthtime(
-      e, birthtime / 1000, (birthtime % 1000) * 1000000);
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetCtime(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  if (request->type == kNull) {
-    archive_entry_unset_ctime(e);
-    postSuccess(p, NULL);
-    return;
-  }
-
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  int64_t ctime = getInteger(value);
-  archive_entry_set_ctime(e, ctime / 1000, (ctime % 1000) * 1000000);
-  postSuccess(p, NULL);
-}
-
-void archiveEntrySetMtime(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request) {
-  if (request->type == kNull) {
-    archive_entry_unset_mtime(e);
-    postSuccess(p, NULL);
-    return;
-  }
-
-  Dart_CObject* value = getIntArgument(p, request, 0);
-  if (value == NULL) return;
-  int64_t mtime = getInteger(value);
-  archive_entry_set_mtime(e, mtime / 1000, (mtime % 1000) * 1000000);
-  postSuccess(p, NULL);
-}
diff --git a/utils/archive/entry.dart b/utils/archive/entry.dart
deleted file mode 100644
index f851959..0000000
--- a/utils/archive/entry.dart
+++ /dev/null
@@ -1,337 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library entry;
-
-import 'dart:io';
-import 'archive.dart' as archive;
-import 'entry_request.dart';
-import 'read_request.dart' as read;
-import 'utils.dart';
-
-/**
- * A single file in an archive.
- *
- * This is accessible via [ArchiveInputStream.onEntry].
- */
-class ArchiveEntry {
-  /**
-   * The various properties of this archive entry, as sent over from the C
-   * extension.
-   */
-  final List _properties;
-
-  /**
-   * The id of the archive to which this entry belongs. Used to read the entry
-   * data. This will be set to null once there's no longer data available to be
-   * read for this entry.
-   */
-  int _archiveId;
-
-  /**
-   * The input stream being used to read data from this entry. This is null
-   * until [openInputStream] is called.
-   */
-  InputStream _input;
-
-  // TODO(nweiz): Get rid of this once issue 4202 is fixed.
-  /**
-   * A future that only exists once [openInputStream] is called, and completes
-   * once the input stream is closed.
-   *
-   * For internal use only.
-   */
-  Future inputComplete;
-
-  ArchiveEntry.internal(this._properties, this._archiveId) {
-    attachFinalizer(this, (id) => call(FREE, id), _id);
-  }
-
-  /** Create a new [ArchiveEntry] with default values for all of its fields. */
-  static Future<ArchiveEntry> create() {
-    return call(NEW).then((properties) {
-      return new archive.ArchiveEntry.internal(properties, null);
-    });
-  }
-
-  /** The id of the underlying archive entry. */
-  int get _id => _properties[0];
-
-  /** If this entry is a hardlink, this is the destination. Otherwise, null. */
-  String get hardlink => _properties[1];
-  set hardlink(String value) => _set(SET_HARDLINK, 1, value);
-
-  /** The path to this entry in the archive. */
-  String get pathname => _properties[2];
-  set pathname(String value) => _set(SET_PATHNAME, 2, value);
-
-  /** The path to this entry on disk, */
-  String get sourcepath => _properties[3];
-
-  /** If this entry is a symlink, this is the destination. Otherwise, null. */
-  String get symlink => _properties[4];
-  set symlink(String value) => _set(SET_SYMLINK, 4, value);
-
-  /** The group identifier for this entry. */
-  int get gid => _properties[5];
-  set gid(int value) => _set(SET_GID, 5, value);
-
-  /** The user identifier for this entry. */
-  int get uid => _properties[6];
-  set uid(int value) => _set(SET_UID, 6, value);
-
-  /** The permissions bitmask for this entry. */
-  int get perm_mask => _properties[7];
-  set perm_mask(int value) => _set(SET_PERM, 7, value);
-
-  /**
-   * The String representation of the permissions for this entry.
-   *
-   * Note that if you set [perm_mask], this value will not change.
-   */
-  String get strmode => _properties[8];
-
-  /** The name of the group this entry belongs to. */
-  String get gname => _properties[9];
-  set gname(String value) => _set(SET_GNAME, 9, value);
-
-  /** The name of the user this entry belongs to. */
-  String get uname => _properties[10];
-  set uname(String value) => _set(SET_UNAME, 10, value);
-
-  /**
-   * The file flag bits that should be set for this entry.
-   *
-   * Note that if you set [fflags_text], this value will not change, and vice
-   * versa.
-   */
-  int get fflags_set => _properties[11];
-  set fflags_set(int value) => _set(SET_FFLAGS_SET, 11, value);
-
-  /**
-   * The file flag bits that should be cleared for this entry.
-   *
-   * Note that if you set [fflags_text], this value will not change, and vice
-   * versa.
-   */
-  int get fflags_clear => _properties[12];
-  set fflags_clear(int value) => _set(SET_FFLAGS_CLEAR, 12, value);
-
-  /**
-   * The textual representation of the file flags for this entry.
-   *
-   * Note that if you set [fflags_set] or [fflags_clear], this value will not
-   * change, and vice versa.
-   */
-  String get fflags_text => _properties[13];
-
-  /** The filetype bitmask for this entry. */
-  int get filetype_mask => _properties[14];
-  set filetype_mask(int value) => _set(SET_FILETYPE, 14, value);
-
-  /** The filetype and permissions bitmask for this entry. */
-  int get mode_mask => _properties[15];
-  set mode_mask(int value) => _set(SET_MODE, 15, value);
-
-  /** The size of this entry in bytes, or null if it's unset. */
-  int get size => _properties[16];
-  set size(int value) => _set(SET_SIZE, 16, value);
-
-  /** The ID of the device containing this entry, or null if it's unset. */
-  int get dev => _properties[17];
-  set dev(int value) => _set(SET_DEV, 17, value);
-
-  /** The major number of the ID of the device containing this entry. */
-  int get devmajor => _properties[18];
-  set devmajor(int value) => _set(SET_DEVMAJOR, 18, value);
-
-  /** The minor number of the ID of the device containing this entry. */
-  int get devminor => _properties[19];
-  set devminor(int value) => _set(SET_DEVMINOR, 19, value);
-
-  /** The inode number of this entry, or null if it's unset. */
-  int get ino => _properties[20];
-  set ino(int value) => _set(SET_INO, 20, value);
-
-  /** The number of references to this entry. */
-  int get nlink => _properties[21];
-  set nlink(int value) => _set(SET_NLINK, 21, value);
-
-  /** The device ID of this entry. */
-  int get rdev => _properties[22];
-  set rdev(int value) => _set(SET_RDEV, 22, value);
-
-  /** The major number of the device ID of this entry. */
-  int get rdevmajor => _properties[23];
-  set rdevmajor(int value) => _set(SET_RDEVMAJOR, 23, value);
-
-  /** The minor number of the device ID of this entry. */
-  int get rdevminor => _properties[24];
-  set rdevminor(int value) => _set(SET_RDEVMINOR, 24, value);
-
-  /** The last time this entry was accessed, or null if it's unset. */
-  Date get atime => _fromMs(_properties[25]);
-  set atime(Date value) => _set(SET_ATIME, 25, _toMs(value));
-
-  /** The time this entry was created, or null if it's unset. */
-  Date get birthtime => _fromMs(_properties[26]);
-  set birthtime(Date value) => _set(SET_BIRTHTIME, 26, _toMs(value));
-
-  /**
-   * The last time an inode property of this entry was changed, or null if it's
-   * unset.
-   */
-  Date get ctime => _fromMs(_properties[27]);
-  set ctime(Date value) => _set(SET_CTIME, 27, _toMs(value));
-
-  /** The last time this entry was modified, or null if it's unset. */
-  Date get mtime => _fromMs(_properties[28]);
-  set mtime(Date value) => _set(SET_MTIME, 28, _toMs(value));
-
-  /** Whether [openInputStream] has been called. */
-  bool get isInputOpen => _input != null;
-
-  /** Create a deep copy of this [ArchiveEntry]. */
-  Future<ArchiveEntry> clone() {
-    return call(CLONE, _id).
-      transform((array) => new archive.ArchiveEntry.internal(array, null));
-  }
-
-  /**
-   * Consumes the entire contents of this entry at once and returns it wrapped
-   * in a [CompleteArchiveEntry]. All metadata fields in the returned entry are
-   * copies of the fields in this entry.
-   *
-   * This may not be called if [openInputStream] is called, and vice versa.
-   */
-  Future<CompleteArchiveEntry> readAll() {
-    var stream = openInputStream();
-    var buffer = <int>[];
-    var completer = new Completer<List<int>>();
-
-    stream.onData = () => buffer.addAll(stream.read());
-    stream.onError = completer.completeError;
-    stream.onClosed = () => completer.complete(buffer);
-
-    return Future.wait([call(CLONE, _id), completer.future])
-      .then((list) => new CompleteArchiveEntry._(list[0], list[1]));
-  }
-
-  /**
-   * Set a property value with index [value] on the local representation of the
-   * archive entry and on the native representation.
-   */
-  void _set(int requestType, int index, value) {
-    _properties[index] = value;
-    // Since the native code processes messages in order, the SET_* messages
-    // will be received and processed before any further messages.
-    call(requestType, _id, [value]).then((_) {});
-  }
-
-  /**
-   * Converts [ms], the (possibly null) number of milliseconds since the epoch
-   * into a Date object (which may also be null).
-   */
-  Date _fromMs(int ms) {
-    if (ms == null) return null;
-    return new Date.fromMillisecondsSinceEpoch(ms);
-  }
-
-  /**
-   * Converts [date], which may be null, into the number of milliseconds since
-   * the epoch (which may also be null).
-   */
-  int _toMs(Date date) {
-    if (date == null) return null;
-    return date.millisecondsSinceEpoch;
-  }
-
-  /**
-   * Creates a new input stream for reading the contents of this entry.
-   *
-   * The contents of an entry must be consumed before the next entry is read
-   * from the parent [ArchiveInputStream]. This means that [openInputStream]
-   * must be called from the [ArchiveInputStream.onEntry] callback, or before
-   * the future returned by that callback completes. Once the next entry has
-   * been read, calling [openInputStream] will throw an [ArchiveException].
-   *
-   * Only one input stream may be opened per entry.
-   */
-  InputStream openInputStream() {
-    if (_archiveId == null) {
-      throw new UnsupportedError("Cannot open input stream for "
-          "archive entry $pathname.");
-    } else if (_input != null) {
-      throw new UnsupportedError("An input stream has already been"
-          "opened for archive entry $pathname.");
-    }
-
-    var inputCompleter = new Completer();
-    inputComplete = inputCompleter.future;
-
-    _input = new ListInputStream();
-    // TODO(nweiz): Report errors once issue 3657 is fixed
-    var future = _consumeInput().then((_) {
-      if (!_input.closed) _input.markEndOfStream();
-      // Asynchronously complete to give the InputStream callbacks a chance to
-      // fire.
-      return async();
-    }).then((_) => inputCompleter.complete(null));
-
-    future.handleException((e) {
-      print(e);
-      print(future.stackTrace);
-    });
-    return _input;
-  }
-
-  /**
-   * Close this entry so that its input stream no longer produces data.
-   *
-   * In addition to closing the associated input stream, this will prevent new
-   * input streams from being opened.
-   */
-  void close() {
-    _archiveId = null;
-    if (_input != null) _input.close();
-  }
-
-  /**
-   * Read all data from the archive and write it to [_input]. Returns a future
-   * that completes once this is done.
-   *
-   * This assumes that both [_input] and [_archiveId] are non-null and that
-   * [_input] is open, although if that changes before this completes it will
-   * handle it gracefully.
-   */
-  Future _consumeInput() {
-    var data;
-    return call(read.DATA_BLOCK, _archiveId).then((_data) {
-      data = _data;
-      // TODO(nweiz): This async() call is only necessary because of issue 4222.
-      return async();
-    }).then((_) {
-      if (_input.closed || _archiveId == null || data == null) {
-        return new Future.immediate(null);
-      }
-      _input.write(data);
-      return _consumeInput();
-    });
-  }
-}
-
-/**
- * An [ArchiveEntry] that contains the complete decompressed contents of the
- * file.
- */
-class CompleteArchiveEntry extends ArchiveEntry {
-  /** The contents of the entry as bytes. */
-  final List<int> contentBytes;
-
-  /** The contents of the entry as a string. */
-  String get contents => new String.fromCharCodes(contentBytes);
-
-  CompleteArchiveEntry._(List properties, this.contentBytes)
-    : super.internal(properties, null);
-}
diff --git a/utils/archive/entry.h b/utils/archive/entry.h
deleted file mode 100644
index a3b2562..0000000
--- a/utils/archive/entry.h
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * This file declares request-handling functions for handling archive entries.
- * Each function is called when a message is received with the corresponding
- * request type, and posts a success or error response to the reply port.
- *
- * There is a close correspondence between most functions here and the
- * libarchive API. It's left up to the Dart code to present a more Darty API. As
- * such, documentation of these functions is omitted, since it's available in
- * the libarchive documentation.
- */
-#ifndef DART_ARCHIVE_ENTRY_H_
-#define DART_ARCHIVE_ENTRY_H_
-
-#include "dart_archive.h"
-
-/**
- * Posts a response containing all the data in archive entry [e]. If [e] is
- * `NULL`, posts an error response instead.
- */
-void postArchiveEntryArray(Dart_Port p, struct archive_entry* e);
-
-void archiveEntryClone(Dart_Port p, struct archive_entry* e);
-
-void archiveEntryFree(Dart_Port p, struct archive_entry* e);
-
-void archiveEntryNew(Dart_Port p);
-
-void archiveEntrySetHardlink(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetPathname(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetSourcepath(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetSymlink(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetGid(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetUid(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetPerm(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetGname(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetUname(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetFflagsSet(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetFflagsClear(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetFflagsText(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetFiletype(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetMode(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetSize(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetDev(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetDevmajor(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetDevminor(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetIno(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetNlink(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetRdev(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetRdevmajor(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetRdevminor(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetAtime(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetBirthtime(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetCtime(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-void archiveEntrySetMtime(Dart_Port p, struct archive_entry* e,
-    Dart_CObject* request);
-
-#endif  // DART_ARCHIVE_MESSAGING_H_
-
diff --git a/utils/archive/entry_request.dart b/utils/archive/entry_request.dart
deleted file mode 100644
index 5aab778..0000000
--- a/utils/archive/entry_request.dart
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/** The request ids for entry-related messages to send to the C extension. */
-library entry_request;
-
-import 'read_request.dart' as read;
-
-final int _first = read.LAST;
-
-final int CLONE = _first + 1;
-final int FREE = _first + 2;
-final int NEW = _first + 3;
-final int SET_HARDLINK = _first + 4;
-final int SET_PATHNAME = _first + 5;
-final int SET_SYMLINK = _first + 6;
-final int SET_GID = _first + 7;
-final int SET_UID = _first + 8;
-final int SET_PERM_MASK = _first + 9;
-final int SET_GNAME = _first + 10;
-final int SET_UNAME = _first + 11;
-final int SET_FFLAGS_SET = _first + 12;
-final int SET_FFLAGS_CLEAR = _first + 13;
-final int SET_FILETYPE_MASK = _first + 14;
-final int SET_MODE_MASK = _first + 15;
-final int SET_SIZE = _first + 16;
-final int SET_DEV = _first + 17;
-final int SET_DEVMAJOR = _first + 18;
-final int SET_DEVMINOR = _first + 19;
-final int SET_INO = _first + 20;
-final int SET_NLINK = _first + 21;
-final int SET_RDEV = _first + 22;
-final int SET_RDEVMAJOR = _first + 23;
-final int SET_RDEVMINOR = _first + 24;
-final int SET_ATIME = _first + 25;
-final int SET_BIRTHTIME = _first + 26;
-final int SET_CTIME = _first + 27;
-final int SET_MTIME = _first + 28;
-
-final int LAST = SET_MTIME;
diff --git a/utils/archive/input_stream.dart b/utils/archive/input_stream.dart
deleted file mode 100644
index b71be44..0000000
--- a/utils/archive/input_stream.dart
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. 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_stream;
-
-import 'archive.dart' as archive;
-import 'entry.dart';
-import 'read_request.dart';
-import 'utils.dart';
-
-/**
- * A stream of [ArchiveEntry]s being read from an archive.
- *
- * This is accessible via [ArchiveReader].
- */
-class ArchiveInputStream {
-  /**
-   * The id of the underlying archive.
-   *
-   * This will be set to null once the input stream has finished reading from
-   * the archive.
-   */
-  final Reference<int> _id;
-
-  /** A [Completer] that will fire once the [_onEntry] callback is set. */
-  final Completer<Function> _onEntryCompleter;
-
-  /** The callback to call when the input stream is closed. */
-  Function _onClosed;
-
-  /** The callback to call when an error occurs. */
-  Function _onError;
-
-  /** The entry that is currently eligible to read data from the archive. */
-  ArchiveEntry _currentEntry;
-
-  ArchiveInputStream(int id)
-    : _id = new Reference<int>(id),
-      _onEntryCompleter = new Completer<Function>() {
-    var future = _consumeHeaders();
-    future.handleException((e) {
-      if (_onError != null) {
-        _onError(e, future.stackTrace);
-        return true;
-      } else {
-        throw e;
-      }
-    });
-
-    future.then((_) {
-      close();
-      if (_onClosed != null) _onClosed();
-    });
-
-    attachFinalizer(this, (id) {
-      if (id.value != null) call(FREE, id.value).then(() {});
-    }, _id);
-  }
-
-  /** Whether this stream has finished reading entries. */
-  bool get closed => _id.value == null;
-
-  /**
-   * Reads the entire contents of the archive at once.
-   *
-   * Note that this is mutually exclusive with reading individual entries using
-   * [onEntry].
-   */
-  Future<List<CompleteArchiveEntry>> readAll() {
-    var completer = new Completer<List<Future<CompleteArchiveEntry>>>();
-    var result = <Future<CompleteArchiveEntry>>[];
-
-    this.onEntry = (entry) => result.add(entry.readAll());
-    this.onError = (e, stack) => completer.completeError(e, stack);
-    this.onClosed = () => completer.complete(result);
-
-    return completer.future.then(Future.wait);
-  }
-
-  /**
-   * Sets a callback to call when a new entry is read from the archive.
-   *
-   * The [ArchiveEntry] that's read from an archive initially only contains
-   * header information such as the filename and permissions. To get the actual
-   * data contained in the entry, use [ArchiveEntry.openInputStream].
-   *
-   * Since the entries are read in sequence from the archive, the data stream
-   * for one entry must be opened before the next entry is read from the
-   * archive. The next entry will not be read until the return value of
-   * [callback] has completed.
-   *
-   * If [callback] calls [ArchiveEntry.openInputStream] before it returns, or if
-   * it doesn't want to read the contents of [entry], it can return null.
-   */
-  void set onEntry(Future callback(ArchiveEntry entry)) {
-    _onEntryCompleter.complete(callback);
-  }
-
-  /**
-   * Sets a callback to call when the input stream is done emitting entries.
-   */
-  void set onClosed(void callback()) {
-    _onClosed = callback;
-  }
-
-  /**
-   * Sets a callback to call if an error occurs while extracting the archive.
-   *
-   * [e] is the error that occured and [stack] is the stack trace of the error.
-   */
-  void set onError(void callback(e, stack)) {
-    _onError = callback;
-  }
-
-  /**
-   * Closes the input stream. No more entries will be emitted.
-   */
-  void close() {
-    if (closed) return;
-    call(FREE, _id.value).then((_) {});
-    _id.value = null;
-    if (_currentEntry != null) _currentEntry.close();
-    if (!_onEntryCompleter.future.isComplete) _onEntryCompleter.complete(null);
-  }
-
-  /**
-   * Consumes and emits all [ArchiveEntries] in this archive.
-   */
-  Future _consumeHeaders() {
-    if (closed) return new Future.immediate(null);
-    var data;
-    return call(NEXT_HEADER, _id.value).then((_data) {
-      data = _data;
-      if (data == null) return new Future.immediate(null);
-      return _emit(new archive.ArchiveEntry.internal(data, _id.value)).
-        then((_) => _consumeHeaders());
-    });
-  }
-
-  /**
-   * Emits [entry] to the [onEntry] callback. Returns a [Future] that will
-   * complete once the callback's return value completes and the entry's data
-   * has been fully consumed.
-   */
-  Future _emit(ArchiveEntry entry) {
-    _currentEntry = entry;
-    var future = _onEntryCompleter.future.then((onEntry) {
-      if (closed) return new Future.immediate(null);
-      var result = onEntry(entry);
-      if (result is Future) return result;
-      return new Future.immediate(null);
-    }).then((_) {
-      if (entry.isInputOpen) return entry.inputComplete;
-      return new Future.immediate(null);
-    }).whenComplete(() {
-      _currentEntry = null;
-      entry.close();
-    });
-    return future;
-  }
-}
diff --git a/utils/archive/messaging.c b/utils/archive/messaging.c
deleted file mode 100644
index bbfb8f8..0000000
--- a/utils/archive/messaging.c
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include <errno.h>
-#include <stdarg.h>
-
-#include "messaging.h"
-
-void postResult(Dart_Port p, bool success, int err, Dart_CObject* response) {
-  DART_BOOL(wrapped_success, success);
-  DART_INT32(wrapped_err, err);
-  
-  Dart_CObject* values[3];
-  values[0] = &wrapped_success;
-  values[1] = &wrapped_err;
-  values[2] = response;
-
-  Dart_CObject full_response;
-  full_response.type = kArray;
-  full_response.value.as_array.values = values;
-  full_response.value.as_array.length = 3;
-
-  Dart_PostCObject(p, &full_response);
-}
-
-void postError(Dart_Port p, struct archive* a) {
-  DART_STRING(error_string, (char*) archive_error_string(a));
-  postResult(p, false, archive_errno(a), &error_string);
-}
-
-void postInvalidArgument(Dart_Port p, const char* format, ...) {
-  va_list args;
-  char buffer[256];
-
-  va_start(args, format);
-  vsnprintf(buffer, 256, format, args);
-  va_end(args);
-
-  DART_STRING(error_string, buffer);
-  postResult(p, false, EINVAL, &error_string);
-}
-
-void postSuccess(Dart_Port p, Dart_CObject* response) {
-  if (response != NULL) {
-    postResult(p, true, 0, response);
-    return;
-  }
-
-  DART_NULL(null_response);
-  postResult(p, true, 0, &null_response);
-}
-
-bool checkError(Dart_Port p, struct archive* a, int result) {
-  if (result == ARCHIVE_OK) return false;
-  // TODO(nweiz): What should we do about non-fatal warnings?
-  if (result == ARCHIVE_WARN) return false;
-  postError(p, a);
-  return true;
-}
-
-bool checkPointerError(Dart_Port p, void* pointer, char* name) {
-  if (pointer != NULL) return false;
-  char buffer[100];
-  snprintf(buffer, 100, "Failed to allocate memory for %s.", name);
-  DART_STRING(error_string, buffer);
-  postResult(p, false, ENOMEM, &error_string);
-  return true;
-}
-
-bool checkType(Dart_Port p, Dart_CObject* object, enum Type type) {
-  if (object->type == type) return false;
-  postInvalidArgument(p, "Invalid argument: expected type %d, was type %d.",
-    type, object->type);
-  return true;
-}
-
-void checkResult(Dart_Port p, struct archive* a, int result) {
-  if (checkError(p, a, result)) return;
-  postSuccess(p, NULL);
-}
-
-void checkPointerResult(Dart_Port p, void* pointer, char* name) {
-  if (checkPointerError(p, pointer, name)) return;
-  DART_INT64(result, (intptr_t) pointer);
-  postSuccess(p, &result);
-}
-
-Dart_CObject* getArgument(Dart_Port p, Dart_CObject* request, int i) {
-  if (checkType(p, request, kArray)) return NULL;
-
-  i += 2; // Skip over the message name and archive id.
-  if (request->value.as_array.length > i) {
-    return request->value.as_array.values[i];
-  }
-
-  postInvalidArgument(p, "Invalid argument: expected at least %d arguments, " \
-    "were %d.", i - 2, request->value.as_array.length - 2);
-  return NULL;
-}
-
-Dart_CObject* getTypedArgument(Dart_Port p, Dart_CObject* request, int i,
-                               enum Type type) {
-  Dart_CObject* arg = getArgument(p, request, i);
-  if (arg == NULL) return NULL;
-  if (checkType(p, arg, type)) return NULL;
-  return arg;
-}
-
-Dart_CObject* getIntArgument(Dart_Port p, Dart_CObject* request, int i) {
-  Dart_CObject* arg = getArgument(p, request, i);
-  if (arg == NULL) return NULL;
-  if (arg->type == kInt64) return arg;
-  if (arg->type == kInt32) return arg;
-  postInvalidArgument(p, "Invalid argument %d: expected integer, was type %d.",
-    i+1, arg->type);
-  return NULL;
-}
-
-int64_t getInteger(Dart_CObject* object) {
-  assert(object->type == kInt64 || object->type == kInt32);
-  if (object->type == kInt64) return object->value.as_int64;
-  if (object->type == kInt32) return (int64_t) object->value.as_int32;
-  return 0; // Should never reach this point.
-}
-
-Dart_CObject* getNullableStringArgument(Dart_Port p, Dart_CObject* request,
-    int i) {
-  Dart_CObject* arg = getArgument(p, request, i);
-  if (arg == NULL) return NULL;
-  if (arg->type == kNull) return arg;
-  if (arg->type == kString) return arg;
-  postInvalidArgument(p, "Invalid argument %d: expected string or null, was " \
-    "type %d.", i+1, arg->type);
-  return NULL;
-}
-
-char* getNullableString(Dart_CObject* object) {
-  assert(object->type == kNull || object->type == kString);
-  if (object->type == kString) return object->value.as_string;
-  return NULL;
-}
-
-bool getOptionArguments(Dart_Port p, Dart_CObject* request, char** module,
-    char** name, char** value) {
-  *module = NULL;
-  *name = NULL;
-  *value = NULL;
-
-  Dart_CObject* wrappedModule = getNullableStringArgument(p, request, 0);
-  if (wrappedModule == NULL) return false;
-  *module = getNullableString(wrappedModule);
-
-  Dart_CObject* wrappedName = getTypedArgument(p, request, 0, kString);
-  if (wrappedName == NULL) return false;
-  *name = wrappedName->value.as_string;
-
-  Dart_CObject* wrappedValue = getNullableStringArgument(p, request, 0);
-  if (wrappedValue == NULL) return false;
-  *value = getNullableString(wrappedValue);
-
-  return true;
-}
-
diff --git a/utils/archive/messaging.h b/utils/archive/messaging.h
deleted file mode 100644
index bce0692..0000000
--- a/utils/archive/messaging.h
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef DART_ARCHIVE_MESSAGING_H_
-#define DART_ARCHIVE_MESSAGING_H_
-
-#include "dart_archive.h"
-
-/**
- * Posts a reponse to the main Dart isolate. Only one response should be sent
- * for each request.
- *
- * [p] is the reply port for the isolate. [success] indicates whether or not the
- * request completed successfully; if not, [err] indicates the precise nature of
- * the error. [response] contains request-specific response data to send to
- * Dart; it may not be `NULL`, but it may be the Dart `null` value.
- */
-void postResult(Dart_Port p, bool success, int err, Dart_CObject* response);
-
-/**
- * Posts an error response to the main Dart isolate.
- *
- * This should be used when libarchive signals an error. The errno and error
- * message are taken from libarchive's built-in error information for [a].
- */
-void postError(Dart_Port p, struct archive* a);
-
-/**
- * Posts an invalid argument error response to the main Dart isolate.
- *
- * This should be used when the arguments sent by the Dart code have unexpected
- * types. Takes a `printf`-style [format] string for describing the error. Note
- * that the error string will be cut off at 256 characters.
- */
-void postInvalidArgument(Dart_Port p, const char* format, ...);
-
-/**
- * Posts a success response to the main Dart isolate. [response] is the
- * request-specific Dart object containing the response data. It may be `NULL`.
- */
-void postSuccess(Dart_Port p, Dart_CObject* response);
-
-/**
- * Checks [error], the return code of a libarchive call for error conditions,
- * and sends an appropriate error response if any are detected.
- * 
- * Returns `true` if an error is detected and the containing function should
- * short-circuit.
- */
-bool checkError(Dart_Port p, struct archive* a, int result);
-
-/**
- * Sends an error response if [pointer] is invalid. [name] is the name of the
- * object being allocated, for error reporting.
- * 
- * Returns `true` if an error is detected and the containing function should
- * short-circuit.
- */
-bool checkPointerError(Dart_Port p, void* pointer, char* name);
-
-/**
- * Like [checkError], but sends a success message with no attached data if no
- * error is detected. No further responses should be sent after calling this.
- */
-void checkResult(Dart_Port p, struct archive* a, int result);
-
-/**
- * Like [checkPointerError], but sends a success message with the pointer as a
- * Dart integer if no error is detected. No further responses should be sent
- * after calling this.
- */
-void checkPointerResult(Dart_Port p, void* pointer, char* name);
-
-/**
- * Checks that [object] is of the expected type [type]. If not, sends an
- * appropriate error response.
- *
- * Returns `true` if a type error is detected and the containing function should
- * short-circuit.
- */
-bool checkType(Dart_Port p, Dart_CObject* object, enum Type type);
-
-/**
- * Gets the [i]th argument from [request], which should be the Dart object
- * passed in to each handler function. If this fails (e.g. there isn't an [i]th
- * argument), it will return `NULL`.
- */
-Dart_CObject* getArgument(Dart_Port p, Dart_CObject* request, int i);
-
-/**
- * Like [getArgument], but also ensures that the argument is of type [type].
- */
-Dart_CObject* getTypedArgument(Dart_Port p, Dart_CObject* request, int i,
-                               enum Type type);
-
-/**
- * Like [getArgument], but also ensures that the argument is an integer type
- * (`int32` or `int64`). [getInteger] should be used to extract the actual value
- * of the argument.
- */
-Dart_CObject* getIntArgument(Dart_Port p, Dart_CObject* request, int i);
-
-/**
- * Gets the integer value of [object], which should be an `int32` or an `int64`.
- * Note that this does not validate the type of its argument.
- */
-int64_t getInteger(Dart_CObject* object);
-
-/**
- * Like [getArgument], but also ensures that the argument is a string or null.
- * [getNullableString] should be used to extract the actual value of the
- * argument.
- */
-Dart_CObject* getNullableStringArgument(Dart_Port p, Dart_CObject* request,
-    int i);
-
-/**
- * Gets the string value of [object] or `NULL` if it's null. Note that this does
- * not validate the type of its argument.
- */
-char* getNullableString(Dart_CObject* object);
-
-/**
- * Gets the module, name, and value, for a libarchive `set_option` function
- * call. Returns whether or not the arguments were parsed correctly.
- */
-bool getOptionArguments(Dart_Port p, Dart_CObject* request, char** module,
-    char** name, char** value);
-
-/** Declares a null [Dart_CObject] named [name]. */
-#define DART_NULL(name) \
-  Dart_CObject name;    \
-  name.type = kNull;
-
-/**
- * Declares a [Dart_CObject] bool named [name] with value [val].
- *
- * [val] should be a C boolean.
- */
-#define DART_BOOL(name, val) \
-  Dart_CObject name;         \
-  name.type = kBool;         \
-  name.value.as_bool = val;
-
-/**
- * Declares a [Dart_CObject] `int32` named [name] with value [val].
- *
- * [val] should be a C integer.
- */
-#define DART_INT32(name, val) \
-  Dart_CObject name;          \
-  name.type = kInt32;         \
-  name.value.as_int32 = val;
-
-/**
- * Declares a [Dart_CObject] `int64` named [name] with value [val].
- *
- * [val] should be a C integer.
- */
-#define DART_INT64(name, val) \
-  Dart_CObject name;          \
-  name.type = kInt64;         \
-  name.value.as_int64 = val;
-
-/**
- * Declares a [Dart_CObject] double named [name] with value [val].
- *
- * [val] should be a C float.
- */
-#define DART_DOUBLE(name, val) \
-  Dart_CObject name;           \
-  name.type = kDouble;         \
-  name.value.as_double = val;
-
-/**
- * Declares a [Dart_CObject] string named [name] with value [val].
- *
- * [val] should be a C string or `NULL`.
- */
-#define DART_STRING(name, val)  \
-  Dart_CObject name;            \
-  if (val == NULL) {            \
-    name.type = kNull;          \
-  } else {                      \
-    name.type = kString;        \
-    name.value.as_string = val; \
-  }
-
-#endif  // DART_ARCHIVE_MESSAGING_H_
diff --git a/utils/archive/options.dart b/utils/archive/options.dart
deleted file mode 100644
index cfebf1f..0000000
--- a/utils/archive/options.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library options;
-
-/**
- * An individual option.
- */
-class ArchiveOption {
-  /** The name of the option. */
-  final String name;
-
-  /** The value of the option. */
-  final value;
-
-  /** The module to which the option applies.*/
-  String module;
-
-  ArchiveOption(this.name, this.value, [this.module]);
-}
-
-/**
- * A collection of options.
- */
-class ArchiveOptions {
-  /** The internal options map. */
-  final Map<String, ArchiveOption> _options;
-
-  ArchiveOptions() : _options = <String, ArchiveOption>{};
-
-  /** Returns whether any options have been set. */
-  bool get isEmpty => _options.isEmpty;
-
-  /**
-   * Sets an option. [value] should either be a bool or something with a
-   * reasonable `toString` method.
-   *
-   * To set the module for an option, use [operator[]].
-   */
-  void operator[]=(String name, value) {
-    _options[name] = new ArchiveOption(name, value);
-  }
-
-  /** Gets the option with the given name. */
-  ArchiveOption operator[](String name) {
-    return _options[name];
-  }
-
-  /** Gets all options. */
-  List<ArchiveOption> get all => _options.values.toList();
-}
diff --git a/utils/archive/read_request.dart b/utils/archive/read_request.dart
deleted file mode 100644
index 33efdbc..0000000
--- a/utils/archive/read_request.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/** The request ids for read-related messages to send to the C extension. */
-library read_request;
-
-final int NEW = 0;
-final int SUPPORT_FILTER_ALL = 1;
-final int SUPPORT_FILTER_BZIP2 = 2;
-final int SUPPORT_FILTER_COMPRESS = 3;
-final int SUPPORT_FILTER_GZIP = 4;
-final int SUPPORT_FILTER_LZMA = 5;
-final int SUPPORT_FILTER_XZ = 6;
-final int SUPPORT_FILTER_PROGRAM = 7;
-final int SUPPORT_FILTER_PROGRAM_SIGNATURE = 8;
-final int SUPPORT_FORMAT_ALL = 9;
-final int SUPPORT_FORMAT_AR = 10;
-final int SUPPORT_FORMAT_CPIO = 11;
-final int SUPPORT_FORMAT_EMPTY = 12;
-final int SUPPORT_FORMAT_ISO9660 = 13;
-final int SUPPORT_FORMAT_MTREE = 14;
-final int SUPPORT_FORMAT_RAW = 15;
-final int SUPPORT_FORMAT_TAR = 16;
-final int SUPPORT_FORMAT_ZIP = 17;
-final int SET_FILTER_OPTION = 18;
-final int SET_FORMAT_OPTION = 19;
-final int SET_OPTION = 20;
-final int OPEN_FILENAME = 21;
-final int OPEN_MEMORY = 22;
-final int NEXT_HEADER = 23;
-final int DATA_BLOCK = 24;
-final int DATA_SKIP = 25;
-final int CLOSE = 26;
-final int FREE = 27;
-
-final int LAST = FREE;
diff --git a/utils/archive/reader.c b/utils/archive/reader.c
deleted file mode 100644
index 00a7db3..0000000
--- a/utils/archive/reader.c
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "entry.h"
-#include "messaging.h"
-#include "reader.h"
-
-void archiveReadNew(Dart_Port p) {
-  checkPointerResult(p, archive_read_new(), "archive input stream");
-}
-
-void archiveReadSupportFilterAll(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_support_filter_all(a));
-}
-
-void archiveReadSupportFilterBzip2(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_support_filter_bzip2(a));
-}
-
-void archiveReadSupportFilterCompress(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_support_filter_compress(a));
-}
-
-void archiveReadSupportFilterGzip(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_support_filter_gzip(a));
-}
-
-void archiveReadSupportFilterLzma(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_support_filter_lzma(a));
-}
-
-void archiveReadSupportFilterXz(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_support_filter_xz(a));
-}
-
-void archiveReadSupportFilterProgram(Dart_Port p, struct archive* a,
-                                     Dart_CObject* request) {
-  Dart_CObject* cmd = getTypedArgument(p, request, 0, kString);
-  if (cmd == NULL) return;
-  int result = archive_read_support_filter_program(
-      a, cmd->value.as_string);
-  checkResult(p, a, result);
-}
-
-void archiveReadSupportFilterProgramSignature(
-    Dart_Port p, struct archive* a, Dart_CObject* request) {
-  Dart_CObject* cmd = getTypedArgument(p, request, 0, kString);
-  if (cmd == NULL) return;
-
-  Dart_CObject* signature = getTypedArgument(p, request, 1, kUint8Array);
-  if (cmd == NULL) return;
-
-  int result = archive_read_support_filter_program_signature(
-      a, cmd->value.as_string, signature->value.as_byte_array.values,
-      signature->value.as_byte_array.length);
-  checkResult(p, a, result);
-}
-
-void archiveReadSupportFormatAll(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_support_format_all(a));
-}
-
-void archiveReadSupportFormatAr(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_support_format_ar(a));
-}
-
-void archiveReadSupportFormatCpio(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_support_format_cpio(a));
-}
-
-void archiveReadSupportFormatEmpty(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_support_format_empty(a));
-}
-
-void archiveReadSupportFormatIso9660(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_support_format_iso9660(a));
-}
-
-void archiveReadSupportFormatMtree(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_support_format_mtree(a));
-}
-
-void archiveReadSupportFormatRaw(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_support_format_raw(a));
-}
-
-void archiveReadSupportFormatTar(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_support_format_tar(a));
-}
-
-void archiveReadSupportFormatZip(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_support_format_zip(a));
-}
-
-void archiveReadSetFilterOption(Dart_Port p, struct archive* a,
-                                Dart_CObject* request) {
-  char* module;
-  char* name;
-  char* value;
-
-  getOptionArguments(p, request, &module, &name, &value);
-  int result = archive_read_set_filter_option(a, module, name, value);
-  checkResult(p, a, result);
-}
-
-void archiveReadSetFormatOptions(Dart_Port p, struct archive* a,
-                                 Dart_CObject* request) {
-  char* module;
-  char* name;
-  char* value;
-
-  getOptionArguments(p, request, &module, &name, &value);
-  int result = archive_read_set_format_option(a, module, name, value);
-  checkResult(p, a, result);
-}
-
-void archiveReadSetOptions(Dart_Port p, struct archive* a,
-                           Dart_CObject* request) {
-  char* module;
-  char* name;
-  char* value;
-
-  getOptionArguments(p, request, &module, &name, &value);
-  int result = archive_read_set_option(a, module, name, value);
-  checkResult(p, a, result);
-}
-
-// TODO(nweiz): wrap archive_read_open2
-// TODO(nweiz): wrap archive_read_FILE when issue 4160 is fixed
-
-void archiveReadOpenFilename(Dart_Port p, struct archive* a,
-                             Dart_CObject* request) {
-  Dart_CObject* filename = getTypedArgument(p, request, 0, kString);
-  if (filename == NULL) return;
-
-  Dart_CObject* block_size = getIntArgument(p, request, 1);
-  if (block_size == NULL) return;
-
-  int result = archive_read_open_filename(a, filename->value.as_string,
-                                          getInteger(block_size));
-  checkResult(p, a, result);
-}
-
-void archiveReadOpenMemory(Dart_Port p, struct archive* a,
-                           Dart_CObject* request) {
-  Dart_CObject* filename = getTypedArgument(p, request, 0, kUint8Array);
-  if (filename == NULL) return;
-
-  int result = archive_read_open_memory(a, filename->value.as_byte_array.values,
-                                        filename->value.as_byte_array.length);
-  checkResult(p, a, result);
-}
-
-void archiveReadNextHeader(Dart_Port p, struct archive* a) {
-  // TODO(nweiz): At some point, we'll want to attach the actual archive pointer
-  // to the struct we send to Dart so that it can later be modified, passed in
-  // to other functions, etc. When we do so, we'll need to use archive_entry_new
-  // to create it and we'll have to attach a finalizer to the Dart object to
-  // ensure that it gets freed.
-  struct archive_entry* entry = archive_entry_new();
-  if (checkPointerError(p, entry, "archive entry")) return;
-
-  int result = archive_read_next_header2(a, entry);
-  if (result == ARCHIVE_EOF) {
-    postSuccess(p, NULL);
-    archive_entry_free(entry);
-  } else if (checkError(p, a, result)) {
-    archive_entry_free(entry);
-  } else {
-    postArchiveEntryArray(p, entry);
-  }
-}
-
-void archiveReadDataBlock(Dart_Port p, struct archive* a) {
-  const void* buffer;
-  size_t len;
-  int64_t offset;
-  int result = archive_read_data_block(a, &buffer, &len, &offset);
-  if (result == ARCHIVE_EOF) {
-    postSuccess(p, NULL);
-    return;
-  }
-  if (checkError(p, a, result)) return;
-
-  Dart_CObject wrapped_data_block;
-  wrapped_data_block.type = kUint8Array;
-  wrapped_data_block.value.as_byte_array.length = len;
-  wrapped_data_block.value.as_byte_array.values = (void*) buffer + offset;
-  postSuccess(p, &wrapped_data_block);
-}
-
-void archiveReadDataSkip(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_data_skip(a));
-}
-
-// TODO(nweiz): wrap archive_read_into_fd when issue 4160 is fixed
-// TODO(nweiz): wrap archive_read_extract and friends
-
-void archiveReadClose(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_close(a));
-}
-
-void archiveReadFree(Dart_Port p, struct archive* a) {
-  checkResult(p, a, archive_read_free(a));
-}
diff --git a/utils/archive/reader.dart b/utils/archive/reader.dart
deleted file mode 100644
index f1bf6d5..0000000
--- a/utils/archive/reader.dart
+++ /dev/null
@@ -1,299 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library reader;
-
-import 'input_stream.dart';
-import 'options.dart';
-import 'read_request.dart';
-import 'utils.dart';
-
-/**
- * A class for extracting and decompressing an archive.
- *
- * Each instance of this class represents a specific set of options for
- * extracting an archive. These options can be used to create multiple input
- * streams using the [reader.ArchiveReader.openFilename] and
- * [reader.ArchiveReader.openMemory] methods.
- *
- * Before opening an archive, this needs to be configured. [filter] should be
- * used to enable specific decompression algorithms, and [format] should be used
- * to enable specific archive formats.
- */
-class ArchiveReader {
-  /**
-   * The configuration for the filter(s) to use when decompressing the contents
-   * of an archive. The precise compression used is auto-detected from among all
-   * enabled options.
-   */
-  final Filter filter;
-
-  /**
-   * The configuration for the archive format(s) to look for when extracting the
-   * contents of an archive. The format used is auto-detected from among all
-   * enabled options.
-   */
-  final Format format;
-
-  /**
-   * Options for both [filter] and [format]. See [the libarchive
-   * documentation][wiki] for a list of available options.
-   *
-   * [wiki]: https://github.com/libarchive/libarchive/wiki/ManPageArchiveReadSetOptions3
-   */
-  final ArchiveOptions options;
-
-  /** Creates a new, unconfigured archive reader. */
-  ArchiveReader() : filter = new Filter._(),
-                    format = new Format._(),
-                    options = new ArchiveOptions();
-
-  /**
-   * Begins extracting from [file].
-   *
-   * [block_size] only needs to be specified for reading from devices that
-   * require strict I/O blocking.
-   */
-  Future<ArchiveInputStream> openFilename(String file, [int block_size=16384]) {
-    var id;
-    return _createArchive().then((_id) {
-      id = _id;
-      return call(OPEN_FILENAME, id, [file, block_size]);
-    }).then((_) => new ArchiveInputStream(id));
-  }
-
-  /** Begins extracting from [data], which should be a list of bytes. */
-  Future<ArchiveInputStream> openData(List<int> data) {
-    var id;
-    return _createArchive().then((_id) {
-      id = _id;
-      return call(OPEN_MEMORY, id, [bytesForC(data)]);
-    }).then((_) => new ArchiveInputStream(id));
-  }
-
-  /**
-   * Creates an archive struct, applies all the configuration options to it, and
-   * returns its id.
-   */
-  Future<int> _createArchive() {
-    return call(NEW).then((id) {
-      if (id == 0 || id == null) {
-        throw new ArchiveException("Archive is invalid or closed.");
-      }
-      return _pushConfiguration(id).then((_) => id);
-    });
-  }
-
-  /**
-   * Applies all configuration in this archive to the archive identified by
-   * [id]. Returns a future that completes once all the configuration is
-   * applied.
-   */
-  Future _pushConfiguration(int id) {
-    var pending = <Future>[];
-    if (filter.program != null) {
-      if (filter.programSignature != null) {
-        var signature = bytesForC(filter.programSignature);
-        pending.add(call(SUPPORT_FILTER_PROGRAM_SIGNATURE, id,
-                          [filter.program, signature]));
-      } else {
-        pending.add(call(SUPPORT_FILTER_PROGRAM, id, [filter.program]));
-      }
-    } else if (filter.all) {
-      pending.add(call(SUPPORT_FILTER_ALL, id));
-    } else {
-      if (filter.bzip2) pending.add(call(SUPPORT_FILTER_BZIP2, id));
-      if (filter.compress) {
-        pending.add(call(SUPPORT_FILTER_COMPRESS, id));
-      }
-      if (filter.gzip) pending.add(call(SUPPORT_FILTER_GZIP, id));
-      if (filter.lzma) pending.add(call(SUPPORT_FILTER_LZMA, id));
-      if (filter.xz) pending.add(call(SUPPORT_FILTER_XZ, id));
-    }
-
-    if (format.all) {
-      pending.add(call(SUPPORT_FORMAT_ALL, id));
-    } else {
-      if (format.ar) pending.add(call(SUPPORT_FORMAT_AR, id));
-      if (format.cpio) pending.add(call(SUPPORT_FORMAT_CPIO, id));
-      if (format.empty) pending.add(call(SUPPORT_FORMAT_EMPTY, id));
-      if (format.iso9660) pending.add(call(SUPPORT_FORMAT_ISO9660, id));
-      if (format.mtree) pending.add(call(SUPPORT_FORMAT_MTREE, id));
-      if (format.raw) pending.add(call(SUPPORT_FORMAT_RAW, id));
-      if (format.tar) pending.add(call(SUPPORT_FORMAT_TAR, id));
-      if (format.zip) pending.add(call(SUPPORT_FORMAT_ZIP, id));
-    }
-
-    void addOption(request, option) {
-      var value;
-      if (option.value == false || option.value == null) {
-        value = null;
-      } else if (option.value == true) {
-        value = '1';
-      } else {
-        value = option.value.toString();
-      }
-
-      pending.add(CALL(request, id, [module, option.name, value]));
-    };
-
-    for (var option in filter.options.all) {
-      addOption(SET_FILTER_OPTION, option);
-    }
-
-    for (var option in format.options.all) {
-      addOption(SET_FORMAT_OPTION, option);
-    }
-
-    for (var option in options.all) {
-      addOption(SET_OPTION, option);
-    }
-
-    return Future.wait(pending);
-  }
-}
-
-/**
- * The configuration for the filter(s) to use when decompressing the contents
- * of an archive. The precise compression used is auto-detected from among all
- * enabled options.
- */
-class Filter {
-  /**
-   * Auto-detect among all possible filters. If this is set, all other filter
-   * flags are ignored. [program] takes precedence over this.
-   */
-  bool all = false;
-
-  /**
-   * Enable [bzip2][wp] compression.
-   *
-   * [wp]: http://en.wikipedia.org/wiki/Bzip2
-   */
-  bool bzip2 = false;
-
-  /**
-   * Enable the compression used by [the `compress` utility][wp].
-   *
-   * [wp]: http://en.wikipedia.org/wiki/Compress
-   */
-  bool compress = false;
-
-  /**
-   * Enable [gzip][wp] compression.
-   *
-   * [wp]: http://en.wikipedia.org/wiki/Gzip
-   */
-  bool gzip = false;
-
-  /**
-   * Enable [lzma][wp] compression.
-   *
-   * [wp]: http://en.wikipedia.org/wiki/Lzma
-   */
-  bool lzma = false;
-
-  /**
-   * Enable [xz][wp] compression.
-   *
-   * [wp]: http://en.wikipedia.org/wiki/Xz
-   */
-  bool xz = false;
-
-  /**
-   * Compress using the command-line program `program`. If this is specified and
-   * [programSignature] is not, all other filter flags are ignored. This takes
-   * precedence over [all].
-   */
-  String program;
-
-  // TODO(nweiz): allow multiple programs with signatures to be specified.
-  /**
-   * If set, `program` will be applied only to files whose initial bytes match
-   * [programSignature].
-   */
-  List<int> programSignature;
-
-  /**
-   * Options for individual filters. See [the libarchive documentation][wiki]
-   * for a list of available options.
-   *
-   * [wiki]: https://github.com/libarchive/libarchive/wiki/ManPageArchiveReadSetOptions3
-   */
-  final ArchiveOptions options;
-
-  Filter._() : options = new ArchiveOptions();
-}
-
-/**
- * The configuration for the archive format(s) to look for when extracting the
- * contents of an archive. The format used is auto-detected from among all
- * enabled options.
- */
-class Format {
-  /**
-   * Auto-detect among all possible formats. If this is set, all other format
-   * flags are ignored.
-   */
-  bool all = false;
-
-  /**
-   * Enable the [ar][wp] format.
-   *
-   * [wp]: http://en.wikipedia.org/wiki/Ar_(Unix)
-   */
-  bool ar = false;
-
-  /**
-   * Enable the [cpio][wp] format.
-   *
-   * [wp]: http://en.wikipedia.org/wiki/Cpio
-   */
-  bool cpio = false;
-
-  /** Enable treating empty files as archives with no entries. */
-  bool empty = false;
-
-  /**
-   * Enable the [ISO 9660][wp] format.
-   *
-   * [wp]: http://en.wikipedia.org/wiki/ISO_9660
-   */
-  bool iso9660 = false;
-
-  /**
-   * Enable the [mtree][wiki] format.
-   *
-   * [wiki]: https://github.com/libarchive/libarchive/wiki/ManPageMtree5
-   */
-  bool mtree = false;
-
-  /** Enable treating unknown files as archives containing a single file. */
-  bool raw = false;
-
-  /**
-   * Enable the [tar][wp] format.
-   *
-   * [wp]: http://en.wikipedia.org/wiki/Tar_(file_format)
-   */
-  bool tar = false;
-
-  /**
-   * Enable the [zip][wp] format.
-   *
-   * [wp]: http://en.wikipedia.org/wiki/ZIP_(file_format)
-   */
-  bool zip = false;
-
-
-  /**
-   * Options for individual formats. See [the libarchive documentation][wiki]
-   * for a list of available options.
-   *
-   * [wiki]: https://github.com/libarchive/libarchive/wiki/ManPageArchiveReadSetOptions3
-   */
-  final ArchiveOptions options;
-
-  Format._() : options = new ArchiveOptions();
-}
diff --git a/utils/archive/reader.h b/utils/archive/reader.h
deleted file mode 100644
index ac73d6e..0000000
--- a/utils/archive/reader.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * This file declares request-handling functions for reading archives. Each
- * function is called when a message is received with the corresponding request
- * type, and posts a success or error response to the reply port.
- *
- * There is a close correspondence between functions here and the libarchive
- * API. It's left up to the Dart code to present a more Darty API. As such,
- * documentation of these functions is omitted, since it's available in the
- * libarchive documentation.
- */
-#ifndef DART_ARCHIVE_READER_H_
-#define DART_ARCHIVE_READER_H_
-
-#include "dart_archive.h"
-
-void archiveReadNew(Dart_Port p);
-
-void archiveReadSupportFilterAll(Dart_Port p, struct archive* a);
-
-void archiveReadSupportFilterBzip2(Dart_Port p, struct archive* a);
-
-void archiveReadSupportFilterCompress(Dart_Port p, struct archive* a);
-
-void archiveReadSupportFilterGzip(Dart_Port p, struct archive* a);
-
-void archiveReadSupportFilterLzma(Dart_Port p, struct archive* a);
-
-void archiveReadSupportFilterXz(Dart_Port p, struct archive* a);
-
-void archiveReadSupportFilterProgram(Dart_Port p, struct archive* a,
-                                     Dart_CObject* request);
-
-void archiveReadSupportFilterProgramSignature(
-    Dart_Port p, struct archive* a, Dart_CObject* request);
-
-void archiveReadSupportFormatAll(Dart_Port p, struct archive* a);
-
-void archiveReadSupportFormatAr(Dart_Port p, struct archive* a);
-
-void archiveReadSupportFormatCpio(Dart_Port p, struct archive* a);
-
-void archiveReadSupportFormatEmpty(Dart_Port p, struct archive* a);
-
-void archiveReadSupportFormatIso9660(Dart_Port p, struct archive* a);
-
-void archiveReadSupportFormatMtree(Dart_Port p, struct archive* a);
-
-void archiveReadSupportFormatRaw(Dart_Port p, struct archive* a);
-
-void archiveReadSupportFormatTar(Dart_Port p, struct archive* a);
-
-void archiveReadSupportFormatZip(Dart_Port p, struct archive* a);
-
-void archiveReadSetFilterOption(Dart_Port p, struct archive* a,
-                                Dart_CObject* request);
-
-void archiveReadSetFormatOption(Dart_Port p, struct archive* a,
-                                Dart_CObject* request);
-
-void archiveReadSetOption(Dart_Port p, struct archive* a,
-                          Dart_CObject* request);
-
-void archiveReadOpenFilename(Dart_Port p, struct archive* a,
-                             Dart_CObject* request);
-
-void archiveReadOpenMemory(Dart_Port p, struct archive* a,
-                           Dart_CObject* request);
-
-void archiveReadNextHeader(Dart_Port p, struct archive* a);
-
-void archiveReadDataBlock(Dart_Port p, struct archive* a);
-
-void archiveReadDataSkip(Dart_Port p, struct archive* a);
-
-void archiveReadClose(Dart_Port p, struct archive* a);
-
-void archiveReadFree(Dart_Port p, struct archive* a);
-
-#endif  // DART_ARCHIVE_READER_H_
diff --git a/utils/archive/utils.dart b/utils/archive/utils.dart
deleted file mode 100644
index a5e0219..0000000
--- a/utils/archive/utils.dart
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library utils;
-
-import 'dart-ext:dart_archive';
-import 'dart:isolate';
-import 'archive.dart' as archive;
-
-/** The cache of the port used to communicate with the C extension. */
-SendPort _port;
-
-/** The port used to communicate with the C extension. */
-SendPort get servicePort {
-  if (_port == null) _port = _newServicePort();
-  return _port;
-}
-
-/** Creates a new port to communicate with the C extension. */
-SendPort _newServicePort() native "Archive_ServicePort";
-
-/**
- * Send a message to the C extension.
- *
- * [requestType] is the specific request id to send. [id] is the id of the
- * archive; it may be null for requests that don't operate on a specific
- * archive. [args] are arguments that will be passed on to the extension. They
- * should all be C-safe.
- *
- * Returns a future that completes with the C extension's reply.
- */
-Future call(int requestType, [int id, List args]) {
-  var fullArgs = [requestType, id];
-  if (args != null) fullArgs.addAll(args);
-  return servicePort.call(listForC(fullArgs)).then((response) {
-    var success = response[0];
-    var errno = response[1];
-    var message = response[2];
-
-    if (!success) throw new ArchiveException(message, errno);
-    return message;
-  });
-}
-
-/** Converts [input] to a fixed-length list which C can understand. */
-List listForC(List input) {
-  var list = new List.fixedLength(input.length);
-  list.setRange(0, input.length, input);
-  return list;
-}
-
-/** Converts [input] to a [Uint8List] that C can process easily. */
-Uint8List bytesForC(List<int> input) {
-  var list = new Uint8List(input.length);
-  list.setRange(0, input.length, input);
-  return list;
-}
-
-/**
- * Attaches [callback] as a finalizer for [object]. After [object] has been
- * garbage collected, [callback] will be called and passed [peer] as an
- * argument.
- *
- * Neither [callback] nor [peer] should contain any references to [object];
- * otherwise, [object] will never be collected and [callback] will never be
- * called.
- */
-void attachFinalizer(object, void callback(peer), [peer]) {}
-
-// TODO(nweiz): re-enable this once issue 4378 is fixed.
-// void attachFinalizer(object, void callback(peer), [peer])
-//     native "Archive_AttachFinalizer";
-
-/**
- * A reference to a single value.
- *
- * This is primarily meant to be used when a finalizer needs to refer to a field
- * on the object being finalized that may be set to null during the lifetime of
- * the object. Since the object itself has been garbage collected once the
- * finalizer runs, it needs a second-order reference to check if the field is
- * null.
- */
-class Reference<E> {
-  E value;
-  Reference(this.value);
-}
-
-/**
- * Returns a [Future] that completes immediately upon hitting the event loop.
- */
-Future async() {
-  var completer = new Completer();
-  new Timer(0, (_) => completer.complete(null));
-  return completer.future;
-}
-
-/** An error raised by the archive library. */
-class ArchiveException implements archive.ArchiveException {
-  /** A description of the error that occurred. */   
-  final String message;
-
-  /** The error code for the error, or null. */
-  final int errno;
-
-  ArchiveException(this.message, [this.errno]);
-
-  String toString() {
-    if (errno == null) return "Archive error: $message";
-    return "Archive error $errno: $message";
-  }
-}
diff --git a/utils/pub/error_group.dart b/utils/pub/error_group.dart
new file mode 100644
index 0000000..a9f7861
--- /dev/null
+++ b/utils/pub/error_group.dart
@@ -0,0 +1,268 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library error_group;
+
+import 'dart:async';
+
+/// An [ErrorGroup] entangles the errors of multiple [Future]s and [Stream]s
+/// with one another. This allows APIs to expose multiple [Future]s and
+/// [Stream]s that have identical error conditions without forcing API consumers
+/// to attach error handling to objects they don't care about.
+///
+/// To use an [ErrorGroup], register [Future]s and [Stream]s with it using
+/// [registerFuture] and [registerStream]. These methods return wrapped versions
+/// of the [Future]s and [Stream]s, which should then be used in place of the
+/// originals. For example:
+///
+///     var errorGroup = new ErrorGroup();
+///     future = errorGroup.registerFuture(future);
+///     stream = errorGroup.registerStream(stream);
+///
+/// An [ErrorGroup] has two major effects on its wrapped members:
+///
+/// * An error in any member of the group will be propagated to every member
+///   that hasn't already completed. If those members later complete, their
+///   values will be ignored.
+/// * If any member of this group has a listener, errors on members without
+///   listeners won't get passed to the top-level error handler.
+class ErrorGroup {
+  /// The [Future]s that are members of [this].
+  final _futures = <_ErrorGroupFuture>[];
+
+  /// The [Stream]s that are members of [this].
+  final _streams = <_ErrorGroupStream>[];
+
+  /// Whether [this] has completed, either successfully or with an error.
+  var _isDone = false;
+
+  /// The [Completer] for [done].
+  final _doneCompleter = new Completer();
+
+  /// The underlying [Future] for [done]. We need to be able to access it
+  /// internally as an [_ErrorGroupFuture] so we can check if it has listeners
+  /// and signal errors on it.
+  _ErrorGroupFuture _done;
+
+  /// Returns a [Future] that completes successully when all members of [this]
+  /// are complete, or with an error if any member receives an error.
+  ///
+  /// This [Future] is effectively in the group in that an error on it won't be
+  /// passed to the top-level error handler unless no members of the group have
+  /// listeners attached.
+  Future get done => _done;
+
+  /// Creates a new group with no members.
+  ErrorGroup() {
+    this._done = new _ErrorGroupFuture(this, _doneCompleter.future);
+  }
+
+  /// Registers a [Future] as a member of [this]. Returns a wrapped version of
+  /// [future] that should be used in its place.
+  ///
+  /// If all members of [this] have already completed successfully or with an
+  /// error, it's a [StateError] to try to register a new [Future].
+  Future registerFuture(Future future) {
+    if (_isDone) {
+      throw new StateError("Can't register new members on a complete "
+          "ErrorGroup.");
+    }
+
+    var wrapped = new _ErrorGroupFuture(this, future);
+    _futures.add(wrapped);
+    return wrapped;
+  }
+
+  /// Registers a [Stream] as a member of [this]. Returns a wrapped version of
+  /// [stream] that should be used in its place. The returned [Stream] will be
+  /// multi-subscription if and only if [stream] is.
+  ///
+  /// Since all errors in a group are passed to all members, the returned
+  /// [Stream] will automatically unsubscribe all its listeners when it
+  /// encounters an error.
+  ///
+  /// If all members of [this] have already completed successfully or with an
+  /// error, it's a [StateError] to try to register a new [Stream].
+  Stream registerStream(Stream stream) {
+    if (_isDone) {
+      throw new StateError("Can't register new members on a complete "
+          "ErrorGroup.");
+    }
+
+    var wrapped = new _ErrorGroupStream(this, stream);
+    _streams.add(wrapped);
+    return wrapped;
+  }
+
+  /// Sends [error] to all members of [this]. Like errors that come from
+  /// members, this will only be passed to the top-level error handler if no
+  /// members have listeners.
+  ///
+  /// If all members of [this] have already completed successfully or with an
+  /// error, it's a [StateError] to try to signal an error.
+  void signalError(AsyncError error) {
+    if (_isDone) {
+      throw new StateError("Can't signal errors on a complete ErrorGroup.");
+    }
+
+    _signalError(error);
+  }
+
+  /// Signal an error internally. This is just like [signalError], but instead
+  /// of throwing an error if [this] is complete, it just does nothing.
+  void _signalError(AsyncError error) {
+    if (_isDone) return;
+
+    var caught = false;
+    for (var future in _futures) {
+      if (future._isDone || future._hasListeners) caught = true;
+      future._signalError(error);
+    }
+
+    for (var stream in _streams) {
+      if (stream._isDone || stream._hasListeners) caught = true;
+      stream._signalError(error);
+    }
+
+    _isDone = true;
+    _done._signalError(error);
+    if (!caught && !_done._hasListeners) error.throwDelayed();
+  }
+
+  /// Notifies [this] that one of its member [Future]s is complete.
+  void _signalFutureComplete(_ErrorGroupFuture future) {
+    if (_isDone) return;
+
+    _isDone = _futures.every((future) => future._isDone) &&
+        _streams.every((stream) => stream._isDone);
+    if (_isDone) _doneCompleter.complete();
+  }
+
+  /// Notifies [this] that one of its member [Stream]s is complete.
+  void _signalStreamComplete(_ErrorGroupStream stream) {
+    if (_isDone) return;
+
+    _isDone = _futures.every((future) => future._isDone) &&
+        _streams.every((stream) => stream._isDone);
+    if (_isDone) _doneCompleter.complete();
+  }
+}
+
+/// A [Future] wrapper that keeps track of whether it's been completed and
+/// whether it has any listeners. It also notifies its parent [ErrorGroup] when
+/// it completes successfully or receives an error.
+class _ErrorGroupFuture implements Future {
+  /// The parent [ErrorGroup].
+  final ErrorGroup _group;
+
+  /// Whether [this] has completed, either successfully or with an error.
+  var _isDone = false;
+
+  /// The underlying [Completer] for [this].
+  final _completer = new Completer();
+
+  /// Whether [this] has any listeners.
+  bool _hasListeners = false;
+
+  /// Creates a new [_ErrorGroupFuture] that's a child of [_group] and wraps
+  /// [inner].
+  _ErrorGroupFuture(this._group, Future inner) {
+    inner.then((value) {
+      if (!_isDone) _completer.complete(value);
+      _isDone = true;
+      _group._signalFutureComplete(this);
+    }).catchError((error) => _group._signalError(error));
+
+    // Make sure _completer.future doesn't automatically send errors to the
+    // top-level.
+    _completer.future.catchError((_) {});
+  }
+
+  Future then(onValue(T value), {onError(AsyncError asyncError)}) {
+    _hasListeners = true;
+    return _completer.future.then(onValue, onError: onError);
+  }
+
+  Future catchError(onError(AsyncError asyncError), {bool test(Object error)}) {
+    _hasListeners = true;
+    return _completer.future.catchError(onError, test: test);
+  }
+
+  Future whenComplete(void action()) {
+    _hasListeners = true;
+    return _completer.future.whenComplete(action);
+  }
+
+  Stream<T> asStream() {
+    _hasListeners = true;
+    return _completer.future.asStream();
+  }
+
+  /// Signal that an error from [_group] should be propagated through [this],
+  /// unless it's already complete.
+  void _signalError(AsyncError error) {
+    if (!_isDone) _completer.completeError(error.error, error.stackTrace);
+    _isDone = true;
+  }
+}
+
+// TODO(nweiz): currently streams never top-level unhandled errors (issue 7843).
+// When this is fixed, this class will need to prevent such errors from being
+// top-leveled.
+/// A [Stream] wrapper that keeps track of whether it's been completed and
+/// whether it has any listeners. It also notifies its parent [ErrorGroup] when
+/// it completes successfully or receives an error.
+class _ErrorGroupStream extends Stream {
+  /// The parent [ErrorGroup].
+  final ErrorGroup _group;
+
+  /// Whether [this] has completed, either successfully or with an error.
+  var _isDone = false;
+
+  /// The underlying [StreamController] for [this].
+  final StreamController _controller;
+
+  /// The [StreamSubscription] that connects the wrapped [Stream] to
+  /// [_controller].
+  StreamSubscription _subscription;
+
+  /// Whether [this] has any listeners.
+  bool get _hasListeners => _controller.hasSubscribers;
+
+  /// Creates a new [_ErrorGroupFuture] that's a child of [_group] and wraps
+  /// [inner].
+  _ErrorGroupStream(this._group, Stream inner)
+    : _controller = inner.isSingleSubscription ?
+          new StreamController() :
+          new StreamController.multiSubscription() {
+    _subscription = inner.listen(_controller.add,
+        onError: (e) => _group._signalError(e),
+        onDone: () {
+          _isDone = true;
+          _group._signalStreamComplete(this);
+          _controller.close();
+        });
+  }
+
+  StreamSubscription listen(void onData(value),
+      {void onError(AsyncError error), void onDone(),
+       bool unsubscribeOnError}) {
+    return _controller.stream.listen(onData,
+        onError: onError,
+        onDone: onDone,
+        unsubscribeOnError: true);
+  }
+
+  /// Signal that an error from [_group] should be propagated through [this],
+  /// unless it's already complete.
+  void _signalError(AsyncError e) {
+    if (_isDone) return;
+    _subscription.cancel();
+    // Call these asynchronously to work around issue 7913.
+    new Future.immediate(null).then((_) {
+      _controller.signalError(e.error, e.stackTrace);
+      _controller.close();
+    });
+  }
+}
diff --git a/utils/pub/io.dart b/utils/pub/io.dart
index f70849f..b227378 100644
--- a/utils/pub/io.dart
+++ b/utils/pub/io.dart
@@ -563,8 +563,11 @@
 
 /// Wraps [stream] in a single-subscription [Stream] that emits the same data.
 Stream<List<int>> wrapInputStream(InputStream stream) {
-  var controller = new StreamController.singleSubscription();
-  if (stream.closed) return controller..close();
+  var controller = new StreamController();
+  if (stream.closed) {
+    controller.close();
+    return controller.stream;
+  }
 
   stream.onClosed = controller.close;
   stream.onData = () => controller.add(stream.read());
diff --git a/utils/tests/pub/command_line_config.dart b/utils/tests/pub/command_line_config.dart
new file mode 100644
index 0000000..6b61a45
--- /dev/null
+++ b/utils/tests/pub/command_line_config.dart
@@ -0,0 +1,139 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. 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_line_config;
+
+import 'dart:io';
+
+import '../../../pkg/unittest/lib/unittest.dart';
+import '../../pub/utils.dart';
+
+const _GREEN = '\u001b[32m';
+const _RED = '\u001b[31m';
+const _MAGENTA = '\u001b[35m';
+const _NONE = '\u001b[0m';
+
+/// Pretty Unicode characters!
+const _CHECKBOX = '\u2713';
+const _BALLOT_X = '\u2717';
+
+/// A custom unittest configuration for running the pub tests from the
+/// command-line and generating human-friendly output.
+class CommandLineConfiguration extends Configuration {
+  void onInit() {
+    // Do nothing. Overridden to prevent the base class from printing.
+  }
+
+  void onTestResult(TestCase testCase) {
+    var result;
+    switch (testCase.result) {
+      case PASS: result = '$_GREEN$_CHECKBOX$_NONE'; break;
+      case FAIL: result = '$_RED$_BALLOT_X$_NONE'; break;
+      case ERROR: result = '$_MAGENTA?$_NONE'; break;
+    }
+    print('$result ${testCase.description}');
+
+    if (testCase.message != '') {
+      print(_indent(testCase.message));
+    }
+
+    _printStackTrace(testCase.stackTrace);
+
+    currentTestCase = null;
+  }
+
+  void onSummary(int passed, int failed, int errors, List<TestCase> results,
+      String uncaughtError) {
+    var success = false;
+    if (uncaughtError != null) {
+      print('Top-level uncaught error: $uncaughtError');
+    } else if (errors != 0) {
+      print('${_GREEN}$passed${_NONE} passed, ${_RED}$failed${_NONE} failed, '
+            '${_MAGENTA}$errors${_NONE} errors.');
+    } else if (failed != 0) {
+      print('${_GREEN}$passed${_NONE} passed, ${_RED}$failed${_NONE} '
+            'failed.');
+    } else if (passed == 0) {
+      print('No tests found.');
+    } else {
+      print('All ${_GREEN}$passed${_NONE} tests passed!');
+      success = true;
+    }
+  }
+
+  void onDone(bool success) {
+    if (!success) exit(1);
+  }
+
+  void _printStackTrace(String stackTrace) {
+    if (stackTrace == null || stackTrace == '') return;
+
+    // Parse out each stack entry.
+    var regexp = new RegExp(r'#\d+\s+(.*) \(file:///([^)]+)\)');
+    var stack = [];
+    for (var line in stackTrace.split('\n')) {
+      if (line.trim() == '') continue;
+
+      var match = regexp.firstMatch(line);
+      if (match == null) throw "Couldn't clean up stack trace line '$line'.";
+      stack.add(new Pair(match[2], match[1]));
+    }
+
+    if (stack.length == 0) return;
+
+    // Find the common prefixes of the paths.
+    var common = 0;
+    while (true) {
+      var matching = true;
+      // TODO(bob): Handle empty stack.
+      var c = stack[0].first[common];
+      for (var pair in stack) {
+        if (pair.first.length <= common || pair.first[common] != c) {
+          matching = false;
+          break;
+        }
+      }
+
+      if (!matching) break;
+      common++;
+    }
+
+    // Remove them.
+    if (common > 0) {
+      for (var pair in stack) {
+        pair.first = pair.first.substring(common);
+      }
+    }
+
+    // Figure out the longest path so we know how much to pad.
+    int longest = stack.mappedBy((pair) => pair.first.length).max();
+
+    // Print out the stack trace nicely formatted.
+    for (var pair in stack) {
+      var path = pair.first;
+      path = path.replaceFirst(':', ' ');
+      print('  ${_padLeft(path, longest)}  ${pair.last}');
+    }
+
+    print('');
+  }
+
+  String _padLeft(String string, int length) {
+    if (string.length >= length) return string;
+
+    var result = new StringBuffer();
+    result.add(string);
+    for (var i = 0; i < length - string.length; i++) {
+      result.add(' ');
+    }
+
+    return result.toString();
+  }
+
+  String _indent(String str) {
+    // TODO(nweiz): Use this simpler code once issue 2980 is fixed.
+    // return str.replaceAll(new RegExp("^", multiLine: true), "  ");
+    return Strings.join(str.split("\n").mappedBy((line) => "  $line"), "\n");
+  }
+}
diff --git a/utils/tests/pub/curl_client_test.dart b/utils/tests/pub/curl_client_test.dart
index eda16bf..372a331 100644
--- a/utils/tests/pub/curl_client_test.dart
+++ b/utils/tests/pub/curl_client_test.dart
@@ -168,7 +168,7 @@
   }
 }
 
-// TODO(nweiz): remove this once it's built in to unittest
+// TODO(nweiz): remove this once it's built in to unittest (issue 7922).
 /// A matcher for StateErrors.
 const isStateError = const _StateError();
 
diff --git a/utils/tests/pub/error_group_test.dart b/utils/tests/pub/error_group_test.dart
new file mode 100644
index 0000000..e6f8769
--- /dev/null
+++ b/utils/tests/pub/error_group_test.dart
@@ -0,0 +1,466 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library error_group_test;
+
+import 'dart:async';
+
+import '../../../pkg/unittest/lib/unittest.dart';
+import '../../pub/error_group.dart';
+import '../../pub/utils.dart';
+
+ErrorGroup errorGroup;
+
+// TODO(nweiz): once there's a global error handler, we should test that it does
+// and does not get called at appropriate times. See issue 5958.
+//
+// One particular thing we should test that has no tests now is that a stream
+// that has a subscription added and subsequently canceled counts as having no
+// listeners.
+
+main() {
+  group('with no futures or streams', () {
+    setUp(() {
+      errorGroup = new ErrorGroup();
+    });
+
+    test('should pass signaled errors to .done', () {
+      expect(errorGroup.done, throwsFormatException);
+      errorGroup.signalError(new AsyncError(new FormatException()));
+    });
+
+    test("shouldn't allow additional futures or streams once an error has been "
+        "signaled", () {
+      expect(errorGroup.done, throwsFormatException);
+      errorGroup.signalError(new AsyncError(new FormatException()));
+
+      expect(() => errorGroup.registerFuture(new Future.immediate(null)),
+          throwsStateError);
+      expect(() => errorGroup.registerStream(new StreamController().stream),
+          throwsStateError);
+    });
+  });
+
+  group('with a single future', () {
+    Completer completer;
+    Future future;
+
+    setUp(() {
+      errorGroup = new ErrorGroup();
+      completer = new Completer();
+      future = errorGroup.registerFuture(completer.future);
+    });
+
+    test('should pass through a value from the future', () {
+      expect(future, completion(equals('value')));
+      expect(errorGroup.done, completes);
+      completer.complete('value');
+    });
+
+    test("shouldn't allow additional futures or streams once .done has "
+        "been called", () {
+      completer.complete('value');
+
+      expect(() => errorGroup.registerFuture(new Future.immediate(null)),
+          throwsStateError);
+      expect(() => errorGroup.registerStream(new StreamController().stream),
+          throwsStateError);
+    });
+
+    test('should pass through an exception from the future if it has a '
+        'listener', () {
+      expect(future, throwsFormatException);
+      // errorGroup shouldn't top-level the exception
+      completer.completeError(new FormatException());
+    });
+
+    test('should notify the error group of an exception from the future even '
+        'if it has a listener', () {
+      expect(future, throwsFormatException);
+      expect(errorGroup.done, throwsFormatException);
+      completer.completeError(new FormatException());
+    });
+
+    test('should pass a signaled exception to the future if it has a listener '
+        'and should ignore a subsequent value from that future', () {
+      expect(future, throwsFormatException);
+      // errorGroup shouldn't top-level the exception
+      errorGroup.signalError(new AsyncError(new FormatException()));
+      completer.complete('value');
+    });
+
+    test('should pass a signaled exception to the future if it has a listener '
+        'and should ignore a subsequent exception from that future', () {
+      expect(future, throwsFormatException);
+      // errorGroup shouldn't top-level the exception
+      errorGroup.signalError(new AsyncError(new FormatException()));
+      completer.completeError(new ArgumentError());
+    });
+
+    test('should notify the error group of a signaled exception even if the '
+        'future has a listener', () {
+      expect(future, throwsFormatException);
+      expect(errorGroup.done, throwsFormatException);
+      errorGroup.signalError(new AsyncError(new FormatException()));
+    });
+
+    test("should complete .done if the future receives a value even if the "
+        "future doesn't have a listener", () {
+      expect(errorGroup.done, completes);
+      completer.complete('value');
+
+      // A listener added afterwards should receive the value
+      expect(errorGroup.done.then((_) => future),
+          completion(equals('value')));
+    });
+
+    test("should pipe an exception from the future to .done if the future "
+        "doesn't have a listener", () {
+      expect(errorGroup.done, throwsFormatException);
+      completer.completeError(new FormatException());
+
+      // A listener added afterwards should receive the exception
+      expect(errorGroup.done.catchError((_) {
+        expect(future, throwsFormatException);
+      }), completes);
+    });
+
+    test("should pass a signaled exception to .done if the future doesn't have "
+        "a listener",
+        () {
+      expect(errorGroup.done, throwsFormatException);
+      errorGroup.signalError(new AsyncError(new FormatException()));
+
+      // A listener added afterwards should receive the exception
+      expect(errorGroup.done.catchError((_) {
+        completer.complete('value'); // should be ignored
+        expect(future, throwsFormatException);
+      }), completes);
+    });
+  });
+
+  group('with multiple futures', () {
+    Completer completer1;
+    Completer completer2;
+    Future future1;
+    Future future2;
+
+    setUp(() {
+      errorGroup = new ErrorGroup();
+      completer1 = new Completer();
+      completer2 = new Completer();
+      future1 = errorGroup.registerFuture(completer1.future);
+      future2 = errorGroup.registerFuture(completer2.future);
+    });
+
+    test("should pipe exceptions from one future to the other and to "
+        ".complete", () {
+      expect(future1, throwsFormatException);
+      expect(future2, throwsFormatException);
+      expect(errorGroup.done, throwsFormatException);
+
+      completer1.completeError(new FormatException());
+    });
+
+    test("each future should be able to complete with a value "
+        "independently", () {
+      expect(future1, completion(equals('value1')));
+      expect(future2, completion(equals('value2')));
+      expect(errorGroup.done, completes);
+
+      completer1.complete('value1');
+      completer2.complete('value2');
+    });
+
+    test("shouldn't throw a top-level exception if a future receives an error "
+        "after the other listened future completes", () {
+      expect(future1, completion(equals('value')));
+      completer1.complete('value');
+
+      expect(future1.then((_) {
+        // shouldn't cause a top-level exception
+        completer2.completeError(new FormatException());
+      }), completes);
+    });
+
+    test("shouldn't throw a top-level exception if an error is signaled after "
+        "one listened future completes", () {
+      expect(future1, completion(equals('value')));
+      completer1.complete('value');
+
+      expect(future1.then((_) {
+        // shouldn't cause a top-level exception
+        errorGroup.signalError(new AsyncError(new FormatException()));
+      }), completes);
+    });
+  });
+
+  group('with a single stream', () {
+    StreamController controller;
+    Stream stream;
+
+    setUp(() {
+      errorGroup = new ErrorGroup();
+      controller = new StreamController.multiSubscription();
+      stream = errorGroup.registerStream(controller.stream);
+    });
+
+    test('should pass through values from the stream', () {
+      expect(stream.elementAt(0), completion(equals(1)));
+      expect(stream.elementAt(1), completion(equals(2)));
+      expect(errorGroup.done, completes);
+
+      controller..add(1)..add(2)..close();
+    });
+
+    test('should pass through an error from the stream if it has a '
+        'listener', () {
+      expect(stream.first, throwsFormatException);
+      // errorGroup shouldn't top-level the exception
+      controller.signalError(new AsyncError(new FormatException()));
+    });
+
+    test('should notify the error group of an exception from the stream even '
+        'if it has a listener', () {
+      expect(stream.first, throwsFormatException);
+      expect(errorGroup.done, throwsFormatException);
+      controller.signalError(new AsyncError(new FormatException()));
+    });
+
+    test('should pass a signaled exception to the stream if it has a listener '
+        'and should unsubscribe that stream', () {
+      expect(stream.first, throwsFormatException);
+      // errorGroup shouldn't top-level the exception
+      errorGroup.signalError(new AsyncError(new FormatException()));
+
+      expect(stream.first.catchError((_) {
+        controller.add('value');
+        return stream.isEmpty;
+      }), completion(isTrue));
+    });
+
+    test('should notify the error group of a signaled exception even if the '
+        'stream has a listener', () {
+      expect(stream.first, throwsFormatException);
+      expect(errorGroup.done, throwsFormatException);
+      errorGroup.signalError(new AsyncError(new FormatException()));
+    });
+
+    test("should complete .done when the stream is done even if the stream "
+        "doesn't have a listener", () {
+      expect(errorGroup.done, completes);
+      controller.add('value');
+      controller.close();
+
+      // A listener added afterwards should see an empty stream, since it's not
+      // single-subscription
+      expect(errorGroup.done.then((_) => stream.toList()),
+          completion(isEmpty));
+    });
+
+    test("should pipe an exception from the stream to .done if the stream "
+        "doesn't have a listener", () {
+      expect(errorGroup.done, throwsFormatException);
+      controller.signalError(new AsyncError(new FormatException()));
+
+      // A listener added afterwards should see an empty stream, since it's not
+      // single-subscription
+      expect(errorGroup.done.catchError((_) {
+        controller.add('value'); // should be ignored
+        return stream.toList();
+      }), completion(isEmpty));
+    });
+
+    test("should pass a signaled exception to .done if the stream doesn't "
+        "have a listener",
+        () {
+      expect(errorGroup.done, throwsFormatException);
+      errorGroup.signalError(new AsyncError(new FormatException()));
+
+      // A listener added afterwards should receive the exception
+      expect(errorGroup.done.catchError((_) {
+        controller.add('value'); // should be ignored
+        return stream.toList();
+      }), completion(isEmpty));
+    });
+  });
+
+  group('with a single single-subscription stream', () {
+    StreamController controller;
+    Stream stream;
+
+    setUp(() {
+      errorGroup = new ErrorGroup();
+      controller = new StreamController();
+      stream = errorGroup.registerStream(controller.stream);
+    });
+
+    test("should complete .done when the stream is done even if the stream "
+        "doesn't have a listener", () {
+      expect(errorGroup.done, completes);
+      controller.add('value');
+      controller.close();
+
+      // A listener added afterwards should receive the value
+      expect(errorGroup.done.then((_) => stream.toList()),
+          completion(equals(['value'])));
+    });
+
+    test("should pipe an exception from the stream to .done if the stream "
+        "doesn't have a listener", () {
+      expect(errorGroup.done, throwsFormatException);
+      controller.signalError(new AsyncError(new FormatException()));
+
+      // A listener added afterwards should receive the exception
+      expect(errorGroup.done.catchError((_) {
+        controller.add('value'); // should be ignored
+        expect(stream.first, throwsFormatException);
+      }), completes);
+    });
+
+    test("should pass a signaled exception to .done if the stream doesn't "
+        "have a listener",
+        () {
+      expect(errorGroup.done, throwsFormatException);
+      errorGroup.signalError(new AsyncError(new FormatException()));
+
+      // A listener added afterwards should receive the exception
+      expect(errorGroup.done.catchError((_) {
+        controller.add('value'); // should be ignored
+        expect(stream.first, throwsFormatException);
+      }), completes);
+    });
+  });
+
+  group('with multiple streams', () {
+    StreamController controller1;
+    StreamController controller2;
+    Stream stream1;
+    Stream stream2;
+
+    setUp(() {
+      errorGroup = new ErrorGroup();
+      controller1 = new StreamController.multiSubscription();
+      controller2 = new StreamController.multiSubscription();
+      stream1 = errorGroup.registerStream(controller1.stream);
+      stream2 = errorGroup.registerStream(controller2.stream);
+    });
+
+    test("should pipe exceptions from one stream to the other and to .done",
+        () {
+      expect(stream1.first, throwsFormatException);
+      expect(stream2.first, throwsFormatException);
+      expect(errorGroup.done, throwsFormatException);
+
+      controller1.signalError(new AsyncError(new FormatException()));
+    });
+
+    test("each future should be able to emit values independently", () {
+      expect(stream1.toList(), completion(equals(['value1.1', 'value1.2'])));
+      expect(stream2.toList(), completion(equals(['value2.1', 'value2.2'])));
+      expect(errorGroup.done, completes);
+
+      controller1..add('value1.1')..add('value1.2')..close();
+      controller2..add('value2.1')..add('value2.2')..close();
+    });
+
+    test("shouldn't throw a top-level exception if a stream receives an error "
+        "after the other listened stream completes", () {
+      expect(stream1.toList(), completion(equals(['value1', 'value2'])));
+      controller1..add('value1')..add('value2')..close();
+
+      expect(stream1.toList().then((_) {
+        // shouldn't cause a top-level exception
+        controller2.signalError(new AsyncError(new FormatException()));
+      }), completes);
+    });
+
+    test("shouldn't throw a top-level exception if an error is signaled after "
+        "one listened stream completes", () {
+      expect(stream1.toList(), completion(equals(['value1', 'value2'])));
+      controller1..add('value1')..add('value2')..close();
+
+      expect(stream1.toList().then((_) {
+        // shouldn't cause a top-level exception
+        errorGroup.signalError(new AsyncError(new FormatException()));
+      }), completes);
+    });
+  });
+
+  group('with a stream and a future', () {
+    StreamController controller;
+    Stream stream;
+    Completer completer;
+    Future future;
+
+    setUp(() {
+      errorGroup = new ErrorGroup();
+      controller = new StreamController.multiSubscription();
+      stream = errorGroup.registerStream(controller.stream);
+      completer = new Completer();
+      future = errorGroup.registerFuture(completer.future);
+    });
+
+    test("should pipe exceptions from the stream to the future", () {
+      expect(stream.first, throwsFormatException);
+      expect(future, throwsFormatException);
+      expect(errorGroup.done, throwsFormatException);
+
+      controller.signalError(new AsyncError(new FormatException()));
+    });
+
+    test("should pipe exceptions from the future to the stream", () {
+      expect(stream.first, throwsFormatException);
+      expect(future, throwsFormatException);
+      expect(errorGroup.done, throwsFormatException);
+
+      completer.completeError(new FormatException());
+    });
+
+    test("the stream and the future should be able to complete/emit values "
+        "independently", () {
+      expect(stream.toList(), completion(equals(['value1.1', 'value1.2'])));
+      expect(future, completion(equals('value2.0')));
+      expect(errorGroup.done, completes);
+
+      controller..add('value1.1')..add('value1.2')..close();
+      completer.complete('value2.0');
+    });
+
+    test("shouldn't throw a top-level exception if the stream receives an error "
+        "after the listened future completes", () {
+      expect(future, completion(equals('value')));
+      completer.complete('value');
+
+      expect(future.then((_) {
+        // shouldn't cause a top-level exception
+        controller.signalError(new AsyncError(new FormatException()));
+      }), completes);
+    });
+
+    test("shouldn't throw a top-level exception if the future receives an "
+        "error after the listened stream completes", () {
+      expect(stream.toList(), completion(equals(['value1', 'value2'])));
+      controller..add('value1')..add('value2')..close();
+
+      expect(stream.toList().then((_) {
+        // shouldn't cause a top-level exception
+        completer.completeError(new FormatException());
+      }), completes);
+    });
+  });
+}
+
+// TODO(nweiz): remove this once it's built in to unittest (issue 7922).
+/// A matcher for StateErrors.
+const isStateError = const _StateError();
+
+/// A matcher for functions that throw StateError.
+const Matcher throwsStateError =
+    const Throws(isStateError);
+
+class _StateError extends TypeMatcher {
+  const _StateError() : super("StateError");
+  bool matches(item, MatchState matchState) => item is StateError;
+}
diff --git a/utils/tests/pub/install/git/check_out_and_update_test.dart b/utils/tests/pub/install/git/check_out_and_update_test.dart
index 4bcbba6..22fed50 100644
--- a/utils/tests/pub/install/git/check_out_and_update_test.dart
+++ b/utils/tests/pub/install/git/check_out_and_update_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('checks out and updates a package from Git', () {
+  integration('checks out and updates a package from Git', () {
     ensureGit();
 
     git('foo.git', [
@@ -63,7 +62,5 @@
         file('foo.dart', 'main() => "foo 2";')
       ])
     ]).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/git/check_out_branch_test.dart b/utils/tests/pub/install/git/check_out_branch_test.dart
index 4516f9c..42e65bd 100644
--- a/utils/tests/pub/install/git/check_out_branch_test.dart
+++ b/utils/tests/pub/install/git/check_out_branch_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('checks out a package at a specific branch from Git', () {
+  integration('checks out a package at a specific branch from Git', () {
     ensureGit();
 
     var repo = git('foo.git', [
@@ -35,7 +34,5 @@
         file('foo.dart', 'main() => "foo 1";')
       ])
     ]).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/git/check_out_revision_test.dart b/utils/tests/pub/install/git/check_out_revision_test.dart
index 8ef60f9..3f11693 100644
--- a/utils/tests/pub/install/git/check_out_revision_test.dart
+++ b/utils/tests/pub/install/git/check_out_revision_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('checks out a package at a specific revision from Git', () {
+  integration('checks out a package at a specific revision from Git', () {
     ensureGit();
 
     var repo = git('foo.git', [
@@ -35,7 +34,5 @@
         file('foo.dart', 'main() => "foo 1";')
       ])
     ]).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/git/check_out_test.dart b/utils/tests/pub/install/git/check_out_test.dart
index 6efa2be..f91fd1f 100644
--- a/utils/tests/pub/install/git/check_out_test.dart
+++ b/utils/tests/pub/install/git/check_out_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('checks out a package from Git', () {
+  integration('checks out a package from Git', () {
     ensureGit();
 
     git('foo.git', [
@@ -35,7 +34,5 @@
         file('foo.dart', 'main() => "foo";')
       ])
     ]).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/git/check_out_transitive_test.dart b/utils/tests/pub/install/git/check_out_transitive_test.dart
index 662dbc7..9f93e09 100644
--- a/utils/tests/pub/install/git/check_out_transitive_test.dart
+++ b/utils/tests/pub/install/git/check_out_transitive_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('checks out packages transitively from Git', () {
+  integration('checks out packages transitively from Git', () {
     ensureGit();
 
     git('foo.git', [
@@ -47,7 +46,5 @@
         file('bar.dart', 'main() => "bar";')
       ])
     ]).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/git/check_out_twice_test.dart b/utils/tests/pub/install/git/check_out_twice_test.dart
index ea07651..8195a25 100644
--- a/utils/tests/pub/install/git/check_out_twice_test.dart
+++ b/utils/tests/pub/install/git/check_out_twice_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('checks out a package from Git twice', () {
+  integration('checks out a package from Git twice', () {
     ensureGit();
 
     git('foo.git', [
@@ -43,7 +42,5 @@
     // in the cache.
     schedulePub(args: ['install'],
         output: new RegExp(r"Dependencies installed!$"));
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/git/check_out_with_trailing_slash_test.dart b/utils/tests/pub/install/git/check_out_with_trailing_slash_test.dart
index 5dd7f41..eee21d4 100644
--- a/utils/tests/pub/install/git/check_out_with_trailing_slash_test.dart
+++ b/utils/tests/pub/install/git/check_out_with_trailing_slash_test.dart
@@ -6,12 +6,12 @@
 
 import 'dart:io';
 
-import '../../test_pub.dart';
 import '../../../../../pkg/unittest/lib/unittest.dart';
+import '../../test_pub.dart';
 
 main() {
   group("(regression)", () {
-    test('checks out a package from Git with a trailing slash', () {
+    integration('checks out a package from Git with a trailing slash', () {
       ensureGit();
 
       git('foo.git', [
@@ -36,8 +36,6 @@
           file('foo.dart', 'main() => "foo";')
         ])
       ]).scheduleValidate();
-
-      run();
     });
   });
 }
diff --git a/utils/tests/pub/install/git/dependency_name_match_pubspec_test.dart b/utils/tests/pub/install/git/dependency_name_match_pubspec_test.dart
index c8f4648..d54881f 100644
--- a/utils/tests/pub/install/git/dependency_name_match_pubspec_test.dart
+++ b/utils/tests/pub/install/git/dependency_name_match_pubspec_test.dart
@@ -7,10 +7,10 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('requires the dependency name to match the remote pubspec name', () {
+  integration('requires the dependency name to match the remote pubspec '
+      'name', () {
     ensureGit();
 
     git('foo.git', [
@@ -34,7 +34,5 @@
             '"weirdname", doesn\'t match the name "foo" in its '
             r'pubspec\.'),
         exitCode: 1);
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/git/different_repo_name_test.dart b/utils/tests/pub/install/git/different_repo_name_test.dart
index e3c2f5c..8f5657c 100644
--- a/utils/tests/pub/install/git/different_repo_name_test.dart
+++ b/utils/tests/pub/install/git/different_repo_name_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('doesn\'t require the repository name to match the name in the '
+  integration('doesn\'t require the repository name to match the name in the '
       'pubspec', () {
     ensureGit();
 
@@ -36,7 +35,5 @@
         file('weirdname.dart', 'main() => "weirdname";')
       ])
     ]).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/git/lock_version_test.dart b/utils/tests/pub/install/git/lock_version_test.dart
index ced05d7..793294c 100644
--- a/utils/tests/pub/install/git/lock_version_test.dart
+++ b/utils/tests/pub/install/git/lock_version_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('keeps a Git package locked to the version in the lockfile', () {
+  integration('keeps a Git package locked to the version in the lockfile', () {
     ensureGit();
 
     git('foo.git', [
@@ -47,7 +46,5 @@
         file('foo.dart', 'main() => "foo";')
       ])
     ]).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/git/require_pubspec_name_test.dart b/utils/tests/pub/install/git/require_pubspec_name_test.dart
index e0ea55a..68cc91ea 100644
--- a/utils/tests/pub/install/git/require_pubspec_name_test.dart
+++ b/utils/tests/pub/install/git/require_pubspec_name_test.dart
@@ -7,10 +7,10 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('requires the dependency to have a pubspec with a name field', () {
+  integration('requires the dependency to have a pubspec with a name '
+      'field', () {
     ensureGit();
 
     git('foo.git', [
@@ -26,7 +26,5 @@
         error: new RegExp(r'^Package "foo"' "'" 's pubspec.yaml file is '
             r'missing the required "name" field \(e\.g\. "name: foo"\)\.'),
         exitCode: 1);
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/git/require_pubspec_test.dart b/utils/tests/pub/install/git/require_pubspec_test.dart
index 917a1f5..ffc0b60 100644
--- a/utils/tests/pub/install/git/require_pubspec_test.dart
+++ b/utils/tests/pub/install/git/require_pubspec_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('requires the dependency to have a pubspec', () {
+  integration('requires the dependency to have a pubspec', () {
     ensureGit();
 
     git('foo.git', [
@@ -25,7 +24,5 @@
         error: new RegExp('^Package "foo" doesn\'t have a '
             'pubspec.yaml file.'),
         exitCode: 1);
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/git/stay_locked_if_compatible_test.dart b/utils/tests/pub/install/git/stay_locked_if_compatible_test.dart
index 59b4d44..67bef62 100644
--- a/utils/tests/pub/install/git/stay_locked_if_compatible_test.dart
+++ b/utils/tests/pub/install/git/stay_locked_if_compatible_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("doesn't update a locked Git package with a new compatible "
+  integration("doesn't update a locked Git package with a new compatible "
       "constraint", () {
     ensureGit();
 
@@ -45,7 +44,5 @@
         file('foo.dart', 'main() => "foo 1.0.0";')
       ])
     ]).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/git/unlock_if_incompatible_test.dart b/utils/tests/pub/install/git/unlock_if_incompatible_test.dart
index 17ddc10..47aa138 100644
--- a/utils/tests/pub/install/git/unlock_if_incompatible_test.dart
+++ b/utils/tests/pub/install/git/unlock_if_incompatible_test.dart
@@ -7,10 +7,10 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('updates a locked Git package with a new incompatible constraint', () {
+  integration('updates a locked Git package with a new incompatible '
+      'constraint', () {
     ensureGit();
 
     git('foo.git', [
@@ -44,7 +44,5 @@
         file('foo.dart', 'main() => "foo 1.0.0";')
       ])
     ]).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/hosted/check_out_test.dart b/utils/tests/pub/install/hosted/check_out_test.dart
index 80126c5..ab8cab0 100644
--- a/utils/tests/pub/install/hosted/check_out_test.dart
+++ b/utils/tests/pub/install/hosted/check_out_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('checks out a package from a pub server', () {
+  integration('checks out a package from a pub server', () {
     servePackages([package("foo", "1.2.3")]);
 
     appDir([dependency("foo", "1.2.3")]).scheduleCreate();
@@ -20,7 +19,5 @@
 
     cacheDir({"foo": "1.2.3"}).scheduleValidate();
     packagesDir({"foo": "1.2.3"}).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/hosted/check_out_transitive_test.dart b/utils/tests/pub/install/hosted/check_out_transitive_test.dart
index c449acd..dd5f01b 100644
--- a/utils/tests/pub/install/hosted/check_out_transitive_test.dart
+++ b/utils/tests/pub/install/hosted/check_out_transitive_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('checks out packages transitively from a pub server', () {
+  integration('checks out packages transitively from a pub server', () {
     servePackages([
       package("foo", "1.2.3", [dependency("bar", "2.0.4")]),
       package("bar", "2.0.3"),
@@ -25,7 +24,5 @@
 
     cacheDir({"foo": "1.2.3", "bar": "2.0.4"}).scheduleValidate();
     packagesDir({"foo": "1.2.3", "bar": "2.0.4"}).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/hosted/do_not_update_on_removed_constraints_test.dart b/utils/tests/pub/install/hosted/do_not_update_on_removed_constraints_test.dart
index 6277936..9bd2348 100644
--- a/utils/tests/pub/install/hosted/do_not_update_on_removed_constraints_test.dart
+++ b/utils/tests/pub/install/hosted/do_not_update_on_removed_constraints_test.dart
@@ -7,10 +7,10 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("doesn't update dependencies whose constraints have been removed", () {
+  integration("doesn't update dependencies whose constraints have been "
+      "removed", () {
     servePackages([
       package("foo", "1.0.0", [dependency("shared-dep")]),
       package("bar", "1.0.0", [dependency("shared-dep", "<2.0.0")]),
@@ -39,7 +39,5 @@
       "bar": null,
       "shared-dep": "1.0.0"
     }).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/hosted/fail_gracefully_on_missing_package_test.dart b/utils/tests/pub/install/hosted/fail_gracefully_on_missing_package_test.dart
index aaddfcf..ed0ca96 100644
--- a/utils/tests/pub/install/hosted/fail_gracefully_on_missing_package_test.dart
+++ b/utils/tests/pub/install/hosted/fail_gracefully_on_missing_package_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('fails gracefully if the package does not exist', () {
+  integration('fails gracefully if the package does not exist', () {
     servePackages([]);
 
     appDir([dependency("foo", "1.2.3")]).scheduleCreate();
@@ -19,7 +18,5 @@
         error: new RegExp('Could not find package "foo" at '
                             'http://localhost:'),
         exitCode: 1);
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/hosted/fail_gracefully_on_url_resolve_test.dart b/utils/tests/pub/install/hosted/fail_gracefully_on_url_resolve_test.dart
index 1cd6300..6a40f08 100644
--- a/utils/tests/pub/install/hosted/fail_gracefully_on_url_resolve_test.dart
+++ b/utils/tests/pub/install/hosted/fail_gracefully_on_url_resolve_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('fails gracefully if the url does not resolve', () {
+  integration('fails gracefully if the url does not resolve', () {
     dir(appPath, [
       pubspec({
         "name": "myapp",
@@ -28,7 +27,5 @@
     schedulePub(args: ['install'],
         error: new RegExp('Could not resolve URL "http://pub.invalid".'),
         exitCode: 1);
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/hosted/remove_removed_dependency_test.dart b/utils/tests/pub/install/hosted/remove_removed_dependency_test.dart
index 4febc6e..01d95b7 100644
--- a/utils/tests/pub/install/hosted/remove_removed_dependency_test.dart
+++ b/utils/tests/pub/install/hosted/remove_removed_dependency_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("removes a dependency that's been removed from the pubspec", () {
+  integration("removes a dependency that's been removed from the pubspec", () {
     servePackages([
       package("foo", "1.0.0"),
       package("bar", "1.0.0")
@@ -35,7 +34,5 @@
       "foo": "1.0.0",
       "bar": null
     }).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/hosted/remove_removed_transitive_dependency_test.dart b/utils/tests/pub/install/hosted/remove_removed_transitive_dependency_test.dart
index 2a16d31..959d51a 100644
--- a/utils/tests/pub/install/hosted/remove_removed_transitive_dependency_test.dart
+++ b/utils/tests/pub/install/hosted/remove_removed_transitive_dependency_test.dart
@@ -7,10 +7,10 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("removes a transitive dependency that's no longer depended on", () {
+  integration("removes a transitive dependency that's no longer depended"
+      " on", () {
     servePackages([
       package("foo", "1.0.0", [dependency("shared-dep")]),
       package("bar", "1.0.0", [
@@ -44,7 +44,5 @@
       "shared-dep": "1.0.0",
       "bar-dep": null,
     }).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/hosted/resolve_constraints_test.dart b/utils/tests/pub/install/hosted/resolve_constraints_test.dart
index 2a3f319..fa95d32 100644
--- a/utils/tests/pub/install/hosted/resolve_constraints_test.dart
+++ b/utils/tests/pub/install/hosted/resolve_constraints_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('resolves version constraints from a pub server', () {
+  integration('resolves version constraints from a pub server', () {
     servePackages([
       package("foo", "1.2.3", [dependency("baz", ">=2.0.0")]),
       package("bar", "2.3.4", [dependency("baz", "<3.0.0")]),
@@ -35,7 +34,5 @@
       "bar": "2.3.4",
       "baz": "2.0.4"
     }).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/hosted/stay_locked_if_compatible_test.dart b/utils/tests/pub/install/hosted/stay_locked_if_compatible_test.dart
index aa79296..e6ccc35 100644
--- a/utils/tests/pub/install/hosted/stay_locked_if_compatible_test.dart
+++ b/utils/tests/pub/install/hosted/stay_locked_if_compatible_test.dart
@@ -7,11 +7,10 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("doesn't update a locked pub server package with a new compatible "
-      "constraint", () {
+  integration("doesn't update a locked pub server package with a new "
+      "compatible constraint", () {
     servePackages([package("foo", "1.0.0")]);
 
     appDir([dependency("foo")]).scheduleCreate();
@@ -29,7 +28,5 @@
         output: new RegExp(r"Dependencies installed!$"));
 
     packagesDir({"foo": "1.0.0"}).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/hosted/stay_locked_if_new_is_satisfied_test.dart b/utils/tests/pub/install/hosted/stay_locked_if_new_is_satisfied_test.dart
index 3a580c6..782a52a 100644
--- a/utils/tests/pub/install/hosted/stay_locked_if_new_is_satisfied_test.dart
+++ b/utils/tests/pub/install/hosted/stay_locked_if_new_is_satisfied_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("doesn't unlock dependencies if a new dependency is already "
+  integration("doesn't unlock dependencies if a new dependency is already "
       "satisfied", () {
     servePackages([
       package("foo", "1.0.0", [dependency("bar", "<2.0.0")]),
@@ -47,7 +46,5 @@
       "baz": "1.0.0",
       "newdep": "2.0.0"
     }).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/hosted/stay_locked_test.dart b/utils/tests/pub/install/hosted/stay_locked_test.dart
index 316333c..5bd5ec2 100644
--- a/utils/tests/pub/install/hosted/stay_locked_test.dart
+++ b/utils/tests/pub/install/hosted/stay_locked_test.dart
@@ -7,10 +7,10 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('keeps a pub server package locked to the version in the lockfile', () {
+  integration('keeps a pub server package locked to the version in the '
+      'lockfile', () {
     servePackages([package("foo", "1.0.0")]);
 
     appDir([dependency("foo")]).scheduleCreate();
@@ -32,7 +32,5 @@
         output: new RegExp(r"Dependencies installed!$"));
 
     packagesDir({"foo": "1.0.0"}).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/hosted/unlock_if_incompatible_test.dart b/utils/tests/pub/install/hosted/unlock_if_incompatible_test.dart
index 89ca81f..13a6920 100644
--- a/utils/tests/pub/install/hosted/unlock_if_incompatible_test.dart
+++ b/utils/tests/pub/install/hosted/unlock_if_incompatible_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('updates a locked pub server package with a new incompatible '
+  integration('updates a locked pub server package with a new incompatible '
       'constraint', () {
     servePackages([package("foo", "1.0.0")]);
 
@@ -29,7 +28,5 @@
         output: new RegExp(r"Dependencies installed!$"));
 
     packagesDir({"foo": "1.0.1"}).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/hosted/unlock_if_new_is_unsatisfied_test.dart b/utils/tests/pub/install/hosted/unlock_if_new_is_unsatisfied_test.dart
index ba86a53..91edd34 100644
--- a/utils/tests/pub/install/hosted/unlock_if_new_is_unsatisfied_test.dart
+++ b/utils/tests/pub/install/hosted/unlock_if_new_is_unsatisfied_test.dart
@@ -7,11 +7,10 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("unlocks dependencies if necessary to ensure that a new dependency "
-      "is satisfied", () {
+  integration("unlocks dependencies if necessary to ensure that a new "
+      "dependency is satisfied", () {
     servePackages([
       package("foo", "1.0.0", [dependency("bar", "<2.0.0")]),
       package("bar", "1.0.0", [dependency("baz", "<2.0.0")]),
@@ -51,7 +50,5 @@
       "qux": "1.0.0",
       "newdep": "2.0.0"
     }).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/pub_install_test.dart b/utils/tests/pub/install/pub_install_test.dart
index 4f9dc43..7589bc5 100644
--- a/utils/tests/pub/install/pub_install_test.dart
+++ b/utils/tests/pub/install/pub_install_test.dart
@@ -6,22 +6,20 @@
 
 import 'dart:io';
 
-import '../test_pub.dart';
 import '../../../../pkg/unittest/lib/unittest.dart';
+import '../test_pub.dart';
 
 main() {
   group('requires', () {
-    test('a pubspec', () {
+    integration('a pubspec', () {
       dir(appPath, []).scheduleCreate();
 
       schedulePub(args: ['install'],
           error: new RegExp(r'^Could not find a file named "pubspec\.yaml"'),
           exitCode: 1);
-
-      run();
     });
 
-    test('a pubspec with a "name" key', () {
+    integration('a pubspec with a "name" key', () {
       dir(appPath, [
         pubspec({"dependencies": {"foo": null}})
       ]).scheduleCreate();
@@ -30,12 +28,10 @@
           error: new RegExp(r'^pubspec.yaml is missing the required "name" '
               r'field \(e\.g\. "name: myapp"\)\.'),
           exitCode: 1);
-
-      run();
     });
   });
 
-  test('adds itself to the packages', () {
+  integration('adds itself to the packages', () {
     // The symlink should use the name in the pubspec, not the name of the
     // directory.
     dir(appPath, [
@@ -51,11 +47,9 @@
         file('foo.dart', 'main() => "foo";')
       ])
     ]).scheduleValidate();
-
-    run();
   });
 
-  test('does not adds itself to the packages if it has no "lib" directory', () {
+  integration('does not adds itself to the packages if it has no "lib" directory', () {
     // The symlink should use the name in the pubspec, not the name of the
     // directory.
     dir(appPath, [
@@ -68,11 +62,9 @@
     dir(packagesPath, [
       nothing("myapp_name")
     ]).scheduleValidate();
-
-    run();
   });
 
-  test('does not add a package if it does not have a "lib" directory', () {
+  integration('does not add a package if it does not have a "lib" directory', () {
     // Using an SDK source, but this should be true of all sources.
     dir(sdkPath, [
       file('revision', '1234'),
@@ -92,11 +84,9 @@
             'directory so you will not be able to import any libraries from '
             'it.'),
         output: new RegExp(r"Dependencies installed!$"));
-
-    run();
   });
 
-  test('does not warn if the root package lacks a "lib" directory', () {
+  integration('does not warn if the root package lacks a "lib" directory', () {
     dir(appPath, [
       appPubspec([])
     ]).scheduleCreate();
@@ -104,11 +94,9 @@
     schedulePub(args: ['install'],
         error: '',
         output: new RegExp(r"Dependencies installed!$"));
-
-    run();
   });
 
-  test('overwrites the existing packages directory', () {
+  integration('overwrites the existing packages directory', () {
     dir(appPath, [
       appPubspec([]),
       dir('packages', [
@@ -125,12 +113,10 @@
       nothing('foo'),
       dir('myapp', [file('myapp.dart', 'main() => "myapp";')])
     ]).scheduleValidate();
-
-    run();
   });
 
   group('creates a packages directory in', () {
-    test('"test/" and its subdirectories', () {
+    integration('"test/" and its subdirectories', () {
       dir(appPath, [
         appPubspec([]),
         libDir('foo'),
@@ -156,11 +142,9 @@
           ])
         ])
       ]).scheduleValidate();
-
-      run();
     });
 
-    test('"example/" and its subdirectories', () {
+    integration('"example/" and its subdirectories', () {
       dir(appPath, [
         appPubspec([]),
         libDir('foo'),
@@ -186,11 +170,9 @@
           ])
         ])
       ]).scheduleValidate();
-
-      run();
     });
 
-    test('"tool/" and its subdirectories', () {
+    integration('"tool/" and its subdirectories', () {
       dir(appPath, [
         appPubspec([]),
         libDir('foo'),
@@ -216,11 +198,9 @@
           ])
         ])
       ]).scheduleValidate();
-
-      run();
     });
 
-    test('"web/" and its subdirectories', () {
+    integration('"web/" and its subdirectories', () {
       dir(appPath, [
         appPubspec([]),
         libDir('foo'),
@@ -246,11 +226,9 @@
           ])
         ])
       ]).scheduleValidate();
-
-      run();
     });
 
-    test('"bin/"', () {
+    integration('"bin/"', () {
       dir(appPath, [
         appPubspec([]),
         libDir('foo'),
@@ -269,8 +247,6 @@
           ])
         ])
       ]).scheduleValidate();
-
-      run();
     });
   });
 }
diff --git a/utils/tests/pub/install/sdk/check_out_test.dart b/utils/tests/pub/install/sdk/check_out_test.dart
index c99658d..0b658ac 100644
--- a/utils/tests/pub/install/sdk/check_out_test.dart
+++ b/utils/tests/pub/install/sdk/check_out_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('checks out a package from the SDK', () {
+  integration('checks out a package from the SDK', () {
     dir(sdkPath, [
       file('revision', '1234'),
       dir('pkg', [
@@ -29,7 +28,5 @@
         output: new RegExp(r"Dependencies installed!$"));
 
     packagesDir({"foo": "0.0.1234"}).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/install/sdk/check_out_transitive_test.dart b/utils/tests/pub/install/sdk/check_out_transitive_test.dart
index 04dd55e..4a95147 100644
--- a/utils/tests/pub/install/sdk/check_out_transitive_test.dart
+++ b/utils/tests/pub/install/sdk/check_out_transitive_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('includes transitive dependencies', () {
+  integration('includes transitive dependencies', () {
     dir(sdkPath, [
       file('revision', '1234'),
       dir('pkg', [
@@ -36,7 +35,5 @@
       'foo': '0.0.1234',
       'bar': '0.0.1234'
     }).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/oauth2_test.dart b/utils/tests/pub/oauth2_test.dart
index 1c94c32..42be210 100644
--- a/utils/tests/pub/oauth2_test.dart
+++ b/utils/tests/pub/oauth2_test.dart
@@ -9,6 +9,7 @@
 import 'dart:uri';
 
 import 'test_pub.dart';
+import 'test_pub.dart';
 import '../../../pkg/http/lib/http.dart' as http;
 import '../../../pkg/unittest/lib/unittest.dart';
 import '../../pub/io.dart';
@@ -17,8 +18,8 @@
 main() {
   setUp(() => normalPackage.scheduleCreate());
 
-  test('with no credentials.json, authenticates and saves credentials.json',
-      () {
+  integration('with no credentials.json, authenticates and saves '
+      'credentials.json', () {
     var server = new ScheduledServer();
     var pub = startPubLish(server);
     confirmPublish(pub);
@@ -34,11 +35,9 @@
     pub.kill();
 
     credentialsFile(server, 'access token').scheduleValidate();
-
-    run();
   });
 
-  test('with a pre-existing credentials.json does not authenticate', () {
+  integration('with a pre-existing credentials.json does not authenticate', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubLish(server);
@@ -52,12 +51,10 @@
     });
 
     pub.kill();
-
-    run();
   });
 
-  test('with an expired credentials.json, refreshes and saves the refreshed '
-      'access token to credentials.json', () {
+  integration('with an expired credentials.json, refreshes and saves the '
+      'refreshed access token to credentials.json', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token',
         refreshToken: 'refresh token',
@@ -93,11 +90,9 @@
 
     credentialsFile(server, 'new access token', refreshToken: 'refresh token')
         .scheduleValidate();
-
-    run();
   });
 
-  test('with an expired credentials.json without a refresh token, '
+  integration('with an expired credentials.json without a refresh token, '
        'authenticates again and saves credentials.json', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token',
@@ -121,12 +116,10 @@
     pub.kill();
 
     credentialsFile(server, 'new access token').scheduleValidate();
-
-    run();
   });
 
-  test('with a malformed credentials.json, authenticates again and saves '
-      'credentials.json', () {
+  integration('with a malformed credentials.json, authenticates again and '
+      'saves credentials.json', () {
     var server = new ScheduledServer();
     dir(cachePath, [
       file('credentials.json', '{bad json')
@@ -146,11 +139,9 @@
     pub.kill();
 
     credentialsFile(server, 'new access token').scheduleValidate();
-
-    run();
   });
 
-  test('with server-rejected credentials, authenticates again and saves '
+  integration('with server-rejected credentials, authenticates again and saves '
       'credentials.json', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
@@ -177,7 +168,6 @@
         'Looks great! Are you ready to upload your package (y/n)? '
         'Pub needs your authorization to upload packages on your behalf.'));
     pub.kill();
-    run();
   });
 }
 
diff --git a/utils/tests/pub/pub.status b/utils/tests/pub/pub.status
index 86e5e4e..09fcf6d 100644
--- a/utils/tests/pub/pub.status
+++ b/utils/tests/pub/pub.status
@@ -2,6 +2,11 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+pub_uploader_test: Pass, Fail # Issue 7905
+pub_lish_test: Pass, Fail # Issue 7905
+oauth2_test: Pass, Fail # Issue 7905, 7920
+curl_client_test: Pass, Fail # Issue 7920
+
 # Pub only runs on the VM, so just rule out all compilers.
 [ $compiler == dart2js || $compiler == dart2dart || $compiler == dartc ]
 *: Skip
diff --git a/utils/tests/pub/pub_lish_test.dart b/utils/tests/pub/pub_lish_test.dart
index babba9ea..b0faa95 100644
--- a/utils/tests/pub/pub_lish_test.dart
+++ b/utils/tests/pub/pub_lish_test.dart
@@ -8,6 +8,7 @@
 import 'dart:json' as json;
 
 import 'test_pub.dart';
+import 'test_pub.dart';
 import '../../../pkg/unittest/lib/unittest.dart';
 import '../../pub/io.dart';
 
@@ -49,7 +50,7 @@
 main() {
   setUp(() => normalPackage.scheduleCreate());
 
-  test('archives and uploads a package', () {
+  integration('archives and uploads a package', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubLish(server);
@@ -72,14 +73,12 @@
         'Looks great! Are you ready to upload your package (y/n)?'
         ' Package test_pkg 1.0.0 uploaded!'));
     pub.shouldExit(0);
-
-    run();
   });
 
   // TODO(nweiz): Once a multipart/form-data parser in Dart exists, we should
   // test that "pub lish" chooses the correct files to publish.
 
-  test('package validation has an error', () {
+  integration('package validation has an error', () {
     var package = package("test_pkg", "1.0.0");
     package.remove("homepage");
     dir(appPath, [pubspec(package)]).scheduleCreate();
@@ -91,11 +90,9 @@
     expectLater(pub.remainingStderr(),
         contains("Sorry, your package is missing a requirement and can't be "
             "published yet."));
-
-    run();
   });
 
-  test('package validation has a warning and is canceled', () {
+  integration('package validation has a warning and is canceled', () {
     var package = package("test_pkg", "1.0.0");
     package["author"] = "Nathan Weizenbaum";
     dir(appPath, [pubspec(package)]).scheduleCreate();
@@ -106,11 +103,9 @@
     pub.writeLine("n");
     pub.shouldExit(1);
     expectLater(pub.remainingStderr(), contains("Package upload canceled."));
-
-    run();
   });
 
-  test('package validation has a warning and continues', () {
+  integration('package validation has a warning and continues', () {
     var package = package("test_pkg", "1.0.0");
     package["author"] = "Nathan Weizenbaum";
     dir(appPath, [pubspec(package)]).scheduleCreate();
@@ -132,11 +127,9 @@
     pub.shouldExit(0);
     expectLater(pub.remainingStdout(),
         contains('Package test_pkg 1.0.0 uploaded!'));
-
-    run();
   });
 
-  test('upload form provides an error', () {
+  integration('upload form provides an error', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubLish(server);
@@ -153,11 +146,9 @@
 
     expectLater(pub.nextErrLine(), equals('your request sucked'));
     pub.shouldExit(1);
-
-    run();
   });
 
-  test('upload form provides invalid JSON', () {
+  integration('upload form provides invalid JSON', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubLish(server);
@@ -172,11 +163,9 @@
     expectLater(pub.nextErrLine(), equals('Invalid server response:'));
     expectLater(pub.nextErrLine(), equals('{not json'));
     pub.shouldExit(1);
-
-    run();
   });
 
-  test('upload form is missing url', () {
+  integration('upload form is missing url', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubLish(server);
@@ -194,11 +183,9 @@
     expectLater(pub.nextErrLine(), equals('Invalid server response:'));
     expectLater(pub.nextErrLine(), equals(json.stringify(body)));
     pub.shouldExit(1);
-
-    run();
   });
 
-  test('upload form url is not a string', () {
+  integration('upload form url is not a string', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubLish(server);
@@ -217,11 +204,9 @@
     expectLater(pub.nextErrLine(), equals('Invalid server response:'));
     expectLater(pub.nextErrLine(), equals(json.stringify(body)));
     pub.shouldExit(1);
-
-    run();
   });
 
-  test('upload form is missing fields', () {
+  integration('upload form is missing fields', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubLish(server);
@@ -233,11 +218,9 @@
     expectLater(pub.nextErrLine(), equals('Invalid server response:'));
     expectLater(pub.nextErrLine(), equals(json.stringify(body)));
     pub.shouldExit(1);
-
-    run();
   });
 
-  test('upload form fields is not a map', () {
+  integration('upload form fields is not a map', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubLish(server);
@@ -249,11 +232,9 @@
     expectLater(pub.nextErrLine(), equals('Invalid server response:'));
     expectLater(pub.nextErrLine(), equals(json.stringify(body)));
     pub.shouldExit(1);
-
-    run();
   });
 
-  test('upload form fields has a non-string value', () {
+  integration('upload form fields has a non-string value', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubLish(server);
@@ -268,11 +249,9 @@
     expectLater(pub.nextErrLine(), equals('Invalid server response:'));
     expectLater(pub.nextErrLine(), equals(json.stringify(body)));
     pub.shouldExit(1);
-
-    run();
   });
 
-  test('cloud storage upload provides an error', () {
+  integration('cloud storage upload provides an error', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubLish(server);
@@ -292,11 +271,9 @@
     // can parse the XML.
     expectLater(pub.nextErrLine(), equals('Failed to upload the package.'));
     pub.shouldExit(1);
-
-    run();
   });
 
-  test("cloud storage upload doesn't redirect", () {
+  integration("cloud storage upload doesn't redirect", () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubLish(server);
@@ -311,11 +288,9 @@
 
     expectLater(pub.nextErrLine(), equals('Failed to upload the package.'));
     pub.shouldExit(1);
-
-    run();
   });
 
-  test('package creation provides an error', () {
+  integration('package creation provides an error', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubLish(server);
@@ -334,11 +309,9 @@
 
     expectLater(pub.nextErrLine(), equals('Your package was too boring.'));
     pub.shouldExit(1);
-
-    run();
   });
 
-  test('package creation provides invalid JSON', () {
+  integration('package creation provides invalid JSON', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubLish(server);
@@ -355,11 +328,9 @@
     expectLater(pub.nextErrLine(), equals('Invalid server response:'));
     expectLater(pub.nextErrLine(), equals('{not json'));
     pub.shouldExit(1);
-
-    run();
   });
 
-  test('package creation provides a malformed error', () {
+  integration('package creation provides a malformed error', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubLish(server);
@@ -378,11 +349,9 @@
     expectLater(pub.nextErrLine(), equals('Invalid server response:'));
     expectLater(pub.nextErrLine(), equals(json.stringify(body)));
     pub.shouldExit(1);
-
-    run();
   });
 
-  test('package creation provides a malformed success', () {
+  integration('package creation provides a malformed success', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubLish(server);
@@ -400,7 +369,5 @@
     expectLater(pub.nextErrLine(), equals('Invalid server response:'));
     expectLater(pub.nextErrLine(), equals(json.stringify(body)));
     pub.shouldExit(1);
-
-    run();
   });
 }
diff --git a/utils/tests/pub/pub_uploader_test.dart b/utils/tests/pub/pub_uploader_test.dart
index fe6e2b6..2557845 100644
--- a/utils/tests/pub/pub_uploader_test.dart
+++ b/utils/tests/pub/pub_uploader_test.dart
@@ -8,6 +8,7 @@
 import 'dart:json' as json;
 
 import 'test_pub.dart';
+import 'test_pub.dart';
 import '../../../pkg/unittest/lib/unittest.dart';
 import '../../pub/utils.dart';
 import '../../pub/io.dart';
@@ -43,7 +44,7 @@
         output: USAGE_STRING, exitCode: 64));
   });
 
-  test('adds an uploader', () {
+  integration('adds an uploader', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']);
@@ -62,11 +63,9 @@
 
     expectLater(pub.nextLine(), equals('Good job!'));
     pub.shouldExit(0);
-
-    run();
   });
 
-  test('removes an uploader', () {
+  integration('removes an uploader', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubUploader(server, ['--package', 'pkg', 'remove', 'email']);
@@ -82,11 +81,9 @@
 
     expectLater(pub.nextLine(), equals('Good job!'));
     pub.shouldExit(0);
-
-    run();
   });
 
-  test('defaults to the current package', () {
+  integration('defaults to the current package', () {
     normalPackage.scheduleCreate();
 
     var server = new ScheduledServer();
@@ -104,11 +101,9 @@
 
     expectLater(pub.nextLine(), equals('Good job!'));
     pub.shouldExit(0);
-
-    run();
   });
 
-  test('add provides an error', () {
+  integration('add provides an error', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']);
@@ -124,11 +119,9 @@
 
     expectLater(pub.nextErrLine(), equals('Bad job!'));
     pub.shouldExit(1);
-
-    run();
   });
 
-  test('remove provides an error', () {
+  integration('remove provides an error', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubUploader(server,
@@ -146,11 +139,9 @@
 
     expectLater(pub.nextErrLine(), equals('Bad job!'));
     pub.shouldExit(1);
-
-    run();
   });
 
-  test('add provides invalid JSON', () {
+  integration('add provides invalid JSON', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']);
@@ -163,11 +154,9 @@
     expectLater(pub.nextErrLine(), equals('Invalid server response:'));
     expectLater(pub.nextErrLine(), equals('{not json'));
     pub.shouldExit(1);
-
-    run();
   });
 
-  test('remove provides invalid JSON', () {
+  integration('remove provides invalid JSON', () {
     var server = new ScheduledServer();
     credentialsFile(server, 'access token').scheduleCreate();
     var pub = startPubUploader(server, ['--package', 'pkg', 'remove', 'email']);
@@ -181,7 +170,5 @@
     expectLater(pub.nextErrLine(), equals('Invalid server response:'));
     expectLater(pub.nextErrLine(), equals('{not json'));
     pub.shouldExit(1);
-
-    run();
   });
 }
diff --git a/utils/tests/pub/test_pub.dart b/utils/tests/pub/test_pub.dart
index 87053b9..f9bd96b 100644
--- a/utils/tests/pub/test_pub.dart
+++ b/utils/tests/pub/test_pub.dart
@@ -29,6 +29,16 @@
 import '../../pub/utils.dart';
 import '../../pub/validator.dart';
 import '../../pub/yaml/yaml.dart';
+import 'command_line_config.dart';
+
+/// This should be called at the top of a test file to set up an appropriate
+/// test configuration for the machine running the tests.
+initConfig() {
+  // If we aren't running on the bots, use the human-friendly config.
+  if (new Options().arguments.contains('--human')) {
+    configure(new CommandLineConfiguration());
+  }
+}
 
 /// Creates a new [FileDescriptor] with [name] and [contents].
 FileDescriptor file(Pattern name, String contents) =>
@@ -443,11 +453,19 @@
 /// complete.
 final _TIMEOUT = 30000;
 
+/// Defines an integration test. The [body] should schedule a series of
+/// operations which will be run asynchronously.
+integration(String description, body()) {
+  test(description, () {
+    body();
+    _run();
+  });
+}
+
 /// Runs all the scheduled events for a test case. This should only be called
 /// once per test case.
-void run() {
+void _run() {
   var createdSandboxDir;
-
   var asyncDone = expectAsync0(() {});
 
   Future cleanup() {
@@ -525,7 +543,7 @@
 /// Any futures in [args] will be resolved before the process is started.
 void runPub({List args, Pattern output, Pattern error, int exitCode: 0}) {
   schedulePub(args: args, output: output, error: error, exitCode: exitCode);
-  run();
+  _run();
 }
 
 /// Starts a Pub process and returns a [ScheduledProcess] that supports
diff --git a/utils/tests/pub/update/git/do_not_update_if_unneeded_test.dart b/utils/tests/pub/update/git/do_not_update_if_unneeded_test.dart
index 3925408..15fa3f9 100644
--- a/utils/tests/pub/update/git/do_not_update_if_unneeded_test.dart
+++ b/utils/tests/pub/update/git/do_not_update_if_unneeded_test.dart
@@ -7,11 +7,10 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("doesn't update one locked Git package's dependencies if it's not "
-      "necessary", () {
+  integration("doesn't update one locked Git package's dependencies if it's "
+      "not necessary", () {
     ensureGit();
 
     git('foo.git', [
@@ -59,7 +58,5 @@
         file('foo-dep.dart', 'main() => "foo-dep";')
       ]),
     ]).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/update/git/update_locked_test.dart b/utils/tests/pub/update/git/update_locked_test.dart
index 0d23088..1fd9718 100644
--- a/utils/tests/pub/update/git/update_locked_test.dart
+++ b/utils/tests/pub/update/git/update_locked_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("updates locked Git packages", () {
+  integration("updates locked Git packages", () {
     ensureGit();
 
     git('foo.git', [
@@ -58,7 +57,5 @@
         file('bar.dart', 'main() => "bar 2";')
       ])
     ]).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/update/git/update_one_locked_test.dart b/utils/tests/pub/update/git/update_one_locked_test.dart
index c654e85..3c06726 100644
--- a/utils/tests/pub/update/git/update_one_locked_test.dart
+++ b/utils/tests/pub/update/git/update_one_locked_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("updates one locked Git package but no others", () {
+  integration("updates one locked Git package but no others", () {
     ensureGit();
 
     git('foo.git', [
@@ -58,7 +57,5 @@
         file('bar.dart', 'main() => "bar";')
       ])
     ]).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/update/git/update_to_incompatible_pubspec_test.dart b/utils/tests/pub/update/git/update_to_incompatible_pubspec_test.dart
index 36c5e7f..aa4ef46 100644
--- a/utils/tests/pub/update/git/update_to_incompatible_pubspec_test.dart
+++ b/utils/tests/pub/update/git/update_to_incompatible_pubspec_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("updates Git packages to an incompatible pubspec", () {
+  integration("updates Git packages to an incompatible pubspec", () {
     ensureGit();
 
     git('foo.git', [
@@ -44,7 +43,5 @@
         file('foo.dart', 'main() => "foo";')
       ])
     ]).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/update/git/update_to_nonexistent_pubspec_test.dart b/utils/tests/pub/update/git/update_to_nonexistent_pubspec_test.dart
index b777103..21951ab 100644
--- a/utils/tests/pub/update/git/update_to_nonexistent_pubspec_test.dart
+++ b/utils/tests/pub/update/git/update_to_nonexistent_pubspec_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("updates Git packages to a nonexistent pubspec", () {
+  integration("updates Git packages to a nonexistent pubspec", () {
     ensureGit();
 
     var repo = git('foo.git', [
@@ -43,7 +42,5 @@
         file('foo.dart', 'main() => "foo";')
       ])
     ]).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/update/hosted/fail_gracefully_on_missing_package_test.dart b/utils/tests/pub/update/hosted/fail_gracefully_on_missing_package_test.dart
index e9e980a..6bbb45c 100644
--- a/utils/tests/pub/update/hosted/fail_gracefully_on_missing_package_test.dart
+++ b/utils/tests/pub/update/hosted/fail_gracefully_on_missing_package_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('fails gracefully if the package does not exist', () {
+  integration('fails gracefully if the package does not exist', () {
     servePackages([]);
 
     appDir([dependency("foo", "1.2.3")]).scheduleCreate();
@@ -19,7 +18,5 @@
         error: new RegExp('Could not find package "foo" at '
                             'http://localhost:'),
         exitCode: 1);
-
-    run();
   });
 }
diff --git a/utils/tests/pub/update/hosted/fail_gracefully_on_url_resolve_test.dart b/utils/tests/pub/update/hosted/fail_gracefully_on_url_resolve_test.dart
index 314f41f..d7f8cbd 100644
--- a/utils/tests/pub/update/hosted/fail_gracefully_on_url_resolve_test.dart
+++ b/utils/tests/pub/update/hosted/fail_gracefully_on_url_resolve_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test('fails gracefully if the url does not resolve', () {
+  integration('fails gracefully if the url does not resolve', () {
     dir(appPath, [
       pubspec({
         "name": "myapp",
@@ -28,7 +27,5 @@
     schedulePub(args: ['update'],
         error: new RegExp('Could not resolve URL "http://pub.invalid".'),
         exitCode: 1);
-
-    run();
   });
 }
diff --git a/utils/tests/pub/update/hosted/remove_removed_dependency_test.dart b/utils/tests/pub/update/hosted/remove_removed_dependency_test.dart
index 2b53de7..e39c184 100644
--- a/utils/tests/pub/update/hosted/remove_removed_dependency_test.dart
+++ b/utils/tests/pub/update/hosted/remove_removed_dependency_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("removes a dependency that's been removed from the pubspec", () {
+  integration("removes a dependency that's been removed from the pubspec", () {
     servePackages([
       package("foo", "1.0.0"),
       package("bar", "1.0.0")
@@ -35,7 +34,5 @@
       "foo": "1.0.0",
       "bar": null
     }).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/update/hosted/remove_removed_transitive_dependency_test.dart b/utils/tests/pub/update/hosted/remove_removed_transitive_dependency_test.dart
index 2afc65d..fa54439 100644
--- a/utils/tests/pub/update/hosted/remove_removed_transitive_dependency_test.dart
+++ b/utils/tests/pub/update/hosted/remove_removed_transitive_dependency_test.dart
@@ -7,10 +7,10 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("removes a transitive dependency that's no longer depended on", () {
+  integration("removes a transitive dependency that's no longer depended "
+      "on", () {
     servePackages([
       package("foo", "1.0.0", [dependency("shared-dep")]),
       package("bar", "1.0.0", [
@@ -44,7 +44,5 @@
       "shared-dep": "1.0.0",
       "bar-dep": null,
     }).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/update/hosted/unlock_dependers_test.dart b/utils/tests/pub/update/hosted/unlock_dependers_test.dart
index 6a0d2e0..b1436e9 100644
--- a/utils/tests/pub/update/hosted/unlock_dependers_test.dart
+++ b/utils/tests/pub/update/hosted/unlock_dependers_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("updates a locked package's dependers in order to get it to max "
+  integration("updates a locked package's dependers in order to get it to max "
       "version", () {
     servePackages([
       package("foo", "1.0.0", [dependency("bar", "<2.0.0")]),
@@ -39,7 +38,5 @@
       "foo": "2.0.0",
       "bar": "2.0.0"
     }).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/update/hosted/unlock_if_necessary_test.dart b/utils/tests/pub/update/hosted/unlock_if_necessary_test.dart
index aae6ca1..1c1b95d 100644
--- a/utils/tests/pub/update/hosted/unlock_if_necessary_test.dart
+++ b/utils/tests/pub/update/hosted/unlock_if_necessary_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("updates one locked pub server package's dependencies if it's "
+  integration("updates one locked pub server package's dependencies if it's "
       "necessary", () {
     servePackages([
       package("foo", "1.0.0", [dependency("foo-dep")]),
@@ -39,7 +38,5 @@
       "foo": "2.0.0",
       "foo-dep": "2.0.0"
     }).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/update/hosted/update_removed_constraints_test.dart b/utils/tests/pub/update/hosted/update_removed_constraints_test.dart
index 911fa34..06dadff 100644
--- a/utils/tests/pub/update/hosted/update_removed_constraints_test.dart
+++ b/utils/tests/pub/update/hosted/update_removed_constraints_test.dart
@@ -7,10 +7,9 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
-  test("updates dependencies whose constraints have been removed", () {
+  integration("updates dependencies whose constraints have been removed", () {
     servePackages([
       package("foo", "1.0.0", [dependency("shared-dep")]),
       package("bar", "1.0.0", [dependency("shared-dep", "<2.0.0")]),
@@ -39,7 +38,5 @@
       "bar": null,
       "shared-dep": "2.0.0"
     }).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/update/pub_update_test.dart b/utils/tests/pub/update/pub_update_test.dart
index 831d2ce..ef18e84 100644
--- a/utils/tests/pub/update/pub_update_test.dart
+++ b/utils/tests/pub/update/pub_update_test.dart
@@ -6,22 +6,20 @@
 
 import 'dart:io';
 
-import '../test_pub.dart';
 import '../../../../pkg/unittest/lib/unittest.dart';
+import '../test_pub.dart';
 
 main() {
   group('requires', () {
-    test('a pubspec', () {
+    integration('a pubspec', () {
       dir(appPath, []).scheduleCreate();
 
       schedulePub(args: ['update'],
           error: new RegExp(r'^Could not find a file named "pubspec.yaml"'),
           exitCode: 1);
-
-      run();
     });
 
-    test('a pubspec with a "name" key', () {
+    integration('a pubspec with a "name" key', () {
       dir(appPath, [
         pubspec({"dependencies": {"foo": null}})
       ]).scheduleCreate();
@@ -30,12 +28,10 @@
           error: new RegExp(r'^pubspec.yaml is missing the required "name" '
               r'field \(e\.g\. "name: myapp"\)\.'),
           exitCode: 1);
-
-      run();
     });
   });
 
-  test('adds itself to the packages', () {
+  integration('adds itself to the packages', () {
     // The symlink should use the name in the pubspec, not the name of the
     // directory.
     dir(appPath, [
@@ -51,11 +47,10 @@
         file('myapp_name.dart', 'main() => "myapp_name";')
       ])
     ]).scheduleValidate();
-
-    run();
   });
 
-  test('does not adds itself to the packages if it has no "lib" directory', () {
+  integration('does not adds itself to the packages if it has no "lib" '
+      'directory', () {
     // The symlink should use the name in the pubspec, not the name of the
     // directory.
     dir(appPath, [
@@ -68,11 +63,10 @@
     dir(packagesPath, [
       nothing("myapp_name")
     ]).scheduleValidate();
-
-    run();
   });
 
-  test('does not add a package if it does not have a "lib" directory', () {
+  integration('does not add a package if it does not have a "lib" '
+      'directory', () {
     // Using an SDK source, but this should be true of all sources.
     dir(sdkPath, [
       file('revision', '1234'),
@@ -91,7 +85,5 @@
         output: new RegExp(r"Dependencies updated!$"));
 
     packagesDir({"foo": null}).scheduleValidate();
-
-    run();
   });
 }
diff --git a/utils/tests/pub/validator_test.dart b/utils/tests/pub/validator_test.dart
index 9f0a366..75b51ff 100644
--- a/utils/tests/pub/validator_test.dart
+++ b/utils/tests/pub/validator_test.dart
@@ -55,46 +55,41 @@
   group('should consider a package valid if it', () {
     setUp(scheduleNormalPackage);
 
-    test('looks normal', () {
+    integration('looks normal', () {
       dir(appPath, [libPubspec("test_pkg", "1.0.0")]).scheduleCreate();
       expectNoValidationError(dependency);
       expectNoValidationError(lib);
       expectNoValidationError(license);
       expectNoValidationError(name);
       expectNoValidationError(pubspecField);
-      run();
     });
 
-    test('has a COPYING file', () {
+    integration('has a COPYING file', () {
       file(join(appPath, 'LICENSE'), '').scheduleDelete();
       file(join(appPath, 'COPYING'), '').scheduleCreate();
       expectNoValidationError(license);
-      run();
     });
 
-    test('has a prefixed LICENSE file', () {
+    integration('has a prefixed LICENSE file', () {
       file(join(appPath, 'LICENSE'), '').scheduleDelete();
       file(join(appPath, 'MIT_LICENSE'), '').scheduleCreate();
       expectNoValidationError(license);
-      run();
     });
 
-    test('has a suffixed LICENSE file', () {
+    integration('has a suffixed LICENSE file', () {
       file(join(appPath, 'LICENSE'), '').scheduleDelete();
       file(join(appPath, 'LICENSE.md'), '').scheduleCreate();
       expectNoValidationError(license);
-      run();
     });
 
-    test('has "authors" instead of "author"', () {
+    integration('has "authors" instead of "author"', () {
       var package = package("test_pkg", "1.0.0");
       package["authors"] = [package.remove("author")];
       dir(appPath, [pubspec(package)]).scheduleCreate();
       expectNoValidationError(pubspecField);
-      run();
     });
 
-    test('has a badly-named library in lib/src', () {
+    integration('has a badly-named library in lib/src', () {
       dir(appPath, [
         libPubspec("test_pkg", "1.0.0"),
         dir("lib", [
@@ -103,10 +98,9 @@
         ])
       ]).scheduleCreate();
       expectNoValidationError(name);
-      run();
     });
 
-    test('has a non-Dart file in lib', () {
+    integration('has a non-Dart file in lib', () {
       dir(appPath, [
         libPubspec("test_pkg", "1.0.0"),
         dir("lib", [
@@ -114,68 +108,61 @@
         ])
       ]).scheduleCreate();
       expectNoValidationError(lib);
-      run();
     });
 
-    test('has an unconstrained dependency on "unittest"', () {
+    integration('has an unconstrained dependency on "unittest"', () {
       dir(appPath, [
         libPubspec("test_pkg", "1.0.0", [
           {'hosted': 'unittest'}
         ])
       ]).scheduleCreate();
       expectNoValidationError(dependency);
-      run();
     });
 
-    test('has a nested directory named "tools"', () {
+    integration('has a nested directory named "tools"', () {
       dir(appPath, [
         dir("foo", [dir("tools")])
       ]).scheduleCreate();
       expectNoValidationError(directory);
-      run();
     });
   });
 
   group('should consider a package invalid if it', () {
     setUp(scheduleNormalPackage);
 
-    test('is missing the "homepage" field', () {
+    integration('is missing the "homepage" field', () {
       var package = package("test_pkg", "1.0.0");
       package.remove("homepage");
       dir(appPath, [pubspec(package)]).scheduleCreate();
 
       expectValidationError(pubspecField);
-      run();
     });
 
-    test('is missing the "description" field', () {
+    integration('is missing the "description" field', () {
       var package = package("test_pkg", "1.0.0");
       package.remove("description");
       dir(appPath, [pubspec(package)]).scheduleCreate();
 
       expectValidationError(pubspecField);
-      run();
     });
 
-    test('is missing the "author" field', () {
+    integration('is missing the "author" field', () {
       var package = package("test_pkg", "1.0.0");
       package.remove("author");
       dir(appPath, [pubspec(package)]).scheduleCreate();
 
       expectValidationError(pubspecField);
-      run();
     });
 
-    test('has a single author without an email', () {
+    integration('has a single author without an email', () {
       var package = package("test_pkg", "1.0.0");
       package["author"] = "Nathan Weizenbaum";
       dir(appPath, [pubspec(package)]).scheduleCreate();
 
       expectValidationWarning(pubspecField);
-      run();
     });
 
-    test('has one of several authors without an email', () {
+    integration('has one of several authors without an email', () {
       var package = package("test_pkg", "1.0.0");
       package.remove("author");
       package["authors"] = [
@@ -186,19 +173,17 @@
       dir(appPath, [pubspec(package)]).scheduleCreate();
 
       expectValidationWarning(pubspecField);
-      run();
     });
 
-    test('has a single author without a name', () {
+    integration('has a single author without a name', () {
       var package = package("test_pkg", "1.0.0");
       package["author"] = "<nweiz@google.com>";
       dir(appPath, [pubspec(package)]).scheduleCreate();
 
       expectValidationWarning(pubspecField);
-      run();
     });
 
-    test('has one of several authors without a name', () {
+    integration('has one of several authors without a name', () {
       var package = package("test_pkg", "1.0.0");
       package.remove("author");
       package["authors"] = [
@@ -209,103 +194,89 @@
       dir(appPath, [pubspec(package)]).scheduleCreate();
 
       expectValidationWarning(pubspecField);
-      run();
     });
 
-    test('has no LICENSE file', () {
+    integration('has no LICENSE file', () {
       file(join(appPath, 'LICENSE'), '').scheduleDelete();
       expectValidationError(license);
-      run();
     });
 
-    test('has an empty package name', () {
+    integration('has an empty package name', () {
       dir(appPath, [libPubspec("", "1.0.0")]).scheduleCreate();
       expectValidationError(name);
-      run();
     });
 
-    test('has a package name with an invalid character', () {
+    integration('has a package name with an invalid character', () {
       dir(appPath, [libPubspec("test-pkg", "1.0.0")]).scheduleCreate();
       expectValidationError(name);
-      run();
     });
 
-    test('has a package name that begins with a number', () {
+    integration('has a package name that begins with a number', () {
       dir(appPath, [libPubspec("8ball", "1.0.0")]).scheduleCreate();
       expectValidationError(name);
-      run();
     });
 
-    test('has a package name that contains upper-case letters', () {
+    integration('has a package name that contains upper-case letters', () {
       dir(appPath, [libPubspec("TestPkg", "1.0.0")]).scheduleCreate();
       expectValidationWarning(name);
-      run();
     });
 
-    test('has a package name that is a Dart reserved word', () {
+    integration('has a package name that is a Dart reserved word', () {
       dir(appPath, [libPubspec("operator", "1.0.0")]).scheduleCreate();
       expectValidationError(name);
-      run();
     });
 
-    test('has a library name with an invalid character', () {
+    integration('has a library name with an invalid character', () {
       dir(appPath, [
         libPubspec("test_pkg", "1.0.0"),
         dir("lib", [file("test-pkg.dart", "int i = 0;")])
       ]).scheduleCreate();
       expectValidationError(name);
-      run();
     });
 
-    test('has a library name that begins with a number', () {
+    integration('has a library name that begins with a number', () {
       dir(appPath, [
         libPubspec("test_pkg", "1.0.0"),
         dir("lib", [file("8ball.dart", "int i = 0;")])
       ]).scheduleCreate();
       expectValidationError(name);
-      run();
     });
 
-    test('has a library name that contains upper-case letters', () {
+    integration('has a library name that contains upper-case letters', () {
       dir(appPath, [
         libPubspec("test_pkg", "1.0.0"),
         dir("lib", [file("TestPkg.dart", "int i = 0;")])
       ]).scheduleCreate();
       expectValidationWarning(name);
-      run();
     });
 
-    test('has a library name that is a Dart reserved word', () {
+    integration('has a library name that is a Dart reserved word', () {
       dir(appPath, [
         libPubspec("test_pkg", "1.0.0"),
         dir("lib", [file("operator.dart", "int i = 0;")])
       ]).scheduleCreate();
       expectValidationError(name);
-      run();
     });
 
-    test('has a single library named differently than the package', () {
+    integration('has a single library named differently than the package', () {
       file(join(appPath, "lib", "test_pkg.dart"), '').scheduleDelete();
       dir(appPath, [
         dir("lib", [file("best_pkg.dart", "int i = 0;")])
       ]).scheduleCreate();
       expectValidationWarning(name);
-      run();
     });
 
-    test('has no lib directory', () {
+    integration('has no lib directory', () {
       dir(join(appPath, "lib")).scheduleDelete();
       expectValidationError(lib);
-      run();
     });
 
-    test('has an empty lib directory', () {
+    integration('has an empty lib directory', () {
       file(join(appPath, "lib", "test_pkg.dart"), '').scheduleDelete();
       expectValidationError(lib);
-      run();
     });
 
-    test('has a lib directory containing only src', () {
+    integration('has a lib directory containing only src', () {
       file(join(appPath, "lib", "test_pkg.dart"), '').scheduleDelete();
       dir(appPath, [
         dir("lib", [
@@ -313,12 +284,12 @@
         ])
       ]).scheduleCreate();
       expectValidationError(lib);
-      run();
     });
 
     group('has a dependency with a non-hosted source', () {
       group('where a hosted version of that dependency exists', () {
-        test("and should suggest the hosted package's primary version", () {
+        integration("and should suggest the hosted package's primary "
+            "version", () {
           useMockClient(new MockClient((request) {
             expect(request.method, equals("GET"));
             expect(request.url.path, equals("/packages/foo.json"));
@@ -339,12 +310,10 @@
           expectLater(schedulePackageValidation(dependency),
               pairOf(isEmpty, someElement(contains(
                   '  foo: ">=2.0.0 <3.0.0"'))));
-
-          run();
         });
 
-        test("and should suggest the hosted package's prerelease version if "
-            "it's the only version available", () {
+        integration("and should suggest the hosted package's prerelease "
+            "version if it's the only version available", () {
           useMockClient(new MockClient((request) {
             expect(request.method, equals("GET"));
             expect(request.url.path, equals("/packages/foo.json"));
@@ -365,12 +334,10 @@
           expectLater(schedulePackageValidation(dependency),
               pairOf(isEmpty, someElement(contains(
                   '  foo: ">=3.0.0-pre <4.0.0"'))));
-
-          run();
         });
 
-        test("and should suggest a tighter constraint if the primary version "
-            "is pre-1.0.0", () {
+        integration("and should suggest a tighter constraint if the primary "
+            "version is pre-1.0.0", () {
           useMockClient(new MockClient((request) {
             expect(request.method, equals("GET"));
             expect(request.url.path, equals("/packages/foo.json"));
@@ -391,13 +358,11 @@
           expectLater(schedulePackageValidation(dependency),
               pairOf(isEmpty, someElement(contains(
                   '  foo: ">=0.0.2 <0.0.3"'))));
-
-          run();
         });
       });
 
       group('where no hosted version of that dependency exists', () {
-        test("and should use the other source's version", () {
+        integration("and should use the other source's version", () {
           useMockClient(new MockClient((request) {
             expect(request.method, equals("GET"));
             expect(request.url.path, equals("/packages/foo.json"));
@@ -417,12 +382,10 @@
           expectLater(schedulePackageValidation(dependency),
               pairOf(isEmpty, someElement(contains(
                   '  foo: ">=1.0.0 <2.0.0"'))));
-
-          run();
         });
 
-        test("and should use the other source's unquoted version if it's "
-            "concrete", () {
+        integration("and should use the other source's unquoted version if "
+            "it's concrete", () {
           useMockClient(new MockClient((request) {
             expect(request.method, equals("GET"));
             expect(request.url.path, equals("/packages/foo.json"));
@@ -441,15 +404,13 @@
 
           expectLater(schedulePackageValidation(dependency),
               pairOf(isEmpty, someElement(contains('  foo: 0.2.3'))));
-
-          run();
         });
       });
     });
 
     group('has an unconstrained dependency', () {
       group('and it should not suggest a version', () {
-        test("if there's no lockfile", () {
+        integration("if there's no lockfile", () {
           dir(appPath, [
             libPubspec("test_pkg", "1.0.0", [
               {'hosted': 'foo'}
@@ -458,11 +419,10 @@
 
           expectLater(schedulePackageValidation(dependency),
               pairOf(isEmpty, everyElement(isNot(contains("\n  foo:")))));
-
-          run();
         });
 
-        test("if the lockfile doesn't have an entry for the dependency", () {
+        integration("if the lockfile doesn't have an entry for the "
+            "dependency", () {
           dir(appPath, [
             libPubspec("test_pkg", "1.0.0", [
               {'hosted': 'foo'}
@@ -483,13 +443,11 @@
 
           expectLater(schedulePackageValidation(dependency),
               pairOf(isEmpty, everyElement(isNot(contains("\n  foo:")))));
-
-          run();
         });
       });
 
       group('with a lockfile', () {
-        test('and it should suggest a constraint based on the locked '
+        integration('and it should suggest a constraint based on the locked '
             'version', () {
           dir(appPath, [
             libPubspec("test_pkg", "1.0.0", [
@@ -512,11 +470,9 @@
           expectLater(schedulePackageValidation(dependency),
               pairOf(isEmpty, someElement(contains(
                   '  foo: ">=1.2.3 <2.0.0"'))));
-
-          run();
         });
 
-        test('and it should suggest a concrete constraint if the locked '
+        integration('and it should suggest a concrete constraint if the locked '
             'version is pre-1.0.0', () {
           dir(appPath, [
             libPubspec("test_pkg", "1.0.0", [
@@ -539,13 +495,11 @@
           expectLater(schedulePackageValidation(dependency),
               pairOf(isEmpty, someElement(contains(
                   '  foo: ">=0.1.2 <0.1.3"'))));
-
-          run();
         });
       });
     });
 
-    test('has a hosted dependency on itself', () {
+    integration('has a hosted dependency on itself', () {
       dir(appPath, [
         libPubspec("test_pkg", "1.0.0", [
           {'hosted': {'name': 'test_pkg', 'version': '>=1.0.0'}}
@@ -553,8 +507,6 @@
       ]).scheduleCreate();
 
       expectValidationWarning(dependency);
-
-      run();
     });
 
     group('has a top-level directory named', () {
@@ -562,10 +514,9 @@
 
       var names = ["tools", "tests", "docs", "examples", "sample", "samples"];
       for (var name in names) {
-        test('"$name"', () {
+        integration('"$name"', () {
           dir(appPath, [dir(name)]).scheduleCreate();
           expectValidationWarning(directory);
-          run();
         });
       }
     });
