Version 0.5.11.0 .

svn merge -r 23017:23167  https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@23173 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/compiler/java/com/google/dart/compiler/DartCompiler.java b/compiler/java/com/google/dart/compiler/DartCompiler.java
index 08ccaa1..b939d6a 100644
--- a/compiler/java/com/google/dart/compiler/DartCompiler.java
+++ b/compiler/java/com/google/dart/compiler/DartCompiler.java
@@ -1062,6 +1062,10 @@
           }
         });
       } else {
+        System.out.println("WARNING: This command is now deprecated, please use dartanalyzer instead.");
+        System.out.println("For more info, see www.dartlang.org/tools/analyzer.");
+        System.out.println();
+        
         result = compilerMain(topCompilerOptions);
       }
     } catch (Throwable t) {
diff --git a/compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java b/compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java
index 891afb1..9e461a1 100644
--- a/compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java
+++ b/compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java
@@ -148,9 +148,7 @@
         String name = element.getName();
         if (libraryImport.isVisible(name)) {
           Element oldElement = scopeForImport.declareElement(name, element);
-          // TODO(8474): Remove the "Expect" special casing.
-          if (oldElement != null
-              && !name.equals("Expect") && !name.equals("ExpectException")) {
+          if (oldElement != null) {
             scopeForImport.declareElement(name,
                 Elements.createDuplicateElement(oldElement, element));
           }
diff --git a/pkg/intl/test/message_extraction/message_extraction_test.dart b/pkg/intl/test/message_extraction/message_extraction_test.dart
index 24f8fc5..85e0323 100644
--- a/pkg/intl/test/message_extraction/message_extraction_test.dart
+++ b/pkg/intl/test/message_extraction/message_extraction_test.dart
@@ -103,9 +103,6 @@
       ..add(filesInTheRightDirectory.first)
       ..addAll(["--output-dir=${dir()}"])
       ..addAll(filesInTheRightDirectory.skip(1));
-  var options = new ProcessOptions()
-      ..stdoutEncoding=Encoding.UTF_8
-      ..stderrEncoding=Encoding.UTF_8;
   var result = Process.run(dart, args);
   return result;
 }
@@ -225,4 +222,4 @@
 //  expect("Zu den kniffligen Dinge Pluralformen");
   verify("Escapes: ");
   verify("\r\f\b\t\v.");
-}
\ No newline at end of file
+}
diff --git a/pkg/pkg.status b/pkg/pkg.status
index e4229f4..c752bfb 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -53,7 +53,7 @@
                                 # 32 bits where we do bitwise operations).
 
 # Skip tests that use local file access if we're running in any browser
-[ $runtime == opera || $runtime == ff || $runtime == ie9 || $runtime == dartium || $runtime == chrome || $runtime == safari || $runtime == drt  || $runtime == jsshell]
+[ $runtime == opera || $runtime == ff || $runtime == ie9 || $runtime == dartium || $runtime == chrome || $runtime == chromeOnAndroid || $runtime == safari || $runtime == drt  || $runtime == jsshell]
 http/test/*: Skip
 oauth2/test/*: Skip
 pathos/test/*: Skip
diff --git a/pkg/scheduled_test/lib/scheduled_process.dart b/pkg/scheduled_test/lib/scheduled_process.dart
index 23370f1..75891a9 100644
--- a/pkg/scheduled_test/lib/scheduled_process.dart
+++ b/pkg/scheduled_test/lib/scheduled_process.dart
@@ -69,18 +69,19 @@
   /// Whether the process is expected to terminate at this point.
   var _endExpected = false;
 
-  /// Schedules a process to start. [executable], [arguments], and [options]
-  /// have the same meaning as for [Process.start]. [description] is a string
-  /// description of this process; it defaults to the command-line invocation.
-  /// [encoding] is the [Encoding] that will be used for the process's input and
-  /// output.
+  /// Schedules a process to start. [executable], [arguments],
+  /// [workingDirectory], and [environment] have the same meaning as for
+  /// [Process.start]. [description] is a string description of this process; it
+  /// defaults to the command-line invocation. [encoding] is the [Encoding] that
+  /// will be used for the process's input and output.
   ///
-  /// [executable], [arguments], and [options] may be either a [Future] or a
-  /// concrete value. If any are [Future]s, the process won't start until the
-  /// [Future]s have completed. In addition, [arguments] may be a [List]
-  /// containing a mix of strings and [Future]s.
+  /// [executable], [arguments], [workingDirectory], and [environment] may be
+  /// either a [Future] or a concrete value. If any are [Future]s, the process
+  /// won't start until the [Future]s have completed. In addition, [arguments]
+  /// may be a [List] containing a mix of strings and [Future]s.
   ScheduledProcess.start(executable, arguments,
-      {options, String description, Encoding encoding: Encoding.UTF_8})
+      {workingDirectory, environment, String description,
+       Encoding encoding: Encoding.UTF_8})
       : _encoding = encoding,
         _explicitDescription = description != null,
         _description = description {
@@ -88,7 +89,7 @@
 
     _updateDescription(executable, arguments);
 
-    _scheduleStartProcess(executable, arguments, options);
+    _scheduleStartProcess(executable, arguments, workingDirectory, environment);
 
     _scheduleExceptionCleanup();
 
@@ -120,7 +121,10 @@
   }
 
   /// Schedules the process to start and sets [_process].
-  void _scheduleStartProcess(executable, arguments, options) {
+  void _scheduleStartProcess(executable,
+                             arguments,
+                             workingDirectory,
+                             environment) {
     var exitCodeCompleter = new Completer();
     _exitCode = new ValueFuture(exitCodeCompleter.future);
 
@@ -135,13 +139,18 @@
       return Future.wait([
         new Future.sync(() => executable),
         awaitObject(arguments),
-        new Future.sync(() => options)
+        new Future.sync(() => workingDirectory),
+        new Future.sync(() => environment)
       ]).then((results) {
         executable = results[0];
         arguments = results[1];
-        options = results[2];
+        workingDirectory = results[2];
+        environment = results[3];
         _updateDescription(executable, arguments);
-        return Process.start(executable, arguments, options).then((process) {
+        return Process.start(executable,
+                             arguments,
+                             workingDirectory: workingDirectory,
+                             environment: environment).then((process) {
           // TODO(nweiz): enable this when issue 9020 is fixed.
           // process.stdin.encoding = Encoding.UTF_8;
           return process;
diff --git a/pkg/unittest/lib/test_controller.js b/pkg/unittest/lib/test_controller.js
index c032854..dd9bba3 100644
--- a/pkg/unittest/lib/test_controller.js
+++ b/pkg/unittest/lib/test_controller.js
@@ -33,7 +33,16 @@
 
 var waitForDone = false;
 
-function sendDomToTestDriver() {
+function notifyStart() {
+  if (window.opener) {
+    window.opener.postMessage("STARTING", "*");
+  }
+}
+
+function notifyDone() {
+  if (testRunner) testRunner.notifyDone();
+  // To support in browser launching of tests we post back start and result
+  // messages to the window.opener.
   if (window.opener) {
     window.opener.postMessage(window.document.body.innerHTML, "*");
   }
@@ -42,8 +51,7 @@
 function processMessage(msg) {
   if (typeof msg != 'string') return;
   if (msg == 'unittest-suite-done') {
-    if (testRunner) testRunner.notifyDone();
-    sendDomToTestDriver();
+    notifyDone();
   } else if (msg == 'unittest-suite-wait-for-done') {
     waitForDone = true;
     if (testRunner) testRunner.startedDartTest = true;
@@ -55,8 +63,7 @@
     }
   } else if (msg == 'unittest-suite-success') {
     dartPrint('PASS');
-    if (testRunner) testRunner.notifyDone();
-    sendDomToTestDriver();
+    notifyDone();
   } else if (msg == 'unittest-suite-fail') {
     showErrorAndExit('Some tests failed.');
   }
@@ -79,8 +86,7 @@
   // dart/tools/testing/run_selenium.py is looking for either PASS or
   // FAIL and will continue polling until one of these words show up.
   dartPrint('FAIL');
-  if (testRunner) testRunner.notifyDone();
-  sendDomToTestDriver();
+  notifyDone();
 }
 
 function onLoad(e) {
@@ -115,8 +121,7 @@
     // posted message.
     setTimeout(function() {
       if (testRunner && !testRunner.startedDartTest) {
-        testRunner.notifyDone();
-        sendDomToTestDriver();
+        notifyDone();
       }
     }, 0);
   }, 50);
@@ -141,6 +146,8 @@
 // dart2js will generate code to call this function instead of calling
 // Dart [main] directly. The argument is a closure that invokes main.
 function dartMainRunner(main) {
+  // We call notifyStart here to notify the encapsulating browser.
+  notifyStart();
   window.postMessage('dart-calling-main', '*');
   try {
     main();
diff --git a/runtime/bin/bin.gypi b/runtime/bin/bin.gypi
index d493619..8cc5866 100644
--- a/runtime/bin/bin.gypi
+++ b/runtime/bin/bin.gypi
@@ -483,6 +483,7 @@
         'libdart_withcore',
         'libdart_builtin',
         'libdart_io',
+        'generate_snapshot_file#host',
         'generate_snapshot_test_dat_file',
       ],
       'include_dirs': [
@@ -491,11 +492,12 @@
       ],
       'sources': [
         'run_vm_tests.cc',
-        'builtin.cc',
         'builtin_natives.cc',
+        'builtin_nolib.cc',
         'builtin.h',
         'io_natives.h',
         # Include generated source files.
+        '<(snapshot_cc_file)',
         '<(builtin_cc_file)',
         '<(io_cc_file)',
         '<(io_patch_cc_file)',
@@ -512,7 +514,7 @@
       'sources/': [
         ['exclude', '\\.(cc|h)$'],
         ['include', 'run_vm_tests.cc'],
-        ['include', 'builtin.cc'],
+        ['include', 'builtin_nolib.cc'],
         ['include', 'builtin_natives.cc'],
         ['include', '_gen\\.cc$'],
         ['include', '_test\\.(cc|h)$'],
diff --git a/runtime/bin/dbg_connection.cc b/runtime/bin/dbg_connection.cc
index c2fc8c2..1d722b9 100644
--- a/runtime/bin/dbg_connection.cc
+++ b/runtime/bin/dbg_connection.cc
@@ -278,12 +278,13 @@
 }
 
 
-void DebuggerConnectionHandler::StartHandler(const char* address,
-                                             int port_number) {
+int DebuggerConnectionHandler::StartHandler(const char* address,
+                                            int port_number) {
   ASSERT(handler_lock_ != NULL);
   MonitorLocker ml(handler_lock_);
   if (listener_fd_ != -1) {
-    return;  // The debugger connection handler was already started.
+    // The debugger connection handler was already started.
+    return Socket::GetPort(listener_fd_);
   }
 
   // First setup breakpoint, exception and delayed breakpoint handlers.
@@ -298,12 +299,13 @@
   // listen, accept connections from debuggers, read and handle/dispatch
   // debugger commands received on these connections.
   ASSERT(listener_fd_ == -1);
-
   OSError *os_error;
   SocketAddresses* addresses = Socket::LookupAddress(address, -1, &os_error);
   listener_fd_ = ServerSocket::CreateBindListen(
       addresses->GetAt(0)->addr(), port_number, 1);
+  port_number = Socket::GetPort(listener_fd_);
   DebuggerConnectionImpl::StartHandler(port_number);
+  return port_number;
 }
 
 
diff --git a/runtime/bin/dbg_connection.h b/runtime/bin/dbg_connection.h
index 0586190..8fd0860 100644
--- a/runtime/bin/dbg_connection.h
+++ b/runtime/bin/dbg_connection.h
@@ -49,7 +49,7 @@
   // Starts the native thread which listens for connections from
   // debugger clients, reads and dispatches debug command messages
   // from the client.
-  static void StartHandler(const char* address, int port_number);
+  static int StartHandler(const char* address, int port_number);
 
   // Called by Isolates when they need to wait for a connection
   // from debugger clients.
diff --git a/runtime/bin/dbg_connection_macos.cc b/runtime/bin/dbg_connection_macos.cc
index 4fd2d1d..d6766fd 100644
--- a/runtime/bin/dbg_connection_macos.cc
+++ b/runtime/bin/dbg_connection_macos.cc
@@ -157,8 +157,7 @@
 void DebuggerConnectionImpl::StartHandler(int port_number) {
   ASSERT(DebuggerConnectionHandler::listener_fd_ != -1);
   SetupPollQueue();
-  int result =
-      dart::Thread::Start(&DebuggerConnectionImpl::Handler, 0);
+  int result = dart::Thread::Start(&DebuggerConnectionImpl::Handler, 0);
   if (result != 0) {
     FATAL1("Failed to start debugger connection handler thread: %d\n", result);
   }
diff --git a/runtime/bin/directory_android.cc b/runtime/bin/directory_android.cc
index 24193f9..f3ea9e6 100644
--- a/runtime/bin/directory_android.cc
+++ b/runtime/bin/directory_android.cc
@@ -229,7 +229,6 @@
                                 path,
                                 recursive,
                                 follow_links,
-                                seen,
                                 &current_link,
                                 listing) && success;
             break;
@@ -479,7 +478,7 @@
     if (stat(ANDROID_TEMP_DIR, &st) != 0) {
       mkdir(ANDROID_TEMP_DIR, 0777);
     }
-    path->Add(ANDROID_TEMP_DIR "/tmp/temp_dir1_");
+    path.Add(ANDROID_TEMP_DIR "/tmp/temp_dir1_");
   } else if ((path.data)[path.length - 1] == '/') {
     path.Add("temp_dir_");
   }
@@ -489,7 +488,7 @@
   }
   char* result;
   do {
-    result = MakeTempDirectory(path->data);
+    result = MakeTempDirectory(path.data);
   } while (result == NULL && errno == EINTR);
   if (result == NULL) {
     return NULL;
diff --git a/runtime/bin/directory_linux.cc b/runtime/bin/directory_linux.cc
index f3c1ec2..bd84753 100644
--- a/runtime/bin/directory_linux.cc
+++ b/runtime/bin/directory_linux.cc
@@ -416,7 +416,18 @@
 
 
 char* Directory::Current() {
-  return getcwd(NULL, 0);
+  size_t size = PATH_MAX;
+  char* buffer = NULL;
+  for (char* result = NULL; result == NULL; size *= 2) {
+    if ((buffer = reinterpret_cast<char*>(realloc(buffer, size))) == NULL) {
+      return NULL;
+    }
+    result = getcwd(buffer, size);
+    if (result == NULL && errno != ERANGE) {
+      return NULL;
+    }
+  }
+  return buffer;
 }
 
 
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc
index 9f7a8ee..c043c2d 100644
--- a/runtime/bin/eventhandler_android.cc
+++ b/runtime/bin/eventhandler_android.cc
@@ -396,9 +396,9 @@
 }
 
 
-void EventHandlerImplementation::Start() {
+void EventHandlerImplementation::Start(EventHandler* handler) {
   int result = dart::Thread::Start(&EventHandlerImplementation::Poll,
-                                   reinterpret_cast<uword>(this));
+                                   reinterpret_cast<uword>(handler));
   if (result != 0) {
     FATAL1("Failed to start event handler thread %d", result);
   }
diff --git a/runtime/bin/eventhandler_android.h b/runtime/bin/eventhandler_android.h
index 5196023..a60beff 100644
--- a/runtime/bin/eventhandler_android.h
+++ b/runtime/bin/eventhandler_android.h
@@ -11,6 +11,7 @@
 #endif
 
 #include <unistd.h>
+#include <sys/epoll.h>
 #include <sys/socket.h>
 
 #include "platform/hashmap.h"
@@ -98,7 +99,7 @@
   // descriptor. Creates a new one if one is not found.
   SocketData* GetSocketData(intptr_t fd);
   void SendData(intptr_t id, Dart_Port dart_port, intptr_t data);
-  void Start();
+  void Start(EventHandler* handler);
   void Shutdown();
 
  private:
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index f485f66..5bfc079 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -47,7 +47,7 @@
 static const int DEFAULT_DEBUG_PORT = 5858;
 static const char* DEFAULT_DEBUG_IP = "127.0.0.1";
 static const char* debug_ip = DEFAULT_DEBUG_IP;
-static int debug_port = 0;
+static int debug_port = -1;
 
 // Global state that defines the VmStats web server port and root directory.
 static int vmstats_port = -1;
@@ -148,7 +148,7 @@
   // TODO(hausner): Add support for specifying an IP address on which
   // the debugger should listen.
   ASSERT(port != NULL);
-  debug_port = 0;
+  debug_port = -1;
   if (*port == '\0') {
     debug_port = DEFAULT_DEBUG_PORT;
   } else {
@@ -156,7 +156,7 @@
       debug_port = atoi(port + 1);
     }
   }
-  if (debug_port == 0) {
+  if (debug_port < 0) {
     Log::PrintErr("unrecognized --debug option syntax. "
                     "Use --debug[:<port number>]\n");
     return false;
@@ -725,10 +725,11 @@
 
   // Start the debugger wire protocol handler if necessary.
   if (start_debugger) {
-    ASSERT(debug_port != 0);
-    DebuggerConnectionHandler::StartHandler(debug_ip, debug_port);
-    if (verbose_debug_seen) {
-      Log::Print("Debugger initialized\n");
+    ASSERT(debug_port >= 0);
+    bool print_msg = verbose_debug_seen || (debug_port == 0);
+    debug_port = DebuggerConnectionHandler::StartHandler(debug_ip, debug_port);
+    if (print_msg) {
+      Log::Print("Debugger listening on port %d\n", debug_port);
     }
   }
   VmStats::Start(vmstats_port, vmstats_root, verbose_debug_seen);
diff --git a/runtime/bin/net/nss.gyp b/runtime/bin/net/nss.gyp
index 64402b5..53d3d6f 100644
--- a/runtime/bin/net/nss.gyp
+++ b/runtime/bin/net/nss.gyp
@@ -7,7 +7,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # This file is a modified copy of Chromium's deps/third_party/nss/nss.gyp.
-# Revision 169195 (this should agree with "nss_rev" in DEPS).
+# Revision 199075 (this should agree with "nss_rev" in DEPS).
 {
   # Added by Dart. All Dart comments refer to the following block or line.
   'includes': [
@@ -95,208 +95,208 @@
       'sources': [
         # Added by Dart.
         'os_linux.S',
-        '<(nss_directory)/mozilla/nsprpub/lib/ds/plarena.c',
-        '<(nss_directory)/mozilla/nsprpub/lib/ds/plarena.h',
-        '<(nss_directory)/mozilla/nsprpub/lib/ds/plarenas.h',
-        '<(nss_directory)/mozilla/nsprpub/lib/ds/plhash.c',
-        '<(nss_directory)/mozilla/nsprpub/lib/ds/plhash.h',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/include/plbase64.h',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/include/plerror.h',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/include/plgetopt.h',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/include/plstr.h',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/src/base64.c',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/src/plerror.c',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/src/plgetopt.c',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/src/strcase.c',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/src/strcat.c',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/src/strchr.c',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/src/strcmp.c',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/src/strcpy.c',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/src/strdup.c',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/src/strlen.c',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/src/strpbrk.c',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/src/strstr.c',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/src/strtok.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/md/prosdep.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/md/_darwin.cfg',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/md/_darwin.h',
+        '<(nss_directory)/nspr/lib/ds/plarena.c',
+        '<(nss_directory)/nspr/lib/ds/plarena.h',
+        '<(nss_directory)/nspr/lib/ds/plarenas.h',
+        '<(nss_directory)/nspr/lib/ds/plhash.c',
+        '<(nss_directory)/nspr/lib/ds/plhash.h',
+        '<(nss_directory)/nspr/lib/libc/include/plbase64.h',
+        '<(nss_directory)/nspr/lib/libc/include/plerror.h',
+        '<(nss_directory)/nspr/lib/libc/include/plgetopt.h',
+        '<(nss_directory)/nspr/lib/libc/include/plstr.h',
+        '<(nss_directory)/nspr/lib/libc/src/base64.c',
+        '<(nss_directory)/nspr/lib/libc/src/plerror.c',
+        '<(nss_directory)/nspr/lib/libc/src/plgetopt.c',
+        '<(nss_directory)/nspr/lib/libc/src/strcase.c',
+        '<(nss_directory)/nspr/lib/libc/src/strcat.c',
+        '<(nss_directory)/nspr/lib/libc/src/strchr.c',
+        '<(nss_directory)/nspr/lib/libc/src/strcmp.c',
+        '<(nss_directory)/nspr/lib/libc/src/strcpy.c',
+        '<(nss_directory)/nspr/lib/libc/src/strdup.c',
+        '<(nss_directory)/nspr/lib/libc/src/strlen.c',
+        '<(nss_directory)/nspr/lib/libc/src/strpbrk.c',
+        '<(nss_directory)/nspr/lib/libc/src/strstr.c',
+        '<(nss_directory)/nspr/lib/libc/src/strtok.c',
+        '<(nss_directory)/nspr/pr/include/md/prosdep.h',
+        '<(nss_directory)/nspr/pr/include/md/_darwin.cfg',
+        '<(nss_directory)/nspr/pr/include/md/_darwin.h',
         # Added by Dart.
-        '<(nss_directory)/mozilla/nsprpub/pr/include/md/_linux.cfg',
+        '<(nss_directory)/nspr/pr/include/md/_linux.cfg',
         # Added by Dart.
-        '<(nss_directory)/mozilla/nsprpub/pr/include/md/_linux.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/md/_pcos.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/md/_pth.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/md/_unixos.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/md/_unix_errors.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/md/_win32_errors.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/md/_win95.cfg',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/md/_win95.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/nspr.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/obsolete/pralarm.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/obsolete/probslet.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/obsolete/protypes.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/obsolete/prsem.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/pratom.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prbit.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prclist.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prcmon.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prcountr.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prcpucfg.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prcvar.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prdtoa.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prenv.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prerr.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prerror.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prinet.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prinit.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prinrval.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prio.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/pripcsem.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/private/pprio.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/private/pprmwait.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/private/pprthred.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/private/primpl.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/private/prpriv.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prlink.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prlock.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prlog.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prlong.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prmem.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prmon.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prmwait.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prnetdb.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prolock.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prpdce.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prprf.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prproces.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prrng.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prrwlock.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prshm.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prshma.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prsystem.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prthread.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prtime.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prtpool.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prtrace.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prtypes.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prvrsion.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/prwin16.h',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/io/prdir.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/io/prfdcach.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/io/prfile.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/io/prio.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/io/priometh.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/io/pripv6.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/io/prlayer.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/io/prlog.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/io/prmapopt.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/io/prmmap.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/io/prmwait.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/io/prpolevt.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/io/prprf.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/io/prscanf.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/io/prsocket.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/io/prstdio.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/linking/prlink.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/malloc/prmalloc.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/malloc/prmem.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/prosdep.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/darwin.c',
+        '<(nss_directory)/nspr/pr/include/md/_linux.h',
+        '<(nss_directory)/nspr/pr/include/md/_pcos.h',
+        '<(nss_directory)/nspr/pr/include/md/_pth.h',
+        '<(nss_directory)/nspr/pr/include/md/_unixos.h',
+        '<(nss_directory)/nspr/pr/include/md/_unix_errors.h',
+        '<(nss_directory)/nspr/pr/include/md/_win32_errors.h',
+        '<(nss_directory)/nspr/pr/include/md/_win95.cfg',
+        '<(nss_directory)/nspr/pr/include/md/_win95.h',
+        '<(nss_directory)/nspr/pr/include/nspr.h',
+        '<(nss_directory)/nspr/pr/include/obsolete/pralarm.h',
+        '<(nss_directory)/nspr/pr/include/obsolete/probslet.h',
+        '<(nss_directory)/nspr/pr/include/obsolete/protypes.h',
+        '<(nss_directory)/nspr/pr/include/obsolete/prsem.h',
+        '<(nss_directory)/nspr/pr/include/pratom.h',
+        '<(nss_directory)/nspr/pr/include/prbit.h',
+        '<(nss_directory)/nspr/pr/include/prclist.h',
+        '<(nss_directory)/nspr/pr/include/prcmon.h',
+        '<(nss_directory)/nspr/pr/include/prcountr.h',
+        '<(nss_directory)/nspr/pr/include/prcpucfg.h',
+        '<(nss_directory)/nspr/pr/include/prcvar.h',
+        '<(nss_directory)/nspr/pr/include/prdtoa.h',
+        '<(nss_directory)/nspr/pr/include/prenv.h',
+        '<(nss_directory)/nspr/pr/include/prerr.h',
+        '<(nss_directory)/nspr/pr/include/prerror.h',
+        '<(nss_directory)/nspr/pr/include/prinet.h',
+        '<(nss_directory)/nspr/pr/include/prinit.h',
+        '<(nss_directory)/nspr/pr/include/prinrval.h',
+        '<(nss_directory)/nspr/pr/include/prio.h',
+        '<(nss_directory)/nspr/pr/include/pripcsem.h',
+        '<(nss_directory)/nspr/pr/include/private/pprio.h',
+        '<(nss_directory)/nspr/pr/include/private/pprmwait.h',
+        '<(nss_directory)/nspr/pr/include/private/pprthred.h',
+        '<(nss_directory)/nspr/pr/include/private/primpl.h',
+        '<(nss_directory)/nspr/pr/include/private/prpriv.h',
+        '<(nss_directory)/nspr/pr/include/prlink.h',
+        '<(nss_directory)/nspr/pr/include/prlock.h',
+        '<(nss_directory)/nspr/pr/include/prlog.h',
+        '<(nss_directory)/nspr/pr/include/prlong.h',
+        '<(nss_directory)/nspr/pr/include/prmem.h',
+        '<(nss_directory)/nspr/pr/include/prmon.h',
+        '<(nss_directory)/nspr/pr/include/prmwait.h',
+        '<(nss_directory)/nspr/pr/include/prnetdb.h',
+        '<(nss_directory)/nspr/pr/include/prolock.h',
+        '<(nss_directory)/nspr/pr/include/prpdce.h',
+        '<(nss_directory)/nspr/pr/include/prprf.h',
+        '<(nss_directory)/nspr/pr/include/prproces.h',
+        '<(nss_directory)/nspr/pr/include/prrng.h',
+        '<(nss_directory)/nspr/pr/include/prrwlock.h',
+        '<(nss_directory)/nspr/pr/include/prshm.h',
+        '<(nss_directory)/nspr/pr/include/prshma.h',
+        '<(nss_directory)/nspr/pr/include/prsystem.h',
+        '<(nss_directory)/nspr/pr/include/prthread.h',
+        '<(nss_directory)/nspr/pr/include/prtime.h',
+        '<(nss_directory)/nspr/pr/include/prtpool.h',
+        '<(nss_directory)/nspr/pr/include/prtrace.h',
+        '<(nss_directory)/nspr/pr/include/prtypes.h',
+        '<(nss_directory)/nspr/pr/include/prvrsion.h',
+        '<(nss_directory)/nspr/pr/include/prwin16.h',
+        '<(nss_directory)/nspr/pr/src/io/prdir.c',
+        '<(nss_directory)/nspr/pr/src/io/prfdcach.c',
+        '<(nss_directory)/nspr/pr/src/io/prfile.c',
+        '<(nss_directory)/nspr/pr/src/io/prio.c',
+        '<(nss_directory)/nspr/pr/src/io/priometh.c',
+        '<(nss_directory)/nspr/pr/src/io/pripv6.c',
+        '<(nss_directory)/nspr/pr/src/io/prlayer.c',
+        '<(nss_directory)/nspr/pr/src/io/prlog.c',
+        '<(nss_directory)/nspr/pr/src/io/prmapopt.c',
+        '<(nss_directory)/nspr/pr/src/io/prmmap.c',
+        '<(nss_directory)/nspr/pr/src/io/prmwait.c',
+        '<(nss_directory)/nspr/pr/src/io/prpolevt.c',
+        '<(nss_directory)/nspr/pr/src/io/prprf.c',
+        '<(nss_directory)/nspr/pr/src/io/prscanf.c',
+        '<(nss_directory)/nspr/pr/src/io/prsocket.c',
+        '<(nss_directory)/nspr/pr/src/io/prstdio.c',
+        '<(nss_directory)/nspr/pr/src/linking/prlink.c',
+        '<(nss_directory)/nspr/pr/src/malloc/prmalloc.c',
+        '<(nss_directory)/nspr/pr/src/malloc/prmem.c',
+        '<(nss_directory)/nspr/pr/src/md/prosdep.c',
+        '<(nss_directory)/nspr/pr/src/md/unix/darwin.c',
         # Added by Dart.
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/linux.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/os_Darwin.s',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/os_Darwin_x86.s',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/os_Darwin_x86_64.s',
+        '<(nss_directory)/nspr/pr/src/md/unix/linux.c',
+        '<(nss_directory)/nspr/pr/src/md/unix/os_Darwin.s',
+        '<(nss_directory)/nspr/pr/src/md/unix/os_Darwin_x86.s',
+        '<(nss_directory)/nspr/pr/src/md/unix/os_Darwin_x86_64.s',
         # Added by Dart.
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/os_Linux_x86.s',
+        '<(nss_directory)/nspr/pr/src/md/unix/os_Linux_x86.s',
         # Added by Dart.
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/os_Linux_x86_64.s',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/unix.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/unix_errors.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/uxproces.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/uxrng.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/uxshm.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/uxwrap.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/windows/ntgc.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/windows/ntinrval.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/windows/ntmisc.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/windows/ntsec.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/windows/ntsem.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/windows/w32ipcsem.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/windows/w32poll.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/windows/w32rng.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/windows/w32shm.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/windows/w95cv.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/windows/w95dllmain.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/windows/w95io.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/windows/w95sock.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/windows/w95thred.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/md/windows/win32_errors.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/memory/prseg.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/memory/prshm.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/memory/prshma.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/pralarm.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/pratom.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/praton.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prcountr.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prdtoa.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prenv.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prerr.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prerror.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prerrortable.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prinit.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prinrval.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/pripc.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/pripcsem.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prlog2.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prlong.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prnetdb.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prolock.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prrng.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prsystem.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prthinfo.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prtime.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prtpool.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/misc/prtrace.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/pthreads/ptio.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/pthreads/ptmisc.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/pthreads/ptsynch.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/pthreads/ptthread.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/threads/combined/prucpu.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/threads/combined/prucv.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/threads/combined/prulock.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/threads/combined/prustack.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/threads/combined/pruthr.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/threads/prcmon.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/threads/prcthr.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/threads/prdump.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/threads/prmon.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/threads/prrwlock.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/threads/prsem.c',
-        '<(nss_directory)/mozilla/nsprpub/pr/src/threads/prtpd.c',
+        '<(nss_directory)/nspr/pr/src/md/unix/os_Linux_x86_64.s',
+        '<(nss_directory)/nspr/pr/src/md/unix/unix.c',
+        '<(nss_directory)/nspr/pr/src/md/unix/unix_errors.c',
+        '<(nss_directory)/nspr/pr/src/md/unix/uxproces.c',
+        '<(nss_directory)/nspr/pr/src/md/unix/uxrng.c',
+        '<(nss_directory)/nspr/pr/src/md/unix/uxshm.c',
+        '<(nss_directory)/nspr/pr/src/md/unix/uxwrap.c',
+        '<(nss_directory)/nspr/pr/src/md/windows/ntgc.c',
+        '<(nss_directory)/nspr/pr/src/md/windows/ntinrval.c',
+        '<(nss_directory)/nspr/pr/src/md/windows/ntmisc.c',
+        '<(nss_directory)/nspr/pr/src/md/windows/ntsec.c',
+        '<(nss_directory)/nspr/pr/src/md/windows/ntsem.c',
+        '<(nss_directory)/nspr/pr/src/md/windows/w32ipcsem.c',
+        '<(nss_directory)/nspr/pr/src/md/windows/w32poll.c',
+        '<(nss_directory)/nspr/pr/src/md/windows/w32rng.c',
+        '<(nss_directory)/nspr/pr/src/md/windows/w32shm.c',
+        '<(nss_directory)/nspr/pr/src/md/windows/w95cv.c',
+        '<(nss_directory)/nspr/pr/src/md/windows/w95dllmain.c',
+        '<(nss_directory)/nspr/pr/src/md/windows/w95io.c',
+        '<(nss_directory)/nspr/pr/src/md/windows/w95sock.c',
+        '<(nss_directory)/nspr/pr/src/md/windows/w95thred.c',
+        '<(nss_directory)/nspr/pr/src/md/windows/win32_errors.c',
+        '<(nss_directory)/nspr/pr/src/memory/prseg.c',
+        '<(nss_directory)/nspr/pr/src/memory/prshm.c',
+        '<(nss_directory)/nspr/pr/src/memory/prshma.c',
+        '<(nss_directory)/nspr/pr/src/misc/pralarm.c',
+        '<(nss_directory)/nspr/pr/src/misc/pratom.c',
+        '<(nss_directory)/nspr/pr/src/misc/praton.c',
+        '<(nss_directory)/nspr/pr/src/misc/prcountr.c',
+        '<(nss_directory)/nspr/pr/src/misc/prdtoa.c',
+        '<(nss_directory)/nspr/pr/src/misc/prenv.c',
+        '<(nss_directory)/nspr/pr/src/misc/prerr.c',
+        '<(nss_directory)/nspr/pr/src/misc/prerror.c',
+        '<(nss_directory)/nspr/pr/src/misc/prerrortable.c',
+        '<(nss_directory)/nspr/pr/src/misc/prinit.c',
+        '<(nss_directory)/nspr/pr/src/misc/prinrval.c',
+        '<(nss_directory)/nspr/pr/src/misc/pripc.c',
+        '<(nss_directory)/nspr/pr/src/misc/pripcsem.c',
+        '<(nss_directory)/nspr/pr/src/misc/prlog2.c',
+        '<(nss_directory)/nspr/pr/src/misc/prlong.c',
+        '<(nss_directory)/nspr/pr/src/misc/prnetdb.c',
+        '<(nss_directory)/nspr/pr/src/misc/prolock.c',
+        '<(nss_directory)/nspr/pr/src/misc/prrng.c',
+        '<(nss_directory)/nspr/pr/src/misc/prsystem.c',
+        '<(nss_directory)/nspr/pr/src/misc/prthinfo.c',
+        '<(nss_directory)/nspr/pr/src/misc/prtime.c',
+        '<(nss_directory)/nspr/pr/src/misc/prtpool.c',
+        '<(nss_directory)/nspr/pr/src/misc/prtrace.c',
+        '<(nss_directory)/nspr/pr/src/pthreads/ptio.c',
+        '<(nss_directory)/nspr/pr/src/pthreads/ptmisc.c',
+        '<(nss_directory)/nspr/pr/src/pthreads/ptsynch.c',
+        '<(nss_directory)/nspr/pr/src/pthreads/ptthread.c',
+        '<(nss_directory)/nspr/pr/src/threads/combined/prucpu.c',
+        '<(nss_directory)/nspr/pr/src/threads/combined/prucv.c',
+        '<(nss_directory)/nspr/pr/src/threads/combined/prulock.c',
+        '<(nss_directory)/nspr/pr/src/threads/combined/prustack.c',
+        '<(nss_directory)/nspr/pr/src/threads/combined/pruthr.c',
+        '<(nss_directory)/nspr/pr/src/threads/prcmon.c',
+        '<(nss_directory)/nspr/pr/src/threads/prcthr.c',
+        '<(nss_directory)/nspr/pr/src/threads/prdump.c',
+        '<(nss_directory)/nspr/pr/src/threads/prmon.c',
+        '<(nss_directory)/nspr/pr/src/threads/prrwlock.c',
+        '<(nss_directory)/nspr/pr/src/threads/prsem.c',
+        '<(nss_directory)/nspr/pr/src/threads/prtpd.c',
       ],
       'defines': [
         '_NSPR_BUILD_',
         'FORCE_PR_LOG',
       ],
       'include_dirs': [
-        '<(nss_directory)/mozilla/nsprpub/pr/include',
-        '<(nss_directory)/mozilla/nsprpub/pr/include/private',
-        '<(nss_directory)/mozilla/nsprpub/lib/ds',
-        '<(nss_directory)/mozilla/nsprpub/lib/libc/include',
+        '<(nss_directory)/nspr/pr/include',
+        '<(nss_directory)/nspr/pr/include/private',
+        '<(nss_directory)/nspr/lib/ds',
+        '<(nss_directory)/nspr/lib/libc/include',
       ],
       'direct_dependent_settings': {
         'defines': [
           'NO_NSPR_10_SUPPORT',
         ],
         'include_dirs': [
-          '<(nss_directory)/mozilla/nsprpub/pr/include',
-          '<(nss_directory)/mozilla/nsprpub/lib/ds',
-          '<(nss_directory)/mozilla/nsprpub/lib/libc/include',
+          '<(nss_directory)/nspr/pr/include',
+          '<(nss_directory)/nspr/lib/ds',
+          '<(nss_directory)/nspr/lib/libc/include',
         ],
       },
       # TODO(wtc): suppress C4244 and C4554 in prdtoa.c.
-      'msvs_disabled_warnings': [4018, 4244, 4554],
+      'msvs_disabled_warnings': [4018, 4244, 4554, 4267,],
       'conditions': [
         ['OS=="mac" or OS=="ios"', {
           'defines': [
@@ -313,33 +313,33 @@
           ],
           # Changed by Dart:
           # nss_directory contains .., which is bad in a regular expression.
-          # So we use the partial match by dropping '^' from '^mozilla/...
+          # So we use the partial match by dropping '^' from '^nspr/...
           'sources/': [
-            ['exclude', 'mozilla/nsprpub/pr/src/md/windows/'],
-            ['exclude', 'mozilla/nsprpub/pr/src/threads/combined/'],
+            ['exclude', 'nspr/pr/src/md/windows/'],
+            ['exclude', 'nspr/pr/src/threads/combined/'],
           ],
           'sources!': [
             # Added by Dart.
             'os_linux.S',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/io/prdir.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/io/prfile.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/io/prio.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/io/prsocket.c',
+            '<(nss_directory)/nspr/pr/src/io/prdir.c',
+            '<(nss_directory)/nspr/pr/src/io/prfile.c',
+            '<(nss_directory)/nspr/pr/src/io/prio.c',
+            '<(nss_directory)/nspr/pr/src/io/prsocket.c',
             # os_Darwin_x86.s and os_Darwin_x86_64.s are included by
             # os_Darwin.s.
             # Added by Dart.
-            '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/linux.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/os_Darwin_x86.s',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/os_Darwin_x86_64.s',
+            '<(nss_directory)/nspr/pr/src/md/unix/linux.c',
+            '<(nss_directory)/nspr/pr/src/md/unix/os_Darwin_x86.s',
+            '<(nss_directory)/nspr/pr/src/md/unix/os_Darwin_x86_64.s',
             # Added by Dart.
-            '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/os_Linux_x86.s',
+            '<(nss_directory)/nspr/pr/src/md/unix/os_Linux_x86.s',
             # Added by Dart.
-            '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/os_Linux_x86_64.s',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/misc/pripcsem.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/threads/prcthr.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/threads/prdump.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/threads/prmon.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/threads/prsem.c',
+            '<(nss_directory)/nspr/pr/src/md/unix/os_Linux_x86_64.s',
+            '<(nss_directory)/nspr/pr/src/misc/pripcsem.c',
+            '<(nss_directory)/nspr/pr/src/threads/prcthr.c',
+            '<(nss_directory)/nspr/pr/src/threads/prdump.c',
+            '<(nss_directory)/nspr/pr/src/threads/prmon.c',
+            '<(nss_directory)/nspr/pr/src/threads/prsem.c',
           ],
         }],
         # Added by Dart.
@@ -361,27 +361,27 @@
             '_NSPR_BUILD_',
           ],
           'sources/': [
-            ['exclude', 'mozilla/nsprpub/pr/src/md/windows/'],
-            ['exclude', 'mozilla/nsprpub/pr/src/threads/combined/'],
+            ['exclude', 'nspr/pr/src/md/windows/'],
+            ['exclude', 'nspr/pr/src/threads/combined/'],
           ],
           'sources!': [
-            '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/darwin.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/os_Darwin.s',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/os_Darwin_x86.s',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/os_Darwin_x86_64.s',
+            '<(nss_directory)/nspr/pr/src/md/unix/darwin.c',
+            '<(nss_directory)/nspr/pr/src/md/unix/os_Darwin.s',
+            '<(nss_directory)/nspr/pr/src/md/unix/os_Darwin_x86.s',
+            '<(nss_directory)/nspr/pr/src/md/unix/os_Darwin_x86_64.s',
             # os_Linux_x86.s and os_Linux_x86_64.s are included by
             # runtime/bin/net/os_Linux.S.
-            '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/os_Linux_x86.s',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/md/unix/os_Linux_x86_64.s',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/misc/pripcsem.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/threads/prcthr.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/threads/prdump.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/threads/prmon.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/threads/prsem.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/io/prdir.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/io/prfile.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/io/prio.c',
-            '<(nss_directory)/mozilla/nsprpub/pr/src/io/prsocket.c',
+            '<(nss_directory)/nspr/pr/src/md/unix/os_Linux_x86.s',
+            '<(nss_directory)/nspr/pr/src/md/unix/os_Linux_x86_64.s',
+            '<(nss_directory)/nspr/pr/src/misc/pripcsem.c',
+            '<(nss_directory)/nspr/pr/src/threads/prcthr.c',
+            '<(nss_directory)/nspr/pr/src/threads/prdump.c',
+            '<(nss_directory)/nspr/pr/src/threads/prmon.c',
+            '<(nss_directory)/nspr/pr/src/threads/prsem.c',
+            '<(nss_directory)/nspr/pr/src/io/prdir.c',
+            '<(nss_directory)/nspr/pr/src/io/prfile.c',
+            '<(nss_directory)/nspr/pr/src/io/prio.c',
+            '<(nss_directory)/nspr/pr/src/io/prsocket.c',
           ],
         }],
         ['OS=="mac"', {
@@ -412,10 +412,10 @@
           ],
           # Changed by Dart:
           # nss_directory contains .., which is bad in a regular expression.
-          # So we use the partial match by dropping '^' from '^mozilla/...
+          # So we use the partial match by dropping '^' from '^nspr/...
           'sources/': [
-            ['exclude', 'mozilla/nsprpub/pr/src/md/unix/'],
-            ['exclude', 'mozilla/nsprpub/pr/src/pthreads/'],
+            ['exclude', 'nspr/pr/src/md/unix/'],
+            ['exclude', 'nspr/pr/src/pthreads/'],
           ],
           'conditions': [
             ['target_arch=="ia32"', {
@@ -468,7 +468,7 @@
         # Ensure at least one object file is produced, so that MSVC does not
         # warn when creating the static/shared library. See the note for
         # the 'nssckbi' target for why the 'nss' target was split as such.
-        '<(nss_directory)/mozilla/security/nss/lib/nss/nssver.c',
+        '<(nss_directory)/nss/lib/nss/nssver.c',
       ],
       'conditions': [
         ['exclude_nss_root_certs==0', {
@@ -486,7 +486,7 @@
         }],
         ['OS == "win" and component == "shared_library"', {
           'sources': [
-            '<(nss_directory)/mozilla/security/nss/exports_win.def',
+            '<(nss_directory)/nss/exports_win.def',
           ],
         }],
       ],
@@ -513,45 +513,45 @@
       # should be on 'nss'.
       'suppress_wildcard': 1,
       'sources': [
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/builtins/anchor.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/builtins/bfind.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/builtins/binst.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/builtins/bobject.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/builtins/bsession.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/builtins/bslot.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/builtins/btoken.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/builtins/builtins.h',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/builtins/certdata.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/builtins/ckbiver.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/builtins/constants.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/builtins/nssckbi.h',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/ck.h',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/ckfw.h',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/ckfwm.h',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/ckfwtm.h',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/ckmd.h',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/ckt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/crypto.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/find.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/hash.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/instance.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/mechanism.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/mutex.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/nssck.api',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/nssckepv.h',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/nssckft.h',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/nssckfw.h',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/nssckfwc.h',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/nssckfwt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/nssckg.h',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/nssckmdt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/nssckt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/object.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/session.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/sessobj.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/slot.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/token.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw/wrap.c',
+        '<(nss_directory)/nss/lib/ckfw/builtins/anchor.c',
+        '<(nss_directory)/nss/lib/ckfw/builtins/bfind.c',
+        '<(nss_directory)/nss/lib/ckfw/builtins/binst.c',
+        '<(nss_directory)/nss/lib/ckfw/builtins/bobject.c',
+        '<(nss_directory)/nss/lib/ckfw/builtins/bsession.c',
+        '<(nss_directory)/nss/lib/ckfw/builtins/bslot.c',
+        '<(nss_directory)/nss/lib/ckfw/builtins/btoken.c',
+        '<(nss_directory)/nss/lib/ckfw/builtins/builtins.h',
+        '<(nss_directory)/nss/lib/ckfw/builtins/certdata.c',
+        '<(nss_directory)/nss/lib/ckfw/builtins/ckbiver.c',
+        '<(nss_directory)/nss/lib/ckfw/builtins/constants.c',
+        '<(nss_directory)/nss/lib/ckfw/builtins/nssckbi.h',
+        '<(nss_directory)/nss/lib/ckfw/ck.h',
+        '<(nss_directory)/nss/lib/ckfw/ckfw.h',
+        '<(nss_directory)/nss/lib/ckfw/ckfwm.h',
+        '<(nss_directory)/nss/lib/ckfw/ckfwtm.h',
+        '<(nss_directory)/nss/lib/ckfw/ckmd.h',
+        '<(nss_directory)/nss/lib/ckfw/ckt.h',
+        '<(nss_directory)/nss/lib/ckfw/crypto.c',
+        '<(nss_directory)/nss/lib/ckfw/find.c',
+        '<(nss_directory)/nss/lib/ckfw/hash.c',
+        '<(nss_directory)/nss/lib/ckfw/instance.c',
+        '<(nss_directory)/nss/lib/ckfw/mechanism.c',
+        '<(nss_directory)/nss/lib/ckfw/mutex.c',
+        '<(nss_directory)/nss/lib/ckfw/nssck.api',
+        '<(nss_directory)/nss/lib/ckfw/nssckepv.h',
+        '<(nss_directory)/nss/lib/ckfw/nssckft.h',
+        '<(nss_directory)/nss/lib/ckfw/nssckfw.h',
+        '<(nss_directory)/nss/lib/ckfw/nssckfwc.h',
+        '<(nss_directory)/nss/lib/ckfw/nssckfwt.h',
+        '<(nss_directory)/nss/lib/ckfw/nssckg.h',
+        '<(nss_directory)/nss/lib/ckfw/nssckmdt.h',
+        '<(nss_directory)/nss/lib/ckfw/nssckt.h',
+        '<(nss_directory)/nss/lib/ckfw/object.c',
+        '<(nss_directory)/nss/lib/ckfw/session.c',
+        '<(nss_directory)/nss/lib/ckfw/sessobj.c',
+        '<(nss_directory)/nss/lib/ckfw/slot.c',
+        '<(nss_directory)/nss/lib/ckfw/token.c',
+        '<(nss_directory)/nss/lib/ckfw/wrap.c',
       ],
       'dependencies': [
         'nss_static_dart',  # Added by Dart (the _dart postfix)
@@ -560,11 +560,11 @@
         'nss_static_dart',  # Added by Dart (the _dart postfix)
       ],
       'include_dirs': [
-        '<(nss_directory)/mozilla/security/nss/lib/ckfw',
+        '<(nss_directory)/nss/lib/ckfw',
       ],
       'direct_dependent_settings': {
         'include_dirs': [
-          '<(nss_directory)/mozilla/security/nss/lib/ckfw/builtins',
+          '<(nss_directory)/nss/lib/ckfw/builtins',
         ],
       },
     },
@@ -575,491 +575,508 @@
       # should be on 'nss'.
       'suppress_wildcard': 1,
       'sources': [
-        '<(nss_directory)/mozilla/security/nss/lib/base/arena.c',
-        '<(nss_directory)/mozilla/security/nss/lib/base/base.h',
-        '<(nss_directory)/mozilla/security/nss/lib/base/baset.h',
-        '<(nss_directory)/mozilla/security/nss/lib/base/error.c',
-        '<(nss_directory)/mozilla/security/nss/lib/base/errorval.c',
-        '<(nss_directory)/mozilla/security/nss/lib/base/hash.c',
-        '<(nss_directory)/mozilla/security/nss/lib/base/hashops.c',
-        '<(nss_directory)/mozilla/security/nss/lib/base/item.c',
-        '<(nss_directory)/mozilla/security/nss/lib/base/libc.c',
-        '<(nss_directory)/mozilla/security/nss/lib/base/list.c',
-        '<(nss_directory)/mozilla/security/nss/lib/base/nssbase.h',
-        '<(nss_directory)/mozilla/security/nss/lib/base/nssbaset.h',
-        '<(nss_directory)/mozilla/security/nss/lib/base/nssutf8.c',
-        '<(nss_directory)/mozilla/security/nss/lib/base/tracker.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/alg1485.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/cert.h',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/certdb.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/certdb.h',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/certi.h',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/certt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/certv3.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/certxutl.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/certxutl.h',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/crl.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/genname.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/genname.h',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/polcyxtn.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/secname.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/stanpcertdb.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/xauthkid.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/xbsconst.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/xconst.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb/xconst.h',
-        '<(nss_directory)/mozilla/security/nss/lib/certhigh/certhigh.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certhigh/certhtml.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certhigh/certreq.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certhigh/certvfy.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certhigh/certvfypkix.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certhigh/certvfypkixprint.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certhigh/crlv2.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certhigh/ocsp.c',
-        '<(nss_directory)/mozilla/security/nss/lib/certhigh/ocsp.h',
-        '<(nss_directory)/mozilla/security/nss/lib/certhigh/ocspi.h',
-        '<(nss_directory)/mozilla/security/nss/lib/certhigh/ocspt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/certhigh/ocspti.h',
-        '<(nss_directory)/mozilla/security/nss/lib/certhigh/xcrldist.c',
-        '<(nss_directory)/mozilla/security/nss/lib/cryptohi/cryptohi.h',
-        '<(nss_directory)/mozilla/security/nss/lib/cryptohi/cryptoht.h',
-        '<(nss_directory)/mozilla/security/nss/lib/cryptohi/dsautil.c',
-        '<(nss_directory)/mozilla/security/nss/lib/cryptohi/key.h',
-        '<(nss_directory)/mozilla/security/nss/lib/cryptohi/keyhi.h',
-        '<(nss_directory)/mozilla/security/nss/lib/cryptohi/keyi.h',
-        '<(nss_directory)/mozilla/security/nss/lib/cryptohi/keyt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/cryptohi/keythi.h',
-        '<(nss_directory)/mozilla/security/nss/lib/cryptohi/sechash.c',
-        '<(nss_directory)/mozilla/security/nss/lib/cryptohi/sechash.h',
-        '<(nss_directory)/mozilla/security/nss/lib/cryptohi/seckey.c',
-        '<(nss_directory)/mozilla/security/nss/lib/cryptohi/secsign.c',
-        '<(nss_directory)/mozilla/security/nss/lib/cryptohi/secvfy.c',
-        '<(nss_directory)/mozilla/security/nss/lib/dev/ckhelper.c',
-        '<(nss_directory)/mozilla/security/nss/lib/dev/ckhelper.h',
-        '<(nss_directory)/mozilla/security/nss/lib/dev/dev.h',
-        '<(nss_directory)/mozilla/security/nss/lib/dev/devm.h',
-        '<(nss_directory)/mozilla/security/nss/lib/dev/devslot.c',
-        '<(nss_directory)/mozilla/security/nss/lib/dev/devt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/dev/devtm.h',
-        '<(nss_directory)/mozilla/security/nss/lib/dev/devtoken.c',
-        '<(nss_directory)/mozilla/security/nss/lib/dev/devutil.c',
-        '<(nss_directory)/mozilla/security/nss/lib/dev/nssdev.h',
-        '<(nss_directory)/mozilla/security/nss/lib/dev/nssdevt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/aeskeywrap.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/alg2268.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/alghmac.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/alghmac.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/arcfive.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/arcfour.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/blapi.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/blapii.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/blapit.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/camellia.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/camellia.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/des.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/des.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/desblapi.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/dh.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/drbg.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/dsa.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ec.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ec.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ec2.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ecl-curve.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ecl-exp.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ecl-priv.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ecl.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ecl.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ecl_curve.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ecl_gf.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ecl_mult.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ecp.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ecp_aff.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ecp_jac.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ecp_jm.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ecp_mont.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ec_naf.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/jpake.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/md2.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/md5.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/logtab.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mpcpucache.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mpi-config.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mpi-priv.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mpi.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mpi.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mpi_amd64.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mpi_x86_asm.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mplogic.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mplogic.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mpmontg.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mpprime.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mpprime.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mp_gf2m-priv.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mp_gf2m.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mp_gf2m.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/primes.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/pqg.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/pqg.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/rawhash.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/rijndael.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/rijndael.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/rijndael32.tab',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/rsa.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/secmpi.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/secrng.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/seed.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/seed.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/sha256.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/sha512.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/sha_fast.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/sha_fast.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/shsign.h',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/shvfy.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/sysrand.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/tlsprfalg.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/unix_rand.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/win_rand.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/include/pkix.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/include/pkix_certsel.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/include/pkix_certstore.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/include/pkix_checker.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/include/pkix_crlsel.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/include/pkix_errorstrings.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/include/pkix_params.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/include/pkix_pl_pki.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/include/pkix_pl_system.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/include/pkix_results.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/include/pkix_revchecker.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/include/pkix_sample_modules.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/include/pkix_util.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/include/pkixt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/certsel/pkix_certselector.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/certsel/pkix_certselector.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/certsel/pkix_comcertselparams.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/certsel/pkix_comcertselparams.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_basicconstraintschecker.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_basicconstraintschecker.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_certchainchecker.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_certchainchecker.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_crlchecker.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_crlchecker.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_ekuchecker.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_ekuchecker.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_expirationchecker.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_expirationchecker.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_namechainingchecker.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_namechainingchecker.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_nameconstraintschecker.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_nameconstraintschecker.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_ocspchecker.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_ocspchecker.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_policychecker.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_policychecker.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_revocationchecker.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_revocationchecker.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_revocationmethod.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_revocationmethod.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_signaturechecker.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_signaturechecker.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_targetcertchecker.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker/pkix_targetcertchecker.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/crlsel/pkix_comcrlselparams.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/crlsel/pkix_comcrlselparams.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/crlsel/pkix_crlselector.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/crlsel/pkix_crlselector.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/params/pkix_procparams.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/params/pkix_procparams.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/params/pkix_resourcelimits.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/params/pkix_resourcelimits.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/params/pkix_trustanchor.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/params/pkix_trustanchor.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/params/pkix_valparams.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/params/pkix_valparams.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/results/pkix_buildresult.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/results/pkix_buildresult.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/results/pkix_policynode.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/results/pkix_policynode.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/results/pkix_valresult.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/results/pkix_valresult.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/results/pkix_verifynode.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/results/pkix_verifynode.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/store/pkix_store.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/store/pkix_store.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/top/pkix_build.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/top/pkix_build.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/top/pkix_lifecycle.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/top/pkix_lifecycle.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/top/pkix_validate.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/top/pkix_validate.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/util/pkix_error.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/util/pkix_error.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/util/pkix_errpaths.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/util/pkix_list.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/util/pkix_list.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/util/pkix_logger.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/util/pkix_logger.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/util/pkix_tools.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/util/pkix_tools.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_aiamgr.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_aiamgr.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_colcertstore.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_colcertstore.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_httpcertstore.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_httpcertstore.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_httpdefaultclient.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_httpdefaultclient.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldapcertstore.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldapcertstore.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldapdefaultclient.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldapdefaultclient.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldaprequest.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldaprequest.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldapresponse.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldapresponse.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldapt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldaptemplates.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_nsscontext.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_nsscontext.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_pk11certstore.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_pk11certstore.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_socket.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_socket.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_basicconstraints.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_basicconstraints.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_cert.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_cert.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicyinfo.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicyinfo.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicymap.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicymap.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicyqualifier.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicyqualifier.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crl.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crl.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crldp.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crldp.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crlentry.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crlentry.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_date.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_date.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_generalname.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_generalname.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_infoaccess.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_infoaccess.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_nameconstraints.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_nameconstraints.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocspcertid.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocspcertid.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocsprequest.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocsprequest.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocspresponse.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocspresponse.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_publickey.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_publickey.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_x500name.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_x500name.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_bigint.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_bigint.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_bytearray.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_bytearray.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_common.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_common.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_error.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_hashtable.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_hashtable.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_lifecycle.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_lifecycle.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_mem.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_mem.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_monitorlock.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_monitorlock.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_mutex.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_mutex.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_object.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_object.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_oid.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_oid.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_primhash.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_primhash.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_rwlock.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_rwlock.h',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_string.c',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_string.h',
-        '<(nss_directory)/mozilla/security/nss/lib/nss/nss.h',
-        '<(nss_directory)/mozilla/security/nss/lib/nss/nssinit.c',
-        '<(nss_directory)/mozilla/security/nss/lib/nss/nssrenam.h',
-        '<(nss_directory)/mozilla/security/nss/lib/nss/utilwrap.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/debug_module.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/dev3hack.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/dev3hack.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11akey.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11auth.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11cert.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11cxt.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11err.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11func.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11kea.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11list.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11load.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11mech.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11merge.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11nobj.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11obj.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11pars.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11pbe.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11pk12.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11pqg.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11pqg.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11priv.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11pub.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11sdr.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11sdr.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11skey.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11slot.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11util.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/secmod.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/secmodi.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/secmodt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/secmodti.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/secpkcs5.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pkcs7/certread.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pkcs7/p7common.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pkcs7/p7create.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pkcs7/p7decode.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pkcs7/p7encode.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pkcs7/p7local.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pkcs7/p7local.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pkcs7/pkcs7t.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pkcs7/secmime.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pkcs7/secmime.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pkcs7/secpkcs7.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/asymmkey.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/certdecode.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/certificate.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/cryptocontext.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/nsspki.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/nsspkit.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/pki.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/pki3hack.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/pki3hack.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/pkibase.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/pkim.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/pkistore.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/pkistore.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/pkit.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/pkitm.h',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/symmkey.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/tdcache.c',
-        '<(nss_directory)/mozilla/security/nss/lib/pki/trustdomain.c',
-        '<(nss_directory)/mozilla/security/nss/lib/smime/cms.h',
-        '<(nss_directory)/mozilla/security/nss/lib/smime/cmslocal.h',
-        '<(nss_directory)/mozilla/security/nss/lib/smime/cmsreclist.h',
-        '<(nss_directory)/mozilla/security/nss/lib/smime/cmst.h',
-        '<(nss_directory)/mozilla/security/nss/lib/smime/smime.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/ecdecode.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/fipsaudt.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/fipstest.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/fipstokn.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/jpakesftk.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/lgglue.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/lgglue.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/lowkey.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/lowkeyi.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/lowkeyti.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/lowpbe.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/lowpbe.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/padbuf.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/pkcs11.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/pkcs11c.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/pkcs11i.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/pkcs11ni.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/pkcs11u.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/rsawrapr.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/sdb.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/sdb.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/sftkdb.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/sftkdb.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/sftkdbt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/sftkdbti.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/sftkpars.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/sftkpars.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/sftkpwd.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/softkver.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/softkver.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/softoken.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/softoknt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/tlsprf.c',
-        '<(nss_directory)/mozilla/security/nss/lib/ssl/sslerr.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/SECerrs.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/base64.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/ciferfam.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/derdec.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/derenc.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/dersubr.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/dertime.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/errstrs.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/hasht.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/nssb64.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/nssb64d.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/nssb64e.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/nssb64t.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/nssilckt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/nssilock.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/nssilock.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/nsslocks.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/nssrwlk.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/nssrwlk.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/nssrwlkt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/nssutil.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/oidstring.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/pkcs11.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/pkcs11f.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/pkcs11n.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/pkcs11p.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/pkcs11t.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/pkcs11u.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/portreg.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/portreg.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/quickder.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secalgid.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secasn1.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secasn1d.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secasn1e.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secasn1t.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secasn1u.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/seccomon.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secder.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secdert.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secdig.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secdig.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secdigt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secerr.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secitem.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secitem.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secoid.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secoid.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secoidt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secport.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/secport.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/sectime.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/templates.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/utf8.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/utilmod.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/utilmodt.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/utilpars.c',
-        '<(nss_directory)/mozilla/security/nss/lib/util/utilpars.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/utilparst.h',
-        '<(nss_directory)/mozilla/security/nss/lib/util/utilrename.h',
+        '<(nss_directory)/nss/lib/base/arena.c',
+        '<(nss_directory)/nss/lib/base/base.h',
+        '<(nss_directory)/nss/lib/base/baset.h',
+        '<(nss_directory)/nss/lib/base/error.c',
+        '<(nss_directory)/nss/lib/base/errorval.c',
+        '<(nss_directory)/nss/lib/base/hash.c',
+        '<(nss_directory)/nss/lib/base/hashops.c',
+        '<(nss_directory)/nss/lib/base/item.c',
+        '<(nss_directory)/nss/lib/base/libc.c',
+        '<(nss_directory)/nss/lib/base/list.c',
+        '<(nss_directory)/nss/lib/base/nssbase.h',
+        '<(nss_directory)/nss/lib/base/nssbaset.h',
+        '<(nss_directory)/nss/lib/base/nssutf8.c',
+        '<(nss_directory)/nss/lib/base/tracker.c',
+        '<(nss_directory)/nss/lib/certdb/alg1485.c',
+        '<(nss_directory)/nss/lib/certdb/cert.h',
+        '<(nss_directory)/nss/lib/certdb/certdb.c',
+        '<(nss_directory)/nss/lib/certdb/certdb.h',
+        '<(nss_directory)/nss/lib/certdb/certi.h',
+        '<(nss_directory)/nss/lib/certdb/certt.h',
+        '<(nss_directory)/nss/lib/certdb/certv3.c',
+        '<(nss_directory)/nss/lib/certdb/certxutl.c',
+        '<(nss_directory)/nss/lib/certdb/certxutl.h',
+        '<(nss_directory)/nss/lib/certdb/crl.c',
+        '<(nss_directory)/nss/lib/certdb/genname.c',
+        '<(nss_directory)/nss/lib/certdb/genname.h',
+        '<(nss_directory)/nss/lib/certdb/polcyxtn.c',
+        '<(nss_directory)/nss/lib/certdb/secname.c',
+        '<(nss_directory)/nss/lib/certdb/stanpcertdb.c',
+        '<(nss_directory)/nss/lib/certdb/xauthkid.c',
+        '<(nss_directory)/nss/lib/certdb/xbsconst.c',
+        '<(nss_directory)/nss/lib/certdb/xconst.c',
+        '<(nss_directory)/nss/lib/certdb/xconst.h',
+        '<(nss_directory)/nss/lib/certhigh/certhigh.c',
+        '<(nss_directory)/nss/lib/certhigh/certhtml.c',
+        '<(nss_directory)/nss/lib/certhigh/certreq.c',
+        '<(nss_directory)/nss/lib/certhigh/certvfy.c',
+        '<(nss_directory)/nss/lib/certhigh/certvfypkix.c',
+        '<(nss_directory)/nss/lib/certhigh/certvfypkixprint.c',
+        '<(nss_directory)/nss/lib/certhigh/crlv2.c',
+        '<(nss_directory)/nss/lib/certhigh/ocsp.c',
+        '<(nss_directory)/nss/lib/certhigh/ocsp.h',
+        '<(nss_directory)/nss/lib/certhigh/ocspi.h',
+        '<(nss_directory)/nss/lib/certhigh/ocspt.h',
+        '<(nss_directory)/nss/lib/certhigh/ocspti.h',
+        '<(nss_directory)/nss/lib/certhigh/xcrldist.c',
+        '<(nss_directory)/nss/lib/cryptohi/cryptohi.h',
+        '<(nss_directory)/nss/lib/cryptohi/cryptoht.h',
+        '<(nss_directory)/nss/lib/cryptohi/dsautil.c',
+        '<(nss_directory)/nss/lib/cryptohi/key.h',
+        '<(nss_directory)/nss/lib/cryptohi/keyhi.h',
+        '<(nss_directory)/nss/lib/cryptohi/keyi.h',
+        '<(nss_directory)/nss/lib/cryptohi/keyt.h',
+        '<(nss_directory)/nss/lib/cryptohi/keythi.h',
+        '<(nss_directory)/nss/lib/cryptohi/sechash.c',
+        '<(nss_directory)/nss/lib/cryptohi/sechash.h',
+        '<(nss_directory)/nss/lib/cryptohi/seckey.c',
+        '<(nss_directory)/nss/lib/cryptohi/secsign.c',
+        '<(nss_directory)/nss/lib/cryptohi/secvfy.c',
+        '<(nss_directory)/nss/lib/dev/ckhelper.c',
+        '<(nss_directory)/nss/lib/dev/ckhelper.h',
+        '<(nss_directory)/nss/lib/dev/dev.h',
+        '<(nss_directory)/nss/lib/dev/devm.h',
+        '<(nss_directory)/nss/lib/dev/devslot.c',
+        '<(nss_directory)/nss/lib/dev/devt.h',
+        '<(nss_directory)/nss/lib/dev/devtm.h',
+        '<(nss_directory)/nss/lib/dev/devtoken.c',
+        '<(nss_directory)/nss/lib/dev/devutil.c',
+        '<(nss_directory)/nss/lib/dev/nssdev.h',
+        '<(nss_directory)/nss/lib/dev/nssdevt.h',
+        '<(nss_directory)/nss/lib/freebl/aeskeywrap.c',
+        '<(nss_directory)/nss/lib/freebl/alg2268.c',
+        '<(nss_directory)/nss/lib/freebl/alghmac.c',
+        '<(nss_directory)/nss/lib/freebl/alghmac.h',
+        '<(nss_directory)/nss/lib/freebl/arcfive.c',
+        '<(nss_directory)/nss/lib/freebl/arcfour.c',
+        '<(nss_directory)/nss/lib/freebl/blapi.h',
+        '<(nss_directory)/nss/lib/freebl/blapii.h',
+        '<(nss_directory)/nss/lib/freebl/blapit.h',
+        '<(nss_directory)/nss/lib/freebl/camellia.c',
+        '<(nss_directory)/nss/lib/freebl/camellia.h',
+        '<(nss_directory)/nss/lib/freebl/ctr.c',
+        '<(nss_directory)/nss/lib/freebl/ctr.h',
+        '<(nss_directory)/nss/lib/freebl/cts.c',
+        '<(nss_directory)/nss/lib/freebl/cts.h',
+        '<(nss_directory)/nss/lib/freebl/des.c',
+        '<(nss_directory)/nss/lib/freebl/des.h',
+        '<(nss_directory)/nss/lib/freebl/desblapi.c',
+        '<(nss_directory)/nss/lib/freebl/dh.c',
+        '<(nss_directory)/nss/lib/freebl/drbg.c',
+        '<(nss_directory)/nss/lib/freebl/dsa.c',
+        '<(nss_directory)/nss/lib/freebl/ec.c',
+        '<(nss_directory)/nss/lib/freebl/ec.h',
+        '<(nss_directory)/nss/lib/freebl/ecl/ec2.h',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecl-curve.h',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecl-exp.h',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecl-priv.h',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecl.c',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecl.h',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecl_curve.c',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecl_gf.c',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecl_mult.c',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecp.h',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecp_256.c',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecp_256_32.c',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecp_384.c',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecp_521.c',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecp_aff.c',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecp_jac.c',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecp_jm.c',
+        '<(nss_directory)/nss/lib/freebl/ecl/ecp_mont.c',
+        '<(nss_directory)/nss/lib/freebl/ecl/ec_naf.c',
+        '<(nss_directory)/nss/lib/freebl/gcm.c',
+        '<(nss_directory)/nss/lib/freebl/gcm.h',
+        '<(nss_directory)/nss/lib/freebl/hmacct.c',
+        '<(nss_directory)/nss/lib/freebl/hmacct.h',
+        '<(nss_directory)/nss/lib/freebl/jpake.c',
+        '<(nss_directory)/nss/lib/freebl/md2.c',
+        '<(nss_directory)/nss/lib/freebl/md5.c',
+        '<(nss_directory)/nss/lib/freebl/mpi/logtab.h',
+        '<(nss_directory)/nss/lib/freebl/mpi/mpcpucache.c',
+        '<(nss_directory)/nss/lib/freebl/mpi/mpi-config.h',
+        '<(nss_directory)/nss/lib/freebl/mpi/mpi-priv.h',
+        '<(nss_directory)/nss/lib/freebl/mpi/mpi.c',
+        '<(nss_directory)/nss/lib/freebl/mpi/mpi.h',
+        '<(nss_directory)/nss/lib/freebl/mpi/mpi_amd64.c',
+        '<(nss_directory)/nss/lib/freebl/mpi/mpi_x86_asm.c',
+        '<(nss_directory)/nss/lib/freebl/mpi/mplogic.c',
+        '<(nss_directory)/nss/lib/freebl/mpi/mplogic.h',
+        '<(nss_directory)/nss/lib/freebl/mpi/mpmontg.c',
+        '<(nss_directory)/nss/lib/freebl/mpi/mpprime.c',
+        '<(nss_directory)/nss/lib/freebl/mpi/mpprime.h',
+        '<(nss_directory)/nss/lib/freebl/mpi/mp_gf2m-priv.h',
+        '<(nss_directory)/nss/lib/freebl/mpi/mp_gf2m.c',
+        '<(nss_directory)/nss/lib/freebl/mpi/mp_gf2m.h',
+        '<(nss_directory)/nss/lib/freebl/mpi/primes.c',
+        '<(nss_directory)/nss/lib/freebl/pqg.c',
+        '<(nss_directory)/nss/lib/freebl/pqg.h',
+        '<(nss_directory)/nss/lib/freebl/rawhash.c',
+        '<(nss_directory)/nss/lib/freebl/rijndael.c',
+        '<(nss_directory)/nss/lib/freebl/rijndael.h',
+        '<(nss_directory)/nss/lib/freebl/rijndael32.tab',
+        '<(nss_directory)/nss/lib/freebl/rsa.c',
+        '<(nss_directory)/nss/lib/freebl/secmpi.h',
+        '<(nss_directory)/nss/lib/freebl/secrng.h',
+        '<(nss_directory)/nss/lib/freebl/seed.c',
+        '<(nss_directory)/nss/lib/freebl/seed.h',
+        '<(nss_directory)/nss/lib/freebl/sha256.h',
+        '<(nss_directory)/nss/lib/freebl/sha512.c',
+        '<(nss_directory)/nss/lib/freebl/sha_fast.c',
+        '<(nss_directory)/nss/lib/freebl/sha_fast.h',
+        '<(nss_directory)/nss/lib/freebl/shsign.h',
+        '<(nss_directory)/nss/lib/freebl/shvfy.c',
+        '<(nss_directory)/nss/lib/freebl/sysrand.c',
+        '<(nss_directory)/nss/lib/freebl/tlsprfalg.c',
+        '<(nss_directory)/nss/lib/freebl/unix_rand.c',
+        '<(nss_directory)/nss/lib/freebl/win_rand.c',
+        '<(nss_directory)/nss/lib/libpkix/include/pkix.h',
+        '<(nss_directory)/nss/lib/libpkix/include/pkix_certsel.h',
+        '<(nss_directory)/nss/lib/libpkix/include/pkix_certstore.h',
+        '<(nss_directory)/nss/lib/libpkix/include/pkix_checker.h',
+        '<(nss_directory)/nss/lib/libpkix/include/pkix_crlsel.h',
+        '<(nss_directory)/nss/lib/libpkix/include/pkix_errorstrings.h',
+        '<(nss_directory)/nss/lib/libpkix/include/pkix_params.h',
+        '<(nss_directory)/nss/lib/libpkix/include/pkix_pl_pki.h',
+        '<(nss_directory)/nss/lib/libpkix/include/pkix_pl_system.h',
+        '<(nss_directory)/nss/lib/libpkix/include/pkix_results.h',
+        '<(nss_directory)/nss/lib/libpkix/include/pkix_revchecker.h',
+        '<(nss_directory)/nss/lib/libpkix/include/pkix_sample_modules.h',
+        '<(nss_directory)/nss/lib/libpkix/include/pkix_util.h',
+        '<(nss_directory)/nss/lib/libpkix/include/pkixt.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/certsel/pkix_certselector.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/certsel/pkix_certselector.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/certsel/pkix_comcertselparams.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/certsel/pkix_comcertselparams.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_basicconstraintschecker.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_basicconstraintschecker.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_certchainchecker.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_certchainchecker.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_crlchecker.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_crlchecker.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_ekuchecker.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_ekuchecker.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_expirationchecker.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_expirationchecker.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_namechainingchecker.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_namechainingchecker.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_nameconstraintschecker.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_nameconstraintschecker.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_ocspchecker.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_ocspchecker.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_policychecker.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_policychecker.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_revocationchecker.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_revocationchecker.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_revocationmethod.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_revocationmethod.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_signaturechecker.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_signaturechecker.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_targetcertchecker.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker/pkix_targetcertchecker.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/crlsel/pkix_comcrlselparams.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/crlsel/pkix_comcrlselparams.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/crlsel/pkix_crlselector.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/crlsel/pkix_crlselector.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/params/pkix_procparams.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/params/pkix_procparams.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/params/pkix_resourcelimits.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/params/pkix_resourcelimits.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/params/pkix_trustanchor.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/params/pkix_trustanchor.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/params/pkix_valparams.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/params/pkix_valparams.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/results/pkix_buildresult.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/results/pkix_buildresult.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/results/pkix_policynode.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/results/pkix_policynode.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/results/pkix_valresult.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/results/pkix_valresult.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/results/pkix_verifynode.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/results/pkix_verifynode.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/store/pkix_store.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/store/pkix_store.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/top/pkix_build.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/top/pkix_build.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/top/pkix_lifecycle.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/top/pkix_lifecycle.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/top/pkix_validate.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/top/pkix_validate.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/util/pkix_error.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/util/pkix_error.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/util/pkix_errpaths.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/util/pkix_list.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/util/pkix_list.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/util/pkix_logger.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/util/pkix_logger.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix/util/pkix_tools.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix/util/pkix_tools.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_aiamgr.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_aiamgr.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_colcertstore.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_colcertstore.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_httpcertstore.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_httpcertstore.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_httpdefaultclient.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_httpdefaultclient.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldapcertstore.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldapcertstore.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldapdefaultclient.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldapdefaultclient.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldaprequest.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldaprequest.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldapresponse.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldapresponse.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldapt.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_ldaptemplates.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_nsscontext.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_nsscontext.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_pk11certstore.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_pk11certstore.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_socket.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_socket.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_basicconstraints.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_basicconstraints.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_cert.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_cert.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicyinfo.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicyinfo.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicymap.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicymap.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicyqualifier.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicyqualifier.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crl.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crl.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crldp.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crldp.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crlentry.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crlentry.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_date.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_date.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_generalname.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_generalname.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_infoaccess.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_infoaccess.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_nameconstraints.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_nameconstraints.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocspcertid.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocspcertid.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocsprequest.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocsprequest.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocspresponse.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocspresponse.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_publickey.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_publickey.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_x500name.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_x500name.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_bigint.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_bigint.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_bytearray.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_bytearray.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_common.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_common.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_error.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_hashtable.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_hashtable.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_lifecycle.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_lifecycle.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_mem.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_mem.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_monitorlock.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_monitorlock.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_mutex.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_mutex.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_object.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_object.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_oid.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_oid.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_primhash.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_primhash.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_rwlock.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_rwlock.h',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_string.c',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_string.h',
+        '<(nss_directory)/nss/lib/nss/nss.h',
+        '<(nss_directory)/nss/lib/nss/nssinit.c',
+        '<(nss_directory)/nss/lib/nss/nssrenam.h',
+        '<(nss_directory)/nss/lib/nss/utilwrap.c',
+        '<(nss_directory)/nss/lib/pk11wrap/debug_module.c',
+        '<(nss_directory)/nss/lib/pk11wrap/dev3hack.c',
+        '<(nss_directory)/nss/lib/pk11wrap/dev3hack.h',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11akey.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11auth.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11cert.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11cxt.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11err.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11func.h',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11kea.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11list.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11load.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11mech.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11merge.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11nobj.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11obj.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11pars.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11pbe.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11pk12.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11pqg.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11pqg.h',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11priv.h',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11pub.h',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11sdr.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11sdr.h',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11skey.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11slot.c',
+        '<(nss_directory)/nss/lib/pk11wrap/pk11util.c',
+        '<(nss_directory)/nss/lib/pk11wrap/secmod.h',
+        '<(nss_directory)/nss/lib/pk11wrap/secmodi.h',
+        '<(nss_directory)/nss/lib/pk11wrap/secmodt.h',
+        '<(nss_directory)/nss/lib/pk11wrap/secmodti.h',
+        '<(nss_directory)/nss/lib/pk11wrap/secpkcs5.h',
+        '<(nss_directory)/nss/lib/pkcs7/certread.c',
+        '<(nss_directory)/nss/lib/pkcs7/p7common.c',
+        '<(nss_directory)/nss/lib/pkcs7/p7create.c',
+        '<(nss_directory)/nss/lib/pkcs7/p7decode.c',
+        '<(nss_directory)/nss/lib/pkcs7/p7encode.c',
+        '<(nss_directory)/nss/lib/pkcs7/p7local.c',
+        '<(nss_directory)/nss/lib/pkcs7/p7local.h',
+        '<(nss_directory)/nss/lib/pkcs7/pkcs7t.h',
+        '<(nss_directory)/nss/lib/pkcs7/secmime.c',
+        '<(nss_directory)/nss/lib/pkcs7/secmime.h',
+        '<(nss_directory)/nss/lib/pkcs7/secpkcs7.h',
+        '<(nss_directory)/nss/lib/pki/asymmkey.c',
+        '<(nss_directory)/nss/lib/pki/certdecode.c',
+        '<(nss_directory)/nss/lib/pki/certificate.c',
+        '<(nss_directory)/nss/lib/pki/cryptocontext.c',
+        '<(nss_directory)/nss/lib/pki/nsspki.h',
+        '<(nss_directory)/nss/lib/pki/nsspkit.h',
+        '<(nss_directory)/nss/lib/pki/pki.h',
+        '<(nss_directory)/nss/lib/pki/pki3hack.c',
+        '<(nss_directory)/nss/lib/pki/pki3hack.h',
+        '<(nss_directory)/nss/lib/pki/pkibase.c',
+        '<(nss_directory)/nss/lib/pki/pkim.h',
+        '<(nss_directory)/nss/lib/pki/pkistore.c',
+        '<(nss_directory)/nss/lib/pki/pkistore.h',
+        '<(nss_directory)/nss/lib/pki/pkit.h',
+        '<(nss_directory)/nss/lib/pki/pkitm.h',
+        '<(nss_directory)/nss/lib/pki/symmkey.c',
+        '<(nss_directory)/nss/lib/pki/tdcache.c',
+        '<(nss_directory)/nss/lib/pki/trustdomain.c',
+        '<(nss_directory)/nss/lib/smime/cms.h',
+        '<(nss_directory)/nss/lib/smime/cmslocal.h',
+        '<(nss_directory)/nss/lib/smime/cmsreclist.h',
+        '<(nss_directory)/nss/lib/smime/cmst.h',
+        '<(nss_directory)/nss/lib/smime/smime.h',
+        '<(nss_directory)/nss/lib/softoken/ecdecode.c',
+        '<(nss_directory)/nss/lib/softoken/fipsaudt.c',
+        '<(nss_directory)/nss/lib/softoken/fipstest.c',
+        '<(nss_directory)/nss/lib/softoken/fipstokn.c',
+        '<(nss_directory)/nss/lib/softoken/jpakesftk.c',
+        '<(nss_directory)/nss/lib/softoken/lgglue.c',
+        '<(nss_directory)/nss/lib/softoken/lgglue.h',
+        '<(nss_directory)/nss/lib/softoken/lowkey.c',
+        '<(nss_directory)/nss/lib/softoken/lowkeyi.h',
+        '<(nss_directory)/nss/lib/softoken/lowkeyti.h',
+        '<(nss_directory)/nss/lib/softoken/lowpbe.c',
+        '<(nss_directory)/nss/lib/softoken/lowpbe.h',
+        '<(nss_directory)/nss/lib/softoken/padbuf.c',
+        '<(nss_directory)/nss/lib/softoken/pkcs11.c',
+        '<(nss_directory)/nss/lib/softoken/pkcs11c.c',
+        '<(nss_directory)/nss/lib/softoken/pkcs11i.h',
+        '<(nss_directory)/nss/lib/softoken/pkcs11ni.h',
+        '<(nss_directory)/nss/lib/softoken/pkcs11u.c',
+        '<(nss_directory)/nss/lib/softoken/rsawrapr.c',
+        '<(nss_directory)/nss/lib/softoken/sdb.c',
+        '<(nss_directory)/nss/lib/softoken/sdb.h',
+        '<(nss_directory)/nss/lib/softoken/sftkdb.c',
+        '<(nss_directory)/nss/lib/softoken/sftkdb.h',
+        '<(nss_directory)/nss/lib/softoken/sftkdbt.h',
+        '<(nss_directory)/nss/lib/softoken/sftkdbti.h',
+        '<(nss_directory)/nss/lib/softoken/sftkhmac.c',
+        '<(nss_directory)/nss/lib/softoken/sftkpars.c',
+        '<(nss_directory)/nss/lib/softoken/sftkpars.h',
+        '<(nss_directory)/nss/lib/softoken/sftkpwd.c',
+        '<(nss_directory)/nss/lib/softoken/softkver.c',
+        '<(nss_directory)/nss/lib/softoken/softkver.h',
+        '<(nss_directory)/nss/lib/softoken/softoken.h',
+        '<(nss_directory)/nss/lib/softoken/softoknt.h',
+        '<(nss_directory)/nss/lib/softoken/tlsprf.c',
+        '<(nss_directory)/nss/lib/ssl/sslerr.h',
+        '<(nss_directory)/nss/lib/util/SECerrs.h',
+        '<(nss_directory)/nss/lib/util/base64.h',
+        '<(nss_directory)/nss/lib/util/ciferfam.h',
+        '<(nss_directory)/nss/lib/util/derdec.c',
+        '<(nss_directory)/nss/lib/util/derenc.c',
+        '<(nss_directory)/nss/lib/util/dersubr.c',
+        '<(nss_directory)/nss/lib/util/dertime.c',
+        '<(nss_directory)/nss/lib/util/errstrs.c',
+        '<(nss_directory)/nss/lib/util/hasht.h',
+        '<(nss_directory)/nss/lib/util/nssb64.h',
+        '<(nss_directory)/nss/lib/util/nssb64d.c',
+        '<(nss_directory)/nss/lib/util/nssb64e.c',
+        '<(nss_directory)/nss/lib/util/nssb64t.h',
+        '<(nss_directory)/nss/lib/util/nssilckt.h',
+        '<(nss_directory)/nss/lib/util/nssilock.c',
+        '<(nss_directory)/nss/lib/util/nssilock.h',
+        '<(nss_directory)/nss/lib/util/nsslocks.h',
+        '<(nss_directory)/nss/lib/util/nssrwlk.c',
+        '<(nss_directory)/nss/lib/util/nssrwlk.h',
+        '<(nss_directory)/nss/lib/util/nssrwlkt.h',
+        '<(nss_directory)/nss/lib/util/nssutil.h',
+        '<(nss_directory)/nss/lib/util/oidstring.c',
+        '<(nss_directory)/nss/lib/util/pkcs11.h',
+        '<(nss_directory)/nss/lib/util/pkcs11f.h',
+        '<(nss_directory)/nss/lib/util/pkcs11n.h',
+        '<(nss_directory)/nss/lib/util/pkcs11p.h',
+        '<(nss_directory)/nss/lib/util/pkcs11t.h',
+        '<(nss_directory)/nss/lib/util/pkcs11u.h',
+        '<(nss_directory)/nss/lib/util/portreg.c',
+        '<(nss_directory)/nss/lib/util/portreg.h',
+        '<(nss_directory)/nss/lib/util/quickder.c',
+        '<(nss_directory)/nss/lib/util/secalgid.c',
+        '<(nss_directory)/nss/lib/util/secasn1.h',
+        '<(nss_directory)/nss/lib/util/secasn1d.c',
+        '<(nss_directory)/nss/lib/util/secasn1e.c',
+        '<(nss_directory)/nss/lib/util/secasn1t.h',
+        '<(nss_directory)/nss/lib/util/secasn1u.c',
+        '<(nss_directory)/nss/lib/util/seccomon.h',
+        '<(nss_directory)/nss/lib/util/secder.h',
+        '<(nss_directory)/nss/lib/util/secdert.h',
+        '<(nss_directory)/nss/lib/util/secdig.c',
+        '<(nss_directory)/nss/lib/util/secdig.h',
+        '<(nss_directory)/nss/lib/util/secdigt.h',
+        '<(nss_directory)/nss/lib/util/secerr.h',
+        '<(nss_directory)/nss/lib/util/secitem.c',
+        '<(nss_directory)/nss/lib/util/secitem.h',
+        '<(nss_directory)/nss/lib/util/secoid.c',
+        '<(nss_directory)/nss/lib/util/secoid.h',
+        '<(nss_directory)/nss/lib/util/secoidt.h',
+        '<(nss_directory)/nss/lib/util/secport.c',
+        '<(nss_directory)/nss/lib/util/secport.h',
+        '<(nss_directory)/nss/lib/util/sectime.c',
+        '<(nss_directory)/nss/lib/util/templates.c',
+        '<(nss_directory)/nss/lib/util/utf8.c',
+        '<(nss_directory)/nss/lib/util/utilmod.c',
+        '<(nss_directory)/nss/lib/util/utilmodt.h',
+        '<(nss_directory)/nss/lib/util/utilpars.c',
+        '<(nss_directory)/nss/lib/util/utilpars.h',
+        '<(nss_directory)/nss/lib/util/utilparst.h',
+        '<(nss_directory)/nss/lib/util/utilrename.h',
       ],
       'sources!': [
+        # mpi_arm.c is included by mpi_arm_mac.c.
+        # NOTE: mpi_arm.c can be used directly on Linux. mpi_arm.c will need
+        # to be excluded conditionally if we start to build NSS on Linux.
+        '<(nss_directory)/nss/lib/freebl/mpi/mpi_arm.c',
         # primes.c is included by mpprime.c.
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/primes.c',
+        '<(nss_directory)/nss/lib/freebl/mpi/primes.c',
         # unix_rand.c and win_rand.c are included by sysrand.c.
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/unix_rand.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/win_rand.c',
+        '<(nss_directory)/nss/lib/freebl/unix_rand.c',
+        '<(nss_directory)/nss/lib/freebl/win_rand.c',
         # debug_module.c is included by pk11load.c.
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/debug_module.c',
+        '<(nss_directory)/nss/lib/pk11wrap/debug_module.c',
       ],
       'dependencies': [
         'nspr_dart',  # Added by Dart (the _dart postfix)
@@ -1084,34 +1101,34 @@
         'NO_NSPR_10_SUPPORT',
       ],
       'include_dirs': [
-        '<(nss_directory)/mozilla/security/nss/lib/base',
-        '<(nss_directory)/mozilla/security/nss/lib/certdb',
-        '<(nss_directory)/mozilla/security/nss/lib/certhigh',
-        '<(nss_directory)/mozilla/security/nss/lib/cryptohi',
-        '<(nss_directory)/mozilla/security/nss/lib/dev',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/include',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/certsel',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/checker',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/crlsel',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/params',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/results',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/store',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/top',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix/util',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/module',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki',
-        '<(nss_directory)/mozilla/security/nss/lib/libpkix/pkix_pl_nss/system',
-        '<(nss_directory)/mozilla/security/nss/lib/nss',
-        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap',
-        '<(nss_directory)/mozilla/security/nss/lib/pkcs7',
-        '<(nss_directory)/mozilla/security/nss/lib/pki',
-        '<(nss_directory)/mozilla/security/nss/lib/smime',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken',
-        '<(nss_directory)/mozilla/security/nss/lib/ssl',
-        '<(nss_directory)/mozilla/security/nss/lib/util',
+        '<(nss_directory)/nss/lib/base',
+        '<(nss_directory)/nss/lib/certdb',
+        '<(nss_directory)/nss/lib/certhigh',
+        '<(nss_directory)/nss/lib/cryptohi',
+        '<(nss_directory)/nss/lib/dev',
+        '<(nss_directory)/nss/lib/freebl',
+        '<(nss_directory)/nss/lib/freebl/ecl',
+        '<(nss_directory)/nss/lib/freebl/mpi',
+        '<(nss_directory)/nss/lib/libpkix/include',
+        '<(nss_directory)/nss/lib/libpkix/pkix/certsel',
+        '<(nss_directory)/nss/lib/libpkix/pkix/checker',
+        '<(nss_directory)/nss/lib/libpkix/pkix/crlsel',
+        '<(nss_directory)/nss/lib/libpkix/pkix/params',
+        '<(nss_directory)/nss/lib/libpkix/pkix/results',
+        '<(nss_directory)/nss/lib/libpkix/pkix/store',
+        '<(nss_directory)/nss/lib/libpkix/pkix/top',
+        '<(nss_directory)/nss/lib/libpkix/pkix/util',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/module',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/pki',
+        '<(nss_directory)/nss/lib/libpkix/pkix_pl_nss/system',
+        '<(nss_directory)/nss/lib/nss',
+        '<(nss_directory)/nss/lib/pk11wrap',
+        '<(nss_directory)/nss/lib/pkcs7',
+        '<(nss_directory)/nss/lib/pki',
+        '<(nss_directory)/nss/lib/smime',
+        '<(nss_directory)/nss/lib/softoken',
+        '<(nss_directory)/nss/lib/ssl',
+        '<(nss_directory)/nss/lib/util',
       ],
       'direct_dependent_settings': {
         'defines': [
@@ -1121,26 +1138,26 @@
           'USE_UTIL_DIRECTLY',
         ],
         'include_dirs': [
-          '<(nss_directory)/mozilla/nsprpub/pr/include',
-          '<(nss_directory)/mozilla/nsprpub/lib/ds',
-          '<(nss_directory)/mozilla/nsprpub/lib/libc/include',
-          '<(nss_directory)/mozilla/security/nss/lib/base',
-          '<(nss_directory)/mozilla/security/nss/lib/certdb',
-          '<(nss_directory)/mozilla/security/nss/lib/certhigh',
-          '<(nss_directory)/mozilla/security/nss/lib/cryptohi',
-          '<(nss_directory)/mozilla/security/nss/lib/dev',
-          '<(nss_directory)/mozilla/security/nss/lib/freebl',
-          '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl',
-          '<(nss_directory)/mozilla/security/nss/lib/nss',
-          '<(nss_directory)/mozilla/security/nss/lib/pk11wrap',
-          '<(nss_directory)/mozilla/security/nss/lib/pkcs7',
-          '<(nss_directory)/mozilla/security/nss/lib/pki',
-          '<(nss_directory)/mozilla/security/nss/lib/smime',
-          '<(nss_directory)/mozilla/security/nss/lib/softoken',
-          '<(nss_directory)/mozilla/security/nss/lib/util',
+          '<(nss_directory)/nspr/pr/include',
+          '<(nss_directory)/nspr/lib/ds',
+          '<(nss_directory)/nspr/lib/libc/include',
+          '<(nss_directory)/nss/lib/base',
+          '<(nss_directory)/nss/lib/certdb',
+          '<(nss_directory)/nss/lib/certhigh',
+          '<(nss_directory)/nss/lib/cryptohi',
+          '<(nss_directory)/nss/lib/dev',
+          '<(nss_directory)/nss/lib/freebl',
+          '<(nss_directory)/nss/lib/freebl/ecl',
+          '<(nss_directory)/nss/lib/nss',
+          '<(nss_directory)/nss/lib/pk11wrap',
+          '<(nss_directory)/nss/lib/pkcs7',
+          '<(nss_directory)/nss/lib/pki',
+          '<(nss_directory)/nss/lib/smime',
+          '<(nss_directory)/nss/lib/softoken',
+          '<(nss_directory)/nss/lib/util',
         ],
       },
-      'msvs_disabled_warnings': [4018, 4101],
+      'msvs_disabled_warnings': [4018, 4101, 4267, ],
       'conditions': [
         ['exclude_nss_root_certs==1', {
           'defines': [
@@ -1153,24 +1170,24 @@
           ],
           # Changed by Dart:
           # nss_directory contains .., which is bad in a regular expression.
-          # So we use the partial match by dropping '^' from '^mozilla/...
+          # So we use the partial match by dropping '^' from '^nss/...
           'sources/': [
-            ['exclude', 'mozilla/security/nss/lib/libpkix/'],
+            ['exclude', 'nss/lib/libpkix/'],
           ],
           'sources!': [
-            '<(nss_directory)/mozilla/security/nss/lib/certhigh/certvfypkix.c',
-            '<(nss_directory)/mozilla/security/nss/lib/certhigh/certvfypkixprint.c',
+            '<(nss_directory)/nss/lib/certhigh/certvfypkix.c',
+            '<(nss_directory)/nss/lib/certhigh/certvfypkixprint.c',
           ],
           # Changed by Dart:
           # nss_directory contains .., which is bad in a regular expression.
-          # So we use the partial match by dropping '^' from '^mozilla/...
+          # So we use the partial match by dropping '^' from '^nss/...
           'include_dirs/': [
-            ['exclude', 'mozilla/security/nss/lib/libpkix/'],
+            ['exclude', 'nss/lib/libpkix/'],
           ],
         }],
         ['target_arch=="ia32"', {
-          'sources/': [
-            ['exclude', 'amd64'],
+          'sources!': [
+            '<(nss_directory)/nss/lib/freebl/mpi/mpi_amd64.c',
           ],
         }],
         ['OS=="linux"', {
@@ -1184,8 +1201,8 @@
             'SOFTOKEN_LIB_NAME=\"libsoftokn3.so\"',
           ],
           'sources!': [
-            '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mpi_amd64.c',
-            '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mpi_x86_asm.c',
+            '<(nss_directory)/nss/lib/freebl/mpi/mpi_amd64.c',
+            '<(nss_directory)/nss/lib/freebl/mpi/mpi_x86_asm.c',
           ],
         }],
         ['OS=="mac" or OS=="ios"', {
@@ -1199,30 +1216,28 @@
             'SOFTOKEN_LIB_NAME=\"libsoftokn3.dylib\"',
           ],
           'sources!': [
-            '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mpi_amd64.c',
-            '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mpi_x86_asm.c',
+            '<(nss_directory)/nss/lib/freebl/mpi/mpi_amd64.c',
+            '<(nss_directory)/nss/lib/freebl/mpi/mpi_x86_asm.c',
           ],
+          'variables': {
+            'forced_include_file': '<(DEPTH)/third_party/nss/nss/lib/freebl/build_config_mac.h',
+          },
           'xcode_settings': {
             'conditions': [
               ['component == "shared_library"', {
                 'GCC_SYMBOLS_PRIVATE_EXTERN': 'NO',  # no -fvisibility=hidden
               }],
             ],
-            # Can't use 'target_arch=="ia32"' conditional because that is
-            # only checked at GYP file generation time.
-            'GCC_PREPROCESSOR_DEFINITIONS[arch=i386]': [
-              '$(inherited)',
-              'NSS_X86_OR_X64',
-              'NSS_X86',
-              'i386',
-            ],
-            'GCC_PREPROCESSOR_DEFINITIONS[arch=x86_64]': [
-              '$(inherited)',
-              'NSS_USE_64',
-              'NSS_X86_OR_X64',
-              'NSS_X64',
+            # Define processor architecture specific macros in
+            # <(forced_include_file).
+            'OTHER_CFLAGS': [
+              '-include', '<(forced_include_file)',
             ],
           },
+        }, { # else: OS!="mac" and OS!="ios"
+          'sources!': [
+            '<(nss_directory)/nss/lib/freebl/mpi/mpi_arm_mac.c',
+          ],
         }],
         ['OS=="win"', {
           'defines': [
@@ -1239,6 +1254,9 @@
               '_WINDOWS',
             ],
           },
+          'sources!': [
+            '<(nss_directory)/nss/lib/freebl/mpi/mpi_amd64.c',
+          ],
           'conditions': [
             ['target_arch=="ia32"', {
               'defines': [
@@ -1252,6 +1270,26 @@
                 'MP_NO_MP_WORD',
               ],
             }],
+            ['target_arch=="x64"', {
+              'defines': [
+                'NSS_USE_64',
+                'NSS_X86_OR_X64',
+                'NSS_X64',
+                '_AMD64_',
+                'MP_CHAR_STORE_SLOW',
+                'MP_IS_LITTLE_ENDIAN',
+                'WIN64',
+              ],
+              'sources!': [
+                '<(nss_directory)/nss/lib/freebl/mpi/mpi_amd64.c',
+                '<(nss_directory)/nss/lib/freebl/mpi/mpi_x86_asm.c',
+              ],
+            }],
+          ],
+        }, { # else: OS!="win"
+          'sources!': [
+            # mpi_x86_asm.c contains MSVC inline assembly code.
+            '<(nss_directory)/nss/lib/freebl/mpi/mpi_x86_asm.c',
           ],
         }],
         ['clang==1', {
diff --git a/runtime/bin/net/os_linux.S b/runtime/bin/net/os_linux.S
index bee9564..a009e83 100644
--- a/runtime/bin/net/os_linux.S
+++ b/runtime/bin/net/os_linux.S
@@ -3,9 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #ifdef __i386__
-#include "../../../third_party/nss/mozilla/nsprpub/pr/src/md/unix/os_Linux_x86.s"
+#include "../../../third_party/nss/nspr/pr/src/md/unix/os_Linux_x86.s"
 #elif defined(__x86_64__)
-#include "../../../third_party/nss/mozilla/nsprpub/pr/src/md/unix/os_Linux_x86_64.s"
+#include "../../../third_party/nss/nspr/pr/src/md/unix/os_Linux_x86_64.s"
 #endif
-
-
diff --git a/runtime/bin/net/sqlite.gyp b/runtime/bin/net/sqlite.gyp
index aa7ec81..14dedb2 100644
--- a/runtime/bin/net/sqlite.gyp
+++ b/runtime/bin/net/sqlite.gyp
@@ -7,7 +7,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # This file is a modified copy of Chromium's src/third_party/sqlite/sqlite.gyp.
-# Revision 169195 (this should agree with "nss_rev" in DEPS).
+# Revision 199075 (this should agree with "nss_rev" in DEPS).
 {
   # Added by Dart. All Dart comments refer to the following block or line.
   'includes': [
@@ -132,7 +132,7 @@
             ],
           },
           'msvs_disabled_warnings': [
-            4018, 4244,
+            4018, 4244, 4267,
           ],
           'conditions': [
             ['OS=="linux"', {
diff --git a/runtime/bin/net/ssl.gyp b/runtime/bin/net/ssl.gyp
index a86594a..b8fbf8f 100644
--- a/runtime/bin/net/ssl.gyp
+++ b/runtime/bin/net/ssl.gyp
@@ -7,7 +7,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # This file is a modified copy of Chromium's src/net/third_party/nss/ssl.gyp.
-# Revision 169195 (this should agree with "nss_rev" in DEPS).
+# Revision 199075 (this should agree with "nss_rev" in DEPS).
 
 # The following modification was made to make sure we have the same
 # xcode_settings on all configurations (otherwise we can't build with ninja):
@@ -96,8 +96,8 @@
         '<(ssl_directory)/ssl/os2_err.h',
       ],
       'defines': [
+        'NO_PKCS11_BYPASS',
         'NSS_ENABLE_ECC',
-        'NSS_ENABLE_ZLIB',
         'USE_UTIL_DIRECTLY',
       ],
       'defines!': [
@@ -124,8 +124,25 @@
         ],
         # Dart: End of copy of code from bodge conditions section.
       },
-      'msvs_disabled_warnings': [4018, 4244],
+      'msvs_disabled_warnings': [4018, 4244, 4267],
       'conditions': [
+        ['component == "shared_library"', {
+          'conditions': [
+            ['OS == "mac" or OS == "ios"', {
+              'xcode_settings': {
+                'GCC_SYMBOLS_PRIVATE_EXTERN': 'NO',
+              },
+            }],
+            ['OS == "win"', {
+              'sources': [
+                'ssl/exports_win.def',
+              ],
+            }],
+            ['os_posix == 1 and OS != "mac" and OS != "ios"', {
+              'cflags!': ['-fvisibility=hidden'],
+            }],
+          ],
+        }],
         [ 'clang == 1', {
           'cflags': [
             # See http://crbug.com/138571#c8. In short, sslsecur.c picks up the
@@ -148,6 +165,13 @@
             'XP_MACOSX',
           ],
         }],
+        [ 'OS == "mac"', {
+          'link_settings': {
+            'libraries': [
+              '$(SDKROOT)/System/Library/Frameworks/Security.framework',
+            ],
+          },
+        }],
         [ 'OS == "win"', {
             'sources!': [
               '<(ssl_directory)/ssl/unix_err.c',
diff --git a/runtime/bin/net/zlib.gyp b/runtime/bin/net/zlib.gyp
index 99bca0f..41c5c62 100644
--- a/runtime/bin/net/zlib.gyp
+++ b/runtime/bin/net/zlib.gyp
@@ -7,7 +7,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # This file is a modified copy of src/third_party/zlib/zlib.gyp from Chromium.
-# Revision 169195 (this should agree with "nss_rev" in DEPS).
+# Revision 199075 (this should agree with "nss_rev" in DEPS).
 {
   # Added by Dart. All Dart comments refer to the following block or line.
   'includes': [
@@ -17,17 +17,6 @@
   'variables': {
     # Added by Dart.
     'zlib_path': '../../../third_party/zlib',
-    'conditions': [
-      [ 'OS=="none"', {
-        # Because we have a patched zlib, we cannot use the system libz.
-        # TODO(pvalchev): OpenBSD is purposefully left out, as the system
-        # zlib brings up an incompatibility that breaks rendering.
-        'use_system_zlib%': 1,
-      }, {
-        'use_system_zlib%': 0,
-      }],
-    ],
-    'use_system_minizip%': 0,
   },
   # Added by Dart.  We do not indent, so diffs with the original are clearer.
   'conditions': [[ 'dart_io_support==1', {
@@ -35,114 +24,85 @@
     {
       'target_name': 'zlib_dart',  # Added by Dart (the _dart postfix)
       'type': 'static_library',
-      'conditions': [
-        ['use_system_zlib==0', {
-          # Changed by Dart: '<(zlib_directory)/' added to all paths.
-          'sources': [
-            '<(zlib_path)/adler32.c',
-            '<(zlib_path)/compress.c',
-            '<(zlib_path)/crc32.c',
-            '<(zlib_path)/crc32.h',
-            '<(zlib_path)/deflate.c',
-            '<(zlib_path)/deflate.h',
-            '<(zlib_path)/gzio.c',
-            '<(zlib_path)/infback.c',
-            '<(zlib_path)/inffast.c',
-            '<(zlib_path)/inffast.h',
-            '<(zlib_path)/inffixed.h',
-            '<(zlib_path)/inflate.c',
-            '<(zlib_path)/inflate.h',
-            '<(zlib_path)/inftrees.c',
-            '<(zlib_path)/inftrees.h',
-            '<(zlib_path)/mozzconf.h',
-            '<(zlib_path)/trees.c',
-            '<(zlib_path)/trees.h',
-            '<(zlib_path)/uncompr.c',
-            '<(zlib_path)/zconf.h',
-            '<(zlib_path)/zlib.h',
-            '<(zlib_path)/zutil.c',
-            '<(zlib_path)/zutil.h',
-          ],
-          'include_dirs': [
+      # Changed by Dart: '<(zlib_directory)/' added to all paths.
+      'sources': [
+        '<(zlib_path)/adler32.c',
+        '<(zlib_path)/compress.c',
+        '<(zlib_path)/crc32.c',
+        '<(zlib_path)/crc32.h',
+        '<(zlib_path)/deflate.c',
+        '<(zlib_path)/deflate.h',
+        '<(zlib_path)/gzclose.c',
+        '<(zlib_path)/gzguts.h',
+        '<(zlib_path)/gzlib.c',
+        '<(zlib_path)/gzread.c',
+        '<(zlib_path)/gzwrite.c',
+        '<(zlib_path)/infback.c',
+        '<(zlib_path)/inffast.c',
+        '<(zlib_path)/inffast.h',
+        '<(zlib_path)/inffixed.h',
+        '<(zlib_path)/inflate.c',
+        '<(zlib_path)/inflate.h',
+        '<(zlib_path)/inftrees.c',
+        '<(zlib_path)/inftrees.h',
+        '<(zlib_path)/mozzconf.h',
+        '<(zlib_path)/trees.c',
+        '<(zlib_path)/trees.h',
+        '<(zlib_path)/uncompr.c',
+        '<(zlib_path)/zconf.h',
+        '<(zlib_path)/zlib.h',
+        '<(zlib_path)/zutil.c',
+        '<(zlib_path)/zutil.h',
+      ],
+      'include_dirs': [
             '<(zlib_path)/.',
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
+      ],
+      'direct_dependent_settings': {
+        'include_dirs': [
               '<(zlib_path)/.',
-            ],
-          },
-          'conditions': [
-            ['OS!="win"', {
-              'product_name': 'chrome_zlib',
-            }], ['OS=="android"', {
-              'toolsets': ['target', 'host'],
-            }],
-          ],
-        }, {
-          'direct_dependent_settings': {
-            'defines': [
-              'USE_SYSTEM_ZLIB',
-            ],
-          },
-          'defines': [
-            'USE_SYSTEM_ZLIB',
-          ],
-          'link_settings': {
-            'libraries': [
-              '-lz',
-            ],
-          },
+        ],
+      },
+      'conditions': [
+        ['OS!="win"', {
+          'product_name': 'chrome_zlib',
+        }], ['OS=="android"', {
+          'toolsets': ['target', 'host'],
         }],
       ],
     },
     {
       'target_name': 'minizip_dart',  # Added by Dart (the _dart postfix)
       'type': 'static_library',
-      'conditions': [
-        ['use_system_minizip==0', {
-          'sources': [
-            '<(zlib_path)/contrib/minizip/ioapi.c',
-            '<(zlib_path)/contrib/minizip/ioapi.h',
-            '<(zlib_path)/contrib/minizip/iowin32.c',
-            '<(zlib_path)/contrib/minizip/iowin32.h',
-            '<(zlib_path)/contrib/minizip/unzip.c',
-            '<(zlib_path)/contrib/minizip/unzip.h',
-            '<(zlib_path)/contrib/minizip/zip.c',
-            '<(zlib_path)/contrib/minizip/zip.h',
-          ],
-          'include_dirs': [
-            '<(zlib_path)/.',
-            '<(zlib_path)/../..',
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
+      'sources': [
+        '<(zlib_path)/contrib/minizip/ioapi.c',
+        '<(zlib_path)/contrib/minizip/ioapi.h',
+        '<(zlib_path)/contrib/minizip/iowin32.c',
+        '<(zlib_path)/contrib/minizip/iowin32.h',
+        '<(zlib_path)/contrib/minizip/unzip.c',
+        '<(zlib_path)/contrib/minizip/unzip.h',
+        '<(zlib_path)/contrib/minizip/zip.c',
+        '<(zlib_path)/contrib/minizip/zip.h',
+      ],
+      'dependencies': [
+        'zlib_dart',
+      ],
+      'include_dirs': [
+        '<(zlib_path)/.',
+        '<(zlib_path)/../..',
+      ],
+      'direct_dependent_settings': {
+        'include_dirs': [
               '<(zlib_path)/.',
-            ],
-          },
-          'conditions': [
-            ['OS!="win"', {
-              'sources!': [
-                '<(zlib_path)/contrib/minizip/iowin32.c'
-              ],
-            }],
-            ['OS=="android"', {
-              'toolsets': ['target', 'host'],
-            }],
+        ],
+      },
+      'conditions': [
+        ['OS!="win"', {
+          'sources!': [
+            '<(zlib_path)/contrib/minizip/iowin32.c'
           ],
-        }, {
-          'direct_dependent_settings': {
-            'defines': [
-              'USE_SYSTEM_MINIZIP',
-            ],
-          },
-          'defines': [
-            'USE_SYSTEM_MINIZIP',
-          ],
-          'link_settings': {
-            'libraries': [
-              '-lminizip',
-            ],
-          },
+        }],
+        ['OS=="android"', {
+          'toolsets': ['target', 'host'],
         }],
         ['OS=="mac" or OS=="ios" or os_bsd==1 or OS=="android"', {
           # Mac, Android and the BSDs don't have fopen64, ftello64, or
@@ -164,7 +124,8 @@
           ],
         }],
       ],
-    }
+    },
+    # Changed by Dart: Omit target 'zip'
   ],
   }]],
 }
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index 775a08e..0acd6c0 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -15,17 +15,35 @@
 
 
 patch class Process {
-  /* patch */ static Future<Process> start(String executable,
-                                           List<String> arguments,
-                                           [ProcessOptions options]) {
-    _ProcessImpl process = new _ProcessImpl(executable, arguments, options);
+  /* patch */ static Future<Process> start(
+      String executable,
+      List<String> arguments,
+      {String workingDirectory,
+       Map<String, String> environment,
+       bool runInShell}) {
+    _ProcessImpl process = new _ProcessImpl(executable,
+                                            arguments,
+                                            workingDirectory,
+                                            environment,
+                                            runInShell);
     return process._start();
   }
 
-  /* patch */ static Future<ProcessResult> run(String executable,
-                                               List<String> arguments,
-                                               [ProcessOptions options]) {
-    return _runNonInteractiveProcess(executable, arguments, options);
+  /* patch */ static Future<ProcessResult> run(
+      String executable,
+      List<String> arguments,
+      {String workingDirectory,
+       Map<String, String> environment,
+       bool runInShell,
+       Encoding stdoutEncoding: Encoding.SYSTEM,
+       Encoding stderrEncoding: Encoding.SYSTEM}) {
+    return _runNonInteractiveProcess(executable,
+                                     arguments,
+                                     workingDirectory,
+                                     environment,
+                                     runInShell,
+                                     stdoutEncoding,
+                                     stderrEncoding);
   }
 }
 
@@ -46,7 +64,17 @@
 
 
 class _ProcessImpl extends NativeFieldWrapperClass1 implements Process {
-  _ProcessImpl(String path, List<String> arguments, ProcessOptions options) {
+  _ProcessImpl(String path,
+               List<String> arguments,
+               String this._workingDirectory,
+               Map<String, String> environment,
+               bool runInShell) {
+    runInShell = identical(runInShell, true);
+    if (runInShell) {
+      arguments = _getShellArguments(path, arguments);
+      path = _getShellCommand();
+    }
+
     if (path is !String) {
       throw new ArgumentError("Path is not a String: $path");
     }
@@ -64,20 +92,18 @@
       }
       _arguments[i] = arguments[i];
       if (Platform.operatingSystem == 'windows') {
-        _arguments[i] = _windowsArgumentEscape(_arguments[i]);
+        _arguments[i] = _windowsArgumentEscape(_arguments[i],
+                                               shellEscape: runInShell);
       }
     }
 
-    if (options != null && options.workingDirectory != null) {
-      _workingDirectory = options.workingDirectory;
-      if (_workingDirectory is !String) {
-        throw new ArgumentError(
-            "WorkingDirectory is not a String: $_workingDirectory");
-      }
+    if (_workingDirectory != null && _workingDirectory is !String) {
+      throw new ArgumentError(
+          "WorkingDirectory is not a String: $_workingDirectory");
     }
 
-    if (options != null && options.environment != null) {
-      var env = options.environment;
+    if (environment != null) {
+      var env = environment;
       if (env is !Map) {
         throw new ArgumentError("Environment is not a map: $env");
       }
@@ -102,9 +128,42 @@
     _started = false;
   }
 
-  String _windowsArgumentEscape(String argument) {
+  static String _getShellCommand() {
+    if (Platform.operatingSystem == 'windows') {
+      return 'cmd.exe';
+    }
+    return '/bin/sh';
+  }
+
+  static List<String> _getShellArguments(String executable,
+                                         List<String> arguments) {
+    List<String> shellArguments = [];
+    if (Platform.operatingSystem == 'windows') {
+      shellArguments.add('/c');
+      shellArguments.add(executable);
+      for (var arg in arguments) {
+        shellArguments.add(arg);
+      }
+    } else {
+      var commandLine = new StringBuffer();
+      executable = executable.replaceAll("'", "'\"'\"'");
+      commandLine.write("'$executable'");
+      shellArguments.add("-c");
+      for (var arg in arguments) {
+        arg = arg.replaceAll("'", "'\"'\"'");
+        commandLine.write(" '$arg'");
+      }
+      shellArguments.add(commandLine.toString());
+    }
+    return shellArguments;
+  }
+
+  String _windowsArgumentEscape(String argument, { bool shellEscape: false }) {
     var result = argument;
-    if (argument.contains('\t') || argument.contains(' ')) {
+    if (argument.contains('\t') ||
+        argument.contains(' ') ||
+        // TODO(ajohnsen): Remove shellEscape.
+        (shellEscape && argument.contains('"'))) {
       // Produce something that the C runtime on Windows will parse
       // back as this string.
 
@@ -272,29 +331,21 @@
 // method.
 Future<ProcessResult> _runNonInteractiveProcess(String path,
                                                 List<String> arguments,
-                                                ProcessOptions options) {
+                                                String workingDirectory,
+                                                Map<String, String> environment,
+                                                bool runInShell,
+                                                Encoding stdoutEncoding,
+                                                Encoding stderrEncoding) {
   // Extract output encoding options and verify arguments.
-  var stdoutEncoding = Encoding.SYSTEM;
-  var stderrEncoding = Encoding.SYSTEM;
-  if (options != null) {
-    if (options.stdoutEncoding != null) {
-      stdoutEncoding = options.stdoutEncoding;
-      if (stdoutEncoding is !Encoding) {
-        throw new ArgumentError(
-            'stdoutEncoding option is not an encoding: $stdoutEncoding');
-      }
-    }
-    if (options.stderrEncoding != null) {
-      stderrEncoding = options.stderrEncoding;
-      if (stderrEncoding is !Encoding) {
-        throw new ArgumentError(
-            'stderrEncoding option is not an encoding: $stderrEncoding');
-      }
-    }
-  }
+  if (stdoutEncoding == null) stdoutEncoding = Encoding.SYSTEM;
+  if (stderrEncoding == null) stderrEncoding = Encoding.SYSTEM;
 
   // Start the underlying process.
-  return Process.start(path, arguments, options).then((Process p) {
+  return Process.start(path,
+                       arguments,
+                       workingDirectory: workingDirectory,
+                       environment: environment,
+                       runInShell: runInShell).then((Process p) {
     int pid = p.pid;
 
     // Make sure the process stdin is closed.
diff --git a/runtime/bin/secure_socket_patch.dart b/runtime/bin/secure_socket_patch.dart
index a52647c..fdff0d5 100644
--- a/runtime/bin/secure_socket_patch.dart
+++ b/runtime/bin/secure_socket_patch.dart
@@ -3,6 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 patch class SecureSocket {
+  /* patch */ factory SecureSocket._(RawSecureSocket rawSocket) =>
+      new _SecureSocket(rawSocket);
+
   /* patch */ static void initialize({String database,
                                       String password,
                                       bool useBuiltinRoots: true})
@@ -15,6 +18,25 @@
 }
 
 
+class _SecureSocket extends _Socket implements SecureSocket {
+  _SecureSocket(RawSecureSocket raw) : super(raw);
+
+  void set onBadCertificate(bool callback(X509Certificate certificate)) {
+    if (_raw == null) {
+      throw new StateError("onBadCertificate called on destroyed SecureSocket");
+    }
+    _raw.onBadCertificate = callback;
+  }
+
+  X509Certificate get peerCertificate {
+    if (_raw == null) {
+     throw new StateError("peerCertificate called on destroyed SecureSocket");
+    }
+    return _raw.peerCertificate;
+  }
+}
+
+
 /**
  * _SecureFilterImpl wraps a filter that encrypts and decrypts data travelling
  * over an encrypted socket.  The filter also handles the handshaking
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 3de4c29..f233a98 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -789,12 +789,6 @@
 }
 
 
-patch class SecureSocket {
-  /* patch */ factory SecureSocket._(RawSecureSocket rawSocket) =>
-      new _SecureSocket(rawSocket);
-}
-
-
 class _SocketStreamConsumer extends StreamConsumer<List<int>> {
   StreamSubscription subscription;
   final _Socket socket;
@@ -1082,22 +1076,3 @@
     }
   }
 }
-
-
-class _SecureSocket extends _Socket implements SecureSocket {
-  _SecureSocket(RawSecureSocket raw) : super(raw);
-
-  void set onBadCertificate(bool callback(X509Certificate certificate)) {
-    if (_raw == null) {
-      throw new StateError("onBadCertificate called on destroyed SecureSocket");
-    }
-    _raw.onBadCertificate = callback;
-  }
-
-  X509Certificate get peerCertificate {
-    if (_raw == null) {
-     throw new StateError("peerCertificate called on destroyed SecureSocket");
-    }
-    return _raw.peerCertificate;
-  }
-}
diff --git a/runtime/lib/double.cc b/runtime/lib/double.cc
index dbc6886..35d52ba 100644
--- a/runtime/lib/double.cc
+++ b/runtime/lib/double.cc
@@ -80,11 +80,7 @@
     Exceptions::ThrowByType(Exceptions::kUnsupported, args);
   }
   const Bigint& big = Bigint::Handle(BigintOperations::NewFromDouble(val));
-  if (BigintOperations::FitsIntoInt64(big)) {
-    return Integer::New(BigintOperations::ToInt64(big));
-  } else {
-    return big.raw();
-  }
+  return big.AsValidInteger();
 }
 
 DEFINE_NATIVE_ENTRY(Double_trunc_div, 2) {
@@ -198,90 +194,24 @@
 
 DEFINE_NATIVE_ENTRY(Double_parse, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(String, value, arguments->NativeArgAt(0));
-  if (value.IsOneByteString()) {
-    // Quick conversion for unpadded doubles in strings.
-    const intptr_t len = value.Length();
-    if (len > 0) {
-      const char* cstr = value.ToCString();
-      ASSERT(cstr != NULL);
-      // Dart differences from strtod:
-      // a) '5.' is not a valid double (no digit after period).
-      // b) '+5.0' is not a valid double (leading plus).
-      if (cstr[0] != '+') {
-        bool dot_ok = true;
-        const char* tmp = cstr;
-        while (*tmp != '\0') {
-          const char ch = *tmp++;
-          if (ch == '.') {
-            const char nextCh = *tmp;
-            dot_ok = ('0' <= nextCh) && (nextCh <= '9');
-            break;
-          }
-        }
-        if (dot_ok) {
-          double double_value;
-          if (CStringToDouble(cstr, len, &double_value)) {
-            return Double::New(double_value);
-          }
-        }
-      }
-    }
+
+  const intptr_t len = value.Length();
+
+  // The native function only accepts one-byte strings. The Dart side converts
+  // other types of strings to one-byte strings, if necessary.
+  if ((!value.IsOneByteString() && !value.IsExternalOneByteString())
+      || (len == 0)) {
+    return Object::null();
   }
-  Scanner scanner(value, Symbols::Empty());
-  const Scanner::GrowableTokenStream& tokens = scanner.GetStream();
-  String* number_string;
-  bool is_positive;
-  if (Scanner::IsValidLiteral(tokens,
-                              Token::kDOUBLE,
-                              &is_positive,
-                              &number_string)) {
-    // Even if original string was two byte string the scanner should produce
-    // literal value that is represented as a one byte string because all
-    // characters in the double literal are Latin-1.
-    ASSERT(number_string->IsOneByteString());
-    const char* cstr = number_string->ToCString();
 
-    double double_value;
-    bool ok = CStringToDouble(cstr, number_string->Length(), &double_value);
-    ASSERT(ok);
-
-    if (!is_positive) {
-      double_value = -double_value;
-    }
+  double double_value;
+  const char* cstr = value.ToCString();
+  ASSERT(cstr != NULL);
+  if (CStringToDouble(cstr, len, &double_value)) {
     return Double::New(double_value);
+  } else {
+    return Object::null();
   }
-
-  if (Scanner::IsValidLiteral(tokens,
-                              Token::kINTEGER,
-                              &is_positive,
-                              &number_string)) {
-    Integer& res = Integer::Handle(Integer::New(*number_string));
-    if (is_positive) {
-      return Double::New(res.AsDoubleValue());
-    }
-    return Double::New(-res.AsDoubleValue());
-  }
-
-  // Infinity and nan.
-  if (Scanner::IsValidLiteral(tokens,
-                              Token::kIDENT,
-                              &is_positive,
-                              &number_string)) {
-    if (number_string->Equals("NaN")) {
-      return Double::New(NAN);
-    }
-    if (number_string->Equals("Infinity")) {
-      if (is_positive) {
-        return Double::New(INFINITY);
-      }
-      return Double::New(-INFINITY);
-    }
-  }
-
-  const Array& args = Array::Handle(Array::New(1));
-  args.SetAt(0, value);
-  Exceptions::ThrowByType(Exceptions::kFormat, args);
-  return Object::null();
 }
 
 
diff --git a/runtime/lib/double_patch.dart b/runtime/lib/double_patch.dart
index e56f45d..8fb5560 100644
--- a/runtime/lib/double_patch.dart
+++ b/runtime/lib/double_patch.dart
@@ -6,15 +6,45 @@
 // VM implementation of double.
 
 patch class double {
-  static double _parse(String string) native "Double_parse";
+
+  static double _native_parse(_OneByteString string) native "Double_parse";
+
+  static double _parse(var str) {
+    str = str.trim();
+
+    if (str.length == 0) return null;
+
+    final ccid = str._cid;
+    _OneByteString oneByteString;
+    // TODO(floitsch): Allow _ExternalOneByteStrings. As of May 2013 they don't
+    // have any _classId.
+    if (ccid != _OneByteString._classId) {
+      int length = str.length;
+      var s = _OneByteString._allocate(length);
+      for (int i = 0; i < length; i++) {
+        int currentUnit = str.codeUnitAt(i);
+        // All valid trimmed double strings must be ASCII.
+        if (currentUnit < 128) {
+          s._setAt(i, currentUnit);
+        } else {
+          return null;
+        }
+      }
+      oneByteString = s;
+    } else {
+      oneByteString = str;
+    }
+
+    return _native_parse(oneByteString);
+  }
 
   /* patch */ static double parse(String str,
                                   [double handleError(String str)]) {
-    if (handleError == null) return _parse(str);
-    try {
-      return _parse(str);
-    } on FormatException {
+    var result = _parse(str);
+    if (result == null) {
+      if (handleError == null) throw new FormatException(str);
       return handleError(str);
     }
+    return result;
   }
 }
diff --git a/runtime/lib/integers.cc b/runtime/lib/integers.cc
index eb8bd93..ff6cd81 100644
--- a/runtime/lib/integers.cc
+++ b/runtime/lib/integers.cc
@@ -304,6 +304,7 @@
   return Smi::New(result);
 }
 
+
 // Mint natives.
 
 DEFINE_NATIVE_ENTRY(Mint_bitNegate, 1) {
@@ -316,6 +317,7 @@
   return Integer::New(result);
 }
 
+
 // Bigint natives.
 
 DEFINE_NATIVE_ENTRY(Bigint_bitNegate, 1) {
diff --git a/runtime/lib/typed_data.cc b/runtime/lib/typed_data.cc
index 05f693c..a4f37b3 100644
--- a/runtime/lib/typed_data.cc
+++ b/runtime/lib/typed_data.cc
@@ -110,6 +110,7 @@
   return Bool::True().raw();
 }
 
+
 DEFINE_NATIVE_ENTRY(TypedData_setRange, 5) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, dst, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, dst_start, arguments->NativeArgAt(1));
@@ -255,13 +256,7 @@
     args.SetAt(0, error);                                                      \
     Exceptions::ThrowByType(Exceptions::kArgument, args);                      \
   }                                                                            \
-  Integer& result = Integer::Handle();                                         \
-  if (value > static_cast<uint64_t>(Mint::kMaxValue)) {                        \
-    result = BigintOperations::NewFromUint64(value);                           \
-  } else {                                                                     \
-    result = Integer::New(value);                                              \
-  }                                                                            \
-  return result.raw();                                                         \
+  return Integer::NewFromUint64(value);                                        \
 }                                                                              \
 
 
@@ -405,10 +400,7 @@
   } else {
     value = Utils::HostToBigEndian64(value);
   }
-  if (value > static_cast<uint64_t>(Mint::kMaxValue)) {
-    return BigintOperations::NewFromUint64(value);
-  }
-  return Integer::New(value);
+  return Integer::NewFromUint64(value);
 }
 
 
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index a79042d..63e214c 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -61,9 +61,14 @@
 # Tests missing code generation support.
 cc/Dart2JSCompileAll: Skip
 cc/CorelibCompileAll: Skip
+cc/ParsePatchLibrary: Skip
 dart/byte_array_test: Skip
 dart/byte_array_optimized_test: Skip
+
+# Bug in optimized code generation.
+cc/ExternalStringDeoptimize: Skip
 dart/inline_stack_frame_test: Skip
+dart/isolate_mirror_local_test: Skip
 
 [ $arch == mips ]
 *: Skip
@@ -72,6 +77,7 @@
 # Tests missing code generation support.
 cc/CorelibCompileAll: Skip
 cc/Dart2JSCompileAll: Skip
+cc/ParsePatchLibrary: Skip
 dart/byte_array_test: Skip
 dart/byte_array_optimized_test: Skip
 dart/inline_stack_frame_test: Skip
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index 837e74b..2b19ef5 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -4,6 +4,7 @@
 
 #include "vm/benchmark_test.h"
 
+#include "bin/builtin.h"
 #include "bin/file.h"
 
 #include "platform/assert.h"
@@ -34,6 +35,8 @@
 // Measure compile of all functions in dart core lib classes.
 //
 BENCHMARK(CorelibCompileAll) {
+  bin::Builtin::SetNativeResolver(bin::Builtin::kBuiltinLibrary);
+  bin::Builtin::SetNativeResolver(bin::Builtin::kIOLibrary);
   Timer timer(true, "Compile all of Core lib benchmark");
   timer.Start();
   const Error& error = Error::Handle(benchmark->isolate(),
@@ -265,6 +268,8 @@
 
 
 BENCHMARK(Dart2JSCompileAll) {
+  bin::Builtin::SetNativeResolver(bin::Builtin::kBuiltinLibrary);
+  bin::Builtin::SetNativeResolver(bin::Builtin::kIOLibrary);
   char* dart_root = ComputeDart2JSPath(Benchmark::Executable());
   char* script = NULL;
   if (dart_root != NULL) {
diff --git a/runtime/vm/benchmark_test.h b/runtime/vm/benchmark_test.h
index 6b3fcf9..0ff69ce 100644
--- a/runtime/vm/benchmark_test.h
+++ b/runtime/vm/benchmark_test.h
@@ -19,6 +19,12 @@
 DECLARE_FLAG(int, code_heap_size);
 DECLARE_FLAG(int, heap_growth_space_ratio);
 
+// snapshot_buffer points to a snapshot if we link in a snapshot otherwise
+// it is initialized to NULL.
+namespace bin {
+extern const uint8_t* snapshot_buffer;
+}
+
 // The BENCHMARK macro is used for benchmarking a specific functionality
 // of the VM
 #define BENCHMARK(name)                                                        \
@@ -64,7 +70,7 @@
   intptr_t score() const { return score_; }
   Isolate* isolate() const { return reinterpret_cast<Isolate*>(isolate_); }
 
-  Dart_Isolate CreateIsolate(uint8_t* buffer) {
+  Dart_Isolate CreateIsolate(const uint8_t* buffer) {
     char* err = NULL;
     isolate_ = Dart_CreateIsolate(NULL, NULL, buffer, NULL, &err);
     EXPECT(isolate_ != NULL);
@@ -97,7 +103,7 @@
 class BenchmarkIsolateScope {
  public:
   explicit BenchmarkIsolateScope(Benchmark* benchmark) : benchmark_(benchmark) {
-    benchmark_->CreateIsolate(NULL);
+    benchmark_->CreateIsolate(bin::snapshot_buffer);
     Dart_EnterScope();  // Create a Dart API scope for unit benchmarks.
   }
   ~BenchmarkIsolateScope() {
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index aa843a5..cc4df17f 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -147,7 +147,7 @@
     // Finalize all classes.
     for (intptr_t i = 0; i < class_array.Length(); i++) {
       cls ^= class_array.At(i);
-      FinalizeClass(cls);
+      FinalizeTypesInClass(cls);
     }
     if (FLAG_print_classes) {
       for (intptr_t i = 0; i < class_array.Length(); i++) {
@@ -504,7 +504,7 @@
     FinalizationKind finalization,
     Error* bound_error) {
   ASSERT(arguments.Length() >= cls.NumTypeArguments());
-  if (!cls.is_finalized()) {
+  if (!cls.is_type_finalized()) {
     FinalizeTypeParameters(cls);
     ResolveUpperBounds(cls);
   }
@@ -573,7 +573,7 @@
     const Class& cls,
     const AbstractTypeArguments& arguments,
     Error* bound_error) {
-  if (!cls.is_finalized()) {
+  if (!cls.is_type_finalized()) {
     FinalizeUpperBounds(cls);
   }
   // Note that when finalizing a type, we need to verify the bounds in both
@@ -683,7 +683,9 @@
   ASSERT(finalization >= kFinalize);
 
   if (FLAG_trace_type_finalization) {
-    OS::Print("Finalize type '%s'\n", String::Handle(type.Name()).ToCString());
+    OS::Print("Finalize type '%s' for class '%s'\n",
+              String::Handle(type.Name()).ToCString(),
+              cls.ToCString());
   }
 
   if (type.IsTypeParameter()) {
@@ -726,7 +728,7 @@
   // Also, the interfaces of the type class must be resolved and the type
   // parameters of the type class must be finalized.
   Class& type_class = Class::Handle(parameterized_type.type_class());
-  if (!type_class.is_finalized()) {
+  if (!type_class.is_type_finalized()) {
     FinalizeTypeParameters(type_class);
     ResolveUpperBounds(type_class);
   }
@@ -859,7 +861,7 @@
   if (type_class.IsSignatureClass()) {
     // The class may be created while parsing a function body, after all
     // pending classes have already been finalized.
-    FinalizeClass(type_class);
+    FinalizeTypesInClass(type_class);
   }
 
   // If a bound error occurred, return a BoundedType with a malformed bound.
@@ -1253,14 +1255,14 @@
 }
 
 
-void ClassFinalizer::ApplyMixin(const Class& cls) {
+void ClassFinalizer::ApplyMixinTypes(const Class& cls) {
   const Type& mixin_type = Type::Handle(cls.mixin());
   ASSERT(!mixin_type.IsNull());
   ASSERT(mixin_type.HasResolvedTypeClass());
   const Class& mixin_cls = Class::Handle(mixin_type.type_class());
 
   if (FLAG_trace_class_finalization) {
-    OS::Print("Applying mixin '%s' to '%s' at pos %"Pd"\n",
+    OS::Print("Applying mixin type '%s' to '%s' at pos %"Pd"\n",
               String::Handle(mixin_cls.Name()).ToCString(),
               cls.ToCString(),
               cls.token_pos());
@@ -1281,10 +1283,34 @@
   // Copy type parameters to mixin application class.
   CloneTypeParameters(cls);
 
+  if (FLAG_trace_class_finalization) {
+    OS::Print("done mixin type appl %s %s extending '%s'\n",
+              String::Handle(cls.Name()).ToCString(),
+              TypeArguments::Handle(cls.type_parameters()).ToCString(),
+              AbstractType::Handle(cls.super_type()).ToCString());
+  }
+}
+
+
+void ClassFinalizer::ApplyMixin(const Class& cls) {
+  Isolate* isolate = Isolate::Current();
+  const Type& mixin_type = Type::Handle(isolate, cls.mixin());
+  ASSERT(!mixin_type.IsNull());
+  ASSERT(mixin_type.HasResolvedTypeClass());
+  const Class& mixin_cls = Class::Handle(isolate, mixin_type.type_class());
+  mixin_cls.EnsureIsFinalized(isolate);
+
+  if (FLAG_trace_class_finalization) {
+    OS::Print("Applying mixin '%s' to '%s' at pos %"Pd"\n",
+              String::Handle(mixin_cls.Name()).ToCString(),
+              cls.ToCString(),
+              cls.token_pos());
+  }
+
   const GrowableObjectArray& cloned_funcs =
-      GrowableObjectArray::Handle(GrowableObjectArray::New());
-  Array& functions = Array::Handle();
-  Function& func = Function::Handle();
+      GrowableObjectArray::Handle(isolate, GrowableObjectArray::New());
+  Array& functions = Array::Handle(isolate);
+  Function& func = Function::Handle(isolate);
   // The parser creates the mixin application class and adds just
   // one function, the implicit constructor.
   functions = cls.functions();
@@ -1300,10 +1326,10 @@
     if (func.IsConstructor()) {
       // A mixin class must not have explicit constructors.
       if (!func.IsImplicitConstructor()) {
-        const Script& script = Script::Handle(cls.script());
+        const Script& script = Script::Handle(isolate, cls.script());
         ReportError(script, cls.token_pos(),
                     "mixin class %s must not have constructors\n",
-                    String::Handle(mixin_cls.Name()).ToCString());
+                    String::Handle(isolate, mixin_cls.Name()).ToCString());
       }
       continue;  // Skip the implicit constructor.
     }
@@ -1318,10 +1344,10 @@
   // Now clone the fields from the mixin class. There should be no
   // existing fields in the mixin application class.
   ASSERT(Array::Handle(cls.fields()).Length() == 0);
-  Array& fields = Array::Handle(mixin_cls.fields());
-  Field& field = Field::Handle();
+  Array& fields = Array::Handle(isolate, mixin_cls.fields());
+  Field& field = Field::Handle(isolate);
   const GrowableObjectArray& cloned_fields =
-      GrowableObjectArray::Handle(GrowableObjectArray::New());
+      GrowableObjectArray::Handle(isolate, GrowableObjectArray::New());
   const intptr_t num_fields = fields.Length();
   for (int i = 0; i < num_fields; i++) {
     field ^= fields.At(i);
@@ -1334,7 +1360,7 @@
   cls.SetFields(fields);
 
   if (FLAG_trace_class_finalization) {
-    OS::Print("done mixin appl %s %s extending %s\n",
+    OS::Print("done mixin appl '%s' '%s' extending '%s'\n",
               String::Handle(cls.Name()).ToCString(),
               TypeArguments::Handle(cls.type_parameters()).ToCString(),
               AbstractType::Handle(cls.super_type()).ToCString());
@@ -1342,9 +1368,9 @@
 }
 
 
-void ClassFinalizer::FinalizeClass(const Class& cls) {
+void ClassFinalizer::FinalizeTypesInClass(const Class& cls) {
   HANDLESCOPE(Isolate::Current());
-  if (cls.is_finalized()) {
+  if (cls.is_type_finalized()) {
     return;
   }
   if (FLAG_trace_class_finalization) {
@@ -1360,13 +1386,11 @@
   // Finalize super class.
   const Class& super_class = Class::Handle(cls.SuperClass());
   if (!super_class.IsNull()) {
-    FinalizeClass(super_class);
+    FinalizeTypesInClass(super_class);
   }
   if (cls.mixin() != Type::null()) {
-    // Copy instance methods and fields from the mixin class.
-    // This has to happen before the check whether the methods of
-    // the class conflict with inherited methods.
-    ApplyMixin(cls);
+    // Copy the type parameters to the mixin application.
+    ApplyMixinTypes(cls);
   }
   // Finalize type parameters before finalizing the super type.
   FinalizeTypeParameters(cls);
@@ -1393,7 +1417,7 @@
                   "typedef '%s' illegally refers to itself",
                   name.ToCString());
     }
-    cls.Finalize();
+    cls.set_is_type_finalized();
     // Signature classes extend Object. No need to add this class to the direct
     // subclasses of Object.
     ASSERT(super_type.IsNull() || super_type.IsObjectType());
@@ -1423,8 +1447,8 @@
     // this check until the super type and interface types are finalized,
     // so that we can use Type::Equals() for the test.
     ASSERT(interface_type.IsFinalized());
-    ASSERT(super_type.IsFinalized());
-    if (interface_type.Equals(super_type)) {
+    ASSERT(super_type.IsNull() || super_type.IsFinalized());
+    if (!super_type.IsNull() && interface_type.Equals(super_type)) {
       const Script& script = Script::Handle(cls.script());
       ReportError(script, cls.token_pos(),
                   "super type '%s' may not be listed in "
@@ -1445,23 +1469,44 @@
       }
     }
   }
-  // Mark as finalized before resolving type parameter upper bounds and member
-  // types in order to break cycles.
-  cls.Finalize();
+  // Mark as type finalized before resolving type parameter upper bounds
+  // in order to break cycles.
+  cls.set_is_type_finalized();
   // Finalize bounds even if running in production mode, so that a snapshot
   // contains them.
   FinalizeUpperBounds(cls);
-  ResolveAndFinalizeMemberTypes(cls);
-  // Run additional checks after all types are finalized.
-  if (cls.is_const()) {
-    CheckForLegalConstClass(cls);
-  }
   // Add this class to the direct subclasses of the superclass, unless the
   // superclass is Object.
   if (!super_type.IsNull() && !super_type.IsObjectType()) {
     ASSERT(!super_class.IsNull());
     super_class.AddDirectSubclass(cls);
   }
+  // Top level classes are parsed eagerly so just finalize it.
+  if (cls.IsTopLevel()) {
+    ClassFinalizer::FinalizeClass(cls);
+  }
+}
+
+
+void ClassFinalizer::FinalizeClass(const Class& cls) {
+  HANDLESCOPE(Isolate::Current());
+  if (cls.is_finalized()) {
+    return;
+  }
+  if (cls.mixin() != Type::null()) {
+    // Copy instance methods and fields from the mixin class.
+    // This has to happen before the check whether the methods of
+    // the class conflict with inherited methods.
+    ApplyMixin(cls);
+  }
+  // Mark as parsed and finalized.
+  cls.Finalize();
+  // Resolve and finalize all member types.
+  ResolveAndFinalizeMemberTypes(cls);
+  // Run additional checks after all types are finalized.
+  if (cls.is_const()) {
+    CheckForLegalConstClass(cls);
+  }
 }
 
 
@@ -1470,8 +1515,8 @@
   Class& test2 = Class::Handle(cls.SuperClass());
   // A finalized class has been checked for cycles.
   // Using the hare and tortoise algorithm for locating cycles.
-  while (!test1.is_finalized() &&
-         !test2.IsNull() && !test2.is_finalized()) {
+  while (!test1.is_type_finalized() &&
+         !test2.IsNull() && !test2.is_type_finalized()) {
     if (test1.raw() == test2.raw()) {
       // Found a cycle.
       return false;
@@ -1491,7 +1536,7 @@
 bool ClassFinalizer::IsAliasCycleFree(const Class& cls,
                                       GrowableArray<intptr_t>* visited) {
   ASSERT(cls.IsSignatureClass());
-  ASSERT(!cls.is_finalized());
+  ASSERT(!cls.is_type_finalized());
   ASSERT(visited != NULL);
   const intptr_t cls_index = cls.id();
   for (int i = 0; i < visited->length(); i++) {
@@ -1509,7 +1554,7 @@
   ResolveType(cls, type, kCanonicalize);
   if (type.IsType() && !type.IsMalformed()) {
     const Class& type_class = Class::Handle(type.type_class());
-    if (!type_class.is_finalized() &&
+    if (!type_class.is_type_finalized() &&
         type_class.IsSignatureClass() &&
         !IsAliasCycleFree(type_class, visited)) {
       return false;
@@ -1522,7 +1567,7 @@
     ResolveType(cls, type, kCanonicalize);
     if (type.IsType() && !type.IsMalformed()) {
       const Class& type_class = Class::Handle(type.type_class());
-      if (!type_class.is_finalized() &&
+      if (!type_class.is_type_finalized() &&
           type_class.IsSignatureClass() &&
           !IsAliasCycleFree(type_class, visited)) {
         return false;
@@ -1946,18 +1991,22 @@
 
 void ClassFinalizer::VerifyImplicitFieldOffsets() {
 #ifdef DEBUG
-  const ClassTable& class_table = *(Isolate::Current()->class_table());
-  Class& cls = Class::Handle();
-  Array& fields_array = Array::Handle();
-  Field& field = Field::Handle();
-  String& name = String::Handle();
-  String& expected_name = String::Handle();
+  Isolate* isolate = Isolate::Current();
+  const ClassTable& class_table = *(isolate->class_table());
+  Class& cls = Class::Handle(isolate);
+  Array& fields_array = Array::Handle(isolate);
+  Field& field = Field::Handle(isolate);
+  String& name = String::Handle(isolate);
+  String& expected_name = String::Handle(isolate);
+  Error& error = Error::Handle(isolate);
 
   // First verify field offsets of all the TypedDataView classes.
   for (intptr_t cid = kTypedDataInt8ArrayViewCid;
        cid <= kTypedDataFloat32x4ArrayViewCid;
        cid++) {
     cls = class_table.At(cid);  // Get the TypedDataView class.
+    error = cls.EnsureIsFinalized(isolate);
+    ASSERT(error.IsNull());
     cls = cls.SuperClass();  // Get it's super class '_TypedListView'.
     fields_array ^= cls.fields();
     ASSERT(fields_array.Length() == TypedDataView::NumberOfFields());
@@ -1978,6 +2027,8 @@
 
   // Now verify field offsets of '_ByteDataView' class.
   cls = class_table.At(kByteDataViewCid);
+  error = cls.EnsureIsFinalized(isolate);
+  ASSERT(error.IsNull());
   fields_array ^= cls.fields();
   ASSERT(fields_array.Length() == TypedDataView::NumberOfFields());
   field ^= fields_array.At(0);
diff --git a/runtime/vm/class_finalizer.h b/runtime/vm/class_finalizer.h
index 513d2f3..c0db01e 100644
--- a/runtime/vm/class_finalizer.h
+++ b/runtime/vm/class_finalizer.h
@@ -83,13 +83,15 @@
   // in the object store.
   static bool FinalizePendingClasses();
 
+  static void FinalizeTypesInClass(const Class& cls);
+
+  static void FinalizeClass(const Class& cls);
 
   // Verify that the classes have been properly prefinalized. This is
   // needed during bootstrapping where the classes have been preloaded.
   static void VerifyBootstrapClasses();
 
  private:
-  static void FinalizeClass(const Class& cls);
   static bool IsSuperCycleFree(const Class& cls);
   static bool IsAliasCycleFree(const Class& cls,
                                GrowableArray<intptr_t>* visited);
@@ -101,6 +103,7 @@
       const Function& factory,
       const GrowableObjectArray& visited_factories);
   static void CloneTypeParameters(const Class& mixapp_class);
+  static void ApplyMixinTypes(const Class& cls);
   static void ApplyMixin(const Class& cls);
   static void CollectTypeArguments(const Class& cls,
                                    const Type& type,
diff --git a/runtime/vm/class_finalizer_test.cc b/runtime/vm/class_finalizer_test.cc
index cba2728..b073dd9 100644
--- a/runtime/vm/class_finalizer_test.cc
+++ b/runtime/vm/class_finalizer_test.cc
@@ -42,10 +42,10 @@
   pending_classes.Add(*classes_2[2]);
   EXPECT(ClassFinalizer::FinalizePendingClasses());
   for (int i = 0; i < classes_1.length(); i++) {
-    EXPECT(classes_1[i]->is_finalized());
+    EXPECT(classes_1[i]->is_type_finalized());
   }
   for (int i = 0; i < classes_2.length(); i++) {
-    EXPECT(classes_2[i]->is_finalized());
+    EXPECT(classes_2[i]->is_type_finalized());
   }
   EXPECT(ClassFinalizer::AllClassesFinalized());
   EXPECT(ClassFinalizer::FinalizePendingClasses());
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index fb7a9e8..ffc41a1 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -38,11 +38,13 @@
     "Trace IC miss in optimized code");
 DEFINE_FLAG(bool, trace_patching, false, "Trace patching of code.");
 DEFINE_FLAG(bool, trace_runtime_calls, false, "Trace runtime calls");
-#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
+#if defined(TARGET_ARCH_IA32) ||                                               \
+    defined(TARGET_ARCH_X64) ||                                                \
+    defined(TARGET_ARCH_ARM)
 DEFINE_FLAG(int, optimization_counter_threshold, 3000,
     "Function's usage-counter value before it is optimized, -1 means never");
 #else
-// TODO(regis): Enable optimization on ARM and MIPS.
+// TODO(regis): Enable optimization on MIPS.
 DEFINE_FLAG(int, optimization_counter_threshold, -1,
     "Function's usage-counter value before it is optimized, -1 means never");
 #endif
@@ -805,24 +807,20 @@
 }
 
 
-// Gets called from debug stub when code reaches a breakpoint before
-// calling a closure.
-DEFINE_RUNTIME_ENTRY(BreakpointClosureHandler, 0) {
-  ASSERT(arguments.ArgCount() ==
-         kBreakpointClosureHandlerRuntimeEntry.argument_count());
-  ASSERT(isolate->debugger() != NULL);
-  isolate->debugger()->SignalBpReached();
-}
-
-
 // Gets called from debug stub when code reaches a breakpoint
-// at the stub call to update the ic cache on equality comparison
-// with null.
-DEFINE_RUNTIME_ENTRY(BreakpointEqualNullHandler, 0) {
+// set on a runtime stub call.
+DEFINE_RUNTIME_ENTRY(BreakpointRuntimeHandler, 0) {
   ASSERT(arguments.ArgCount() ==
-         kBreakpointEqualNullHandlerRuntimeEntry.argument_count());
+         kBreakpointRuntimeHandlerRuntimeEntry.argument_count());
   ASSERT(isolate->debugger() != NULL);
+  DartFrameIterator iterator;
+  StackFrame* caller_frame = iterator.NextFrame();
+  ASSERT(caller_frame != NULL);
+  uword orig_stub =
+      isolate->debugger()->GetPatchedStubAddress(caller_frame->pc());
   isolate->debugger()->SignalBpReached();
+  ASSERT((orig_stub & kSmiTagMask) == kSmiTag);
+  arguments.SetReturn(Smi::Handle(reinterpret_cast<RawSmi*>(orig_stub)));
 }
 
 
@@ -1469,6 +1467,7 @@
 
 // Copy saved registers into the isolate buffer.
 static void CopySavedRegisters(uword saved_registers_address) {
+  ASSERT(sizeof(fpu_register_t) == kFpuRegisterSize);
   fpu_register_t* fpu_registers_copy =
       new fpu_register_t[kNumberOfFpuRegisters];
   ASSERT(fpu_registers_copy != NULL);
@@ -1479,6 +1478,7 @@
   }
   Isolate::Current()->set_deopt_fpu_registers_copy(fpu_registers_copy);
 
+  ASSERT(sizeof(intptr_t) == kWordSize);
   intptr_t* cpu_registers_copy = new intptr_t[kNumberOfCpuRegisters];
   ASSERT(cpu_registers_copy != NULL);
   for (intptr_t i = 0; i < kNumberOfCpuRegisters; i++) {
@@ -1727,6 +1727,7 @@
     String& line_string = String::Handle(script.GetLine(line));
     OS::PrintErr("  Function: %s\n", top_function.ToFullyQualifiedCString());
     OS::PrintErr("  Line %"Pd": '%s'\n", line, line_string.ToCString());
+    OS::PrintErr("  Deopt args: %"Pd"\n", deopt_arguments);
   }
 }
 
diff --git a/runtime/vm/code_generator.h b/runtime/vm/code_generator.h
index 512d6da..9cfbbf7 100644
--- a/runtime/vm/code_generator.h
+++ b/runtime/vm/code_generator.h
@@ -24,11 +24,10 @@
 DECLARE_RUNTIME_ENTRY(AllocateObject);
 DECLARE_RUNTIME_ENTRY(AllocateObjectWithBoundsCheck);
 DECLARE_RUNTIME_ENTRY(ArgumentDefinitionTest);
-DECLARE_RUNTIME_ENTRY(BreakpointClosureHandler);
+DECLARE_RUNTIME_ENTRY(BreakpointRuntimeHandler);
 DECLARE_RUNTIME_ENTRY(BreakpointStaticHandler);
 DECLARE_RUNTIME_ENTRY(BreakpointReturnHandler);
 DECLARE_RUNTIME_ENTRY(BreakpointDynamicHandler);
-DECLARE_RUNTIME_ENTRY(BreakpointEqualNullHandler);
 DECLARE_RUNTIME_ENTRY(CloneContext);
 DECLARE_RUNTIME_ENTRY(Deoptimize);
 DECLARE_RUNTIME_ENTRY(FixCallersTarget);
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 764dfbc..9785e38 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -99,6 +99,131 @@
 }
 
 
+static void AddRelatedClassesToList(const Class& cls,
+                                    const GrowableObjectArray& parse_list,
+                                    const GrowableObjectArray& patch_list) {
+  Isolate* isolate = Isolate::Current();
+  Class& parse_class = Class::Handle(isolate);
+  Type& interface_type = Type::Handle(isolate);
+  Array& interfaces = Array::Handle(isolate);
+
+  // Add all the interfaces implemented by the class that have not been
+  // already parsed to the parse list. Mark the interface as parsed so that
+  // we don't recursively add it back into the list.
+  interfaces ^= cls.interfaces();
+  for (intptr_t i = 0; i < interfaces.Length(); i++) {
+    interface_type ^= interfaces.At(i);
+    parse_class ^= interface_type.type_class();
+    if (!parse_class.is_finalized() && !parse_class.is_marked_for_parsing()) {
+      parse_list.Add(parse_class);
+      parse_class.set_is_marked_for_parsing();
+    }
+  }
+
+  // Walk up the super_class chain and add these classes to the list if they
+  // have not been already parsed to the parse list. Mark the class as parsed
+  // so that we don't recursively add it back into the list.
+  parse_class ^= cls.SuperClass();
+  while (!parse_class.IsNull()) {
+    if (!parse_class.is_finalized() && !parse_class.is_marked_for_parsing()) {
+      parse_list.Add(parse_class);
+      parse_class.set_is_marked_for_parsing();
+    }
+    parse_class ^= parse_class.SuperClass();
+  }
+
+  // Add patch classes if they exist to the parse list if they have not already
+  // been parsed and patched. Mark the class as parsed so that we don't
+  // recursively add it back into the list.
+  parse_class ^= cls.patch_class();
+  if (!parse_class.IsNull()) {
+    if (!parse_class.is_finalized() && !parse_class.is_marked_for_parsing()) {
+      patch_list.Add(parse_class);
+      parse_class.set_is_marked_for_parsing();
+    }
+  }
+}
+
+
+RawError* Compiler::CompileClass(const Class& cls) {
+  // If class is a top level class it is already parsed.
+  if (cls.IsTopLevel()) {
+    return Error::null();
+  }
+  // If the class is already marked for parsing return immediately.
+  if (cls.is_marked_for_parsing()) {
+    return Error::null();
+  }
+  // Parse the class and all the interfaces it implements and super classes.
+  Isolate* isolate = Isolate::Current();
+  StackZone zone(isolate);
+  LongJump* base = isolate->long_jump_base();
+  LongJump jump;
+  isolate->set_long_jump_base(&jump);
+  if (setjmp(*jump.Set()) == 0) {
+    if (FLAG_trace_compiler) {
+      OS::Print("Compiling Class %s '%s'\n", "", cls.ToCString());
+    }
+
+    Class& parse_class = Class::Handle();
+    const GrowableObjectArray& parse_list =
+        GrowableObjectArray::Handle(GrowableObjectArray::New(4));
+    const GrowableObjectArray& patch_list =
+        GrowableObjectArray::Handle(GrowableObjectArray::New(4));
+
+    // Add the primary class which needs to be parsed to the parse list.
+    // Mark the class as parsed so that we don't recursively add the same
+    // class back into the list.
+    parse_list.Add(cls);
+    cls.set_is_marked_for_parsing();
+
+    // Add all super classes, interface classes and patch class if one
+    // exists to the corresponding lists.
+    // NOTE: The parse_list array keeps growing as more classes are added
+    // to it by AddRelatedClassesToList. It is not OK to hoist
+    // parse_list.Length() into a local variable and iterate using the local
+    // variable.
+    for (intptr_t i = 0; i < parse_list.Length(); i++) {
+      parse_class ^= parse_list.At(i);
+      AddRelatedClassesToList(parse_class, parse_list, patch_list);
+    }
+
+    // Parse all the classes that have been added above.
+    for (intptr_t i = (parse_list.Length() - 1); i >=0 ; i--) {
+      parse_class ^= parse_list.At(i);
+      ASSERT(!parse_class.IsNull());
+      Parser::ParseClass(parse_class);
+    }
+
+    // Parse all the patch classes that have been added above.
+    for (intptr_t i = 0; i < patch_list.Length(); i++) {
+      parse_class ^= patch_list.At(i);
+      ASSERT(!parse_class.IsNull());
+      Parser::ParseClass(parse_class);
+    }
+
+    // Finalize these classes.
+    for (intptr_t i = (parse_list.Length() - 1); i >=0 ; i--) {
+      parse_class ^= parse_list.At(i);
+      ASSERT(!parse_class.IsNull());
+      ClassFinalizer::FinalizeClass(parse_class);
+      parse_class.reset_is_marked_for_parsing();
+    }
+
+    isolate->set_long_jump_base(base);
+    return Error::null();
+  } else {
+    Error& error = Error::Handle();
+    error = isolate->object_store()->sticky_error();
+    isolate->object_store()->clear_sticky_error();
+    isolate->set_long_jump_base(base);
+    return error.raw();
+  }
+  UNREACHABLE();
+  return Error::null();
+}
+
+
 static void InstallUnoptimizedCode(const Function& function) {
   // Disable optimized code.
   ASSERT(function.HasOptimizedCode());
@@ -373,6 +498,13 @@
                     Code::Handle(function.unoptimized_code()).EntryPoint());
         }
 
+        // If not yet present, allocate deoptimization history array.
+        Array& deopt_history = Array::Handle(function.deopt_history());
+        if (deopt_history.IsNull()) {
+          deopt_history = Array::New(FLAG_deoptimization_counter_threshold);
+          function.set_deopt_history(deopt_history);
+        }
+
         for (intptr_t i = 0; i < guarded_fields.length(); i++) {
           const Field& field = *guarded_fields[i];
           field.RegisterDependentCode(code);
diff --git a/runtime/vm/compiler.h b/runtime/vm/compiler.h
index 7595be8..6ac55c7 100644
--- a/runtime/vm/compiler.h
+++ b/runtime/vm/compiler.h
@@ -24,12 +24,18 @@
 
 class Compiler : public AllStatic {
  public:
-  // Extracts class, interface, function symbols from the script and populates
-  // the symbol tables and the class dictionary of the library.
+  // Extracts top level entities from the script and populates
+  // the class dictionary of the library.
   //
   // Returns Error::null() if there is no compilation error.
   static RawError* Compile(const Library& library, const Script& script);
 
+  // Extracts function and field symbols from the class and populates
+  // the class.
+  //
+  // Returns Error::null() if there is no compilation error.
+  static RawError* CompileClass(const Class& cls);
+
   // Generates code for given function and sets its code field.
   //
   // Returns Error::null() if there is no compilation error.
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 0707a20..d493d4e 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -3051,6 +3051,10 @@
 
   if (obj.IsClass()) {
     const Class& cls = Class::Cast(obj);
+    const Error& error = Error::Handle(isolate, cls.EnsureIsFinalized(isolate));
+    if (!error.IsNull()) {
+      return Api::NewHandle(isolate, error.raw());
+    }
     const Array& func_array = Array::Handle(cls.functions());
 
     // Some special types like 'dynamic' have a null functions list.
@@ -3391,6 +3395,10 @@
 
   if (obj.IsClass()) {
     const Class& cls = Class::Cast(obj);
+    const Error& error = Error::Handle(isolate, cls.EnsureIsFinalized(isolate));
+    if (!error.IsNull()) {
+      return Api::NewHandle(isolate, error.raw());
+    }
     const Array& field_array = Array::Handle(cls.fields());
 
     // Some special types like 'dynamic' have a null fields list.
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 6d8626a..76bdc4c 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "include/dart_api.h"
+#include "bin/builtin.h"
 #include "platform/assert.h"
 #include "platform/json.h"
 #include "platform/utils.h"
@@ -6005,6 +6006,9 @@
   "}\n"
   ;  // NOLINT
 
+  bin::Builtin::SetNativeResolver(bin::Builtin::kBuiltinLibrary);
+  bin::Builtin::SetNativeResolver(bin::Builtin::kIOLibrary);
+
   Dart_Handle result = Dart_SetLibraryTagHandler(library_handler);
   EXPECT_VALID(result);
 
@@ -7733,4 +7737,62 @@
   EXPECT_EQ(260, value);
 }
 
+
+TEST_CASE(ExternalStringTrimDoubleParse) {
+  const char* kScriptChars =
+      "String str = 'A';\n"
+      "class A {\n"
+      "  static change_str(String s) native 'A_change_str';\n"
+      "}\n"
+      "main() {\n"
+      "  var externalOneByteString = ' 0.2\\xA0 ';\n;"
+      "  A.change_str(externalOneByteString);\n"
+      "  var externalTwoByteString = ' \\u{2029}0.6\\u{2029} ';\n"
+      "  A.change_str(externalTwoByteString);\n"
+      "  var x = double.parse(externalOneByteString);\n"
+      "  var y = double.parse(externalTwoByteString);\n"
+      "  return ((x + y) * 10).toInt();\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(8, value);
+}
+
+
+TEST_CASE(ExternalStringDoubleParse) {
+  const char* kScriptChars =
+      "String str = 'A';\n"
+      "class A {\n"
+      "  static change_str(String s) native 'A_change_str';\n"
+      "}\n"
+      "main() {\n"
+      "  var externalOneByteString = '0.2';\n;"
+      "  A.change_str(externalOneByteString);\n"
+      "  var externalTwoByteString = '0.6';\n"
+      "  A.change_str(externalTwoByteString);\n"
+      "  var x = double.parse(externalOneByteString);\n"
+      "  var y = double.parse(externalTwoByteString);\n"
+      "  return ((x + y) * 10).toInt();\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(8, value);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 0d80af0..e583545 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -588,7 +588,7 @@
           (kind == PcDescriptors::kFuncCall) ||
           (kind == PcDescriptors::kClosureCall) ||
           (kind == PcDescriptors::kReturn) ||
-          (kind == PcDescriptors::kEqualNull));
+          (kind == PcDescriptors::kRuntimeCall));
 }
 
 
@@ -672,22 +672,14 @@
                                      StubCode::BreakpointStaticEntryPoint());
       break;
     }
+    case PcDescriptors::kRuntimeCall:
     case PcDescriptors::kClosureCall: {
       const Code& code =
           Code::Handle(Function::Handle(function_).unoptimized_code());
       saved_bytes_.target_address_ =
           CodePatcher::GetStaticCallTargetAt(pc_, code);
       CodePatcher::PatchStaticCallAt(pc_, code,
-                                     StubCode::BreakpointClosureEntryPoint());
-      break;
-    }
-    case PcDescriptors::kEqualNull: {
-      const Code& code =
-          Code::Handle(Function::Handle(function_).unoptimized_code());
-      saved_bytes_.target_address_ =
-          CodePatcher::GetStaticCallTargetAt(pc_, code);
-      CodePatcher::PatchStaticCallAt(pc_, code,
-                                     StubCode::BreakpointEqNullEntryPoint());
+                                     StubCode::BreakpointRuntimeEntryPoint());
       break;
     }
     case PcDescriptors::kReturn:
@@ -712,7 +704,7 @@
     }
     case PcDescriptors::kFuncCall:
     case PcDescriptors::kClosureCall:
-    case PcDescriptors::kEqualNull: {
+    case PcDescriptors::kRuntimeCall: {
       const Code& code =
           Code::Handle(Function::Handle(function_).unoptimized_code());
       CodePatcher::PatchStaticCallAt(pc_, code,
@@ -1250,6 +1242,11 @@
                 script_url.ToCString(), line_number);
     }
     return NULL;
+  } else if (last_token_idx < 0) {
+    // Line does not contain any tokens. first_token_index is the first
+    // token after the given line. We check whether that token is
+    // part of a function.
+    last_token_idx = first_token_idx;
   }
 
   Function& func = Function::Handle(isolate_);
@@ -1618,7 +1615,7 @@
         // to invoke the "call" method on the object if one exists.
         // TODO(hausner): find call method and intrument it for stepping.
       }
-    } else if (bpt->breakpoint_kind_ == PcDescriptors::kEqualNull) {
+    } else if (bpt->breakpoint_kind_ == PcDescriptors::kRuntimeCall) {
       // This is just a call to the runtime, not Dart code. Stepping
       // into not possible, just treat like StepOver.
       func_to_instrument = bpt->function();
@@ -1700,8 +1697,11 @@
           OS::Print("Enable pending breakpoint for function '%s'\n",
                     String::Handle(lookup_function.name()).ToCString());
         }
+        const Script& script= Script::Handle(func.script());
+        intptr_t first_pos, last_pos;
+        script.TokenRangeAtLine(bpt->LineNumber(), &first_pos, &last_pos);
         intptr_t bp_pos =
-            ResolveBreakpointPos(func, bpt->token_pos(), func.end_token_pos());
+            ResolveBreakpointPos(func, bpt->token_pos(), last_pos);
         bpt->set_token_pos(bp_pos);
         MakeCodeBreakpointsAt(func, bp_pos, bpt);
         SignalBpResolved(bpt);
@@ -1725,6 +1725,16 @@
 }
 
 
+uword Debugger::GetPatchedStubAddress(uword breakpoint_address) {
+  CodeBreakpoint* bpt = GetCodeBreakpoint(breakpoint_address);
+  if (bpt != NULL) {
+    return bpt->saved_bytes_.target_address_;
+  }
+  UNREACHABLE();
+  return NULL;
+}
+
+
 // Remove and delete the source breakpoint bpt and its associated
 // code breakpoints.
 void Debugger::RemoveBreakpoint(intptr_t bp_id) {
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index 9df08bd..8e45fa4 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -310,6 +310,8 @@
   void SignalExceptionThrown(const Instance& exc);
   static void SignalIsolateEvent(EventType type);
 
+  uword GetPatchedStubAddress(uword breakpoint_address);
+
  private:
   enum ResumeAction {
     kContinue,
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index 6810a61b..0881e0f 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -958,87 +958,6 @@
 }
 
 
-TEST_CASE(Debug_LookupSourceLine) {
-  const char* kScriptChars =
-  /*1*/  "class A {                 \n"
-  /*2*/  "  static void foo() {     \n"
-  /*3*/  "    moo('good news');     \n"
-  /*4*/  "  }                       \n"
-  /*5*/  "}                         \n"
-  /*6*/  "                          \n"
-  /*7*/  "void main() {             \n"
-  /*8*/  "  A.foo();                \n"
-  /*9*/  "}                         \n"
-  /*10*/ "                          \n";
-
-  LoadScript(kScriptChars);
-
-  const Library& test_lib =
-      Library::CheckedHandle(Api::UnwrapHandle(script_lib));
-  const String& script_url = String::Handle(String::New(TestCase::url()));
-  Function& func = Function::Handle();
-
-  for (int line = 7; line <= 9; line++) {
-    func = test_lib.LookupFunctionInSource(script_url, line);
-    EXPECT(!func.IsNull());
-    EXPECT_STREQ("main", String::Handle(func.name()).ToCString());
-  }
-
-  for (int line = 2; line <= 4; line++) {
-    func = test_lib.LookupFunctionInSource(script_url, 3);
-    EXPECT(!func.IsNull());
-    EXPECT_STREQ("foo", String::Handle(func.name()).ToCString());
-  }
-
-  // The VM generates an implicit constructor for class A and
-  // locates it at the token position of the keyword 'class'.
-  func = test_lib.LookupFunctionInSource(script_url, 1);
-  EXPECT(!func.IsNull());
-  EXPECT_STREQ("A.", String::Handle(func.name()).ToCString());
-
-  func = test_lib.LookupFunctionInSource(script_url, 6);
-  EXPECT(func.IsNull());
-  func = test_lib.LookupFunctionInSource(script_url, 10);
-  EXPECT(func.IsNull());
-
-  Dart_Handle libs = Dart_GetLibraryIds();
-  EXPECT(Dart_IsList(libs));
-  intptr_t num_libs;
-  Dart_ListLength(libs, &num_libs);
-  EXPECT(num_libs > 0);
-  for (int i = 0; i < num_libs; i++) {
-    Dart_Handle lib_id = Dart_ListGetAt(libs, i);
-    EXPECT(Dart_IsInteger(lib_id));
-    int64_t id = 0;
-    Dart_IntegerToInt64(lib_id, &id);
-    Dart_Handle lib_url = Dart_GetLibraryURL(id);
-    char const* chars;
-    Dart_StringToCString(lib_url, &chars);
-    OS::Print("Lib %d: %s\n", i, chars);
-
-    Dart_Handle scripts = Dart_GetScriptURLs(lib_url);
-    EXPECT(Dart_IsList(scripts));
-    intptr_t num_scripts;
-    Dart_ListLength(scripts, &num_scripts);
-    EXPECT(num_scripts >= 0);
-    for (int i = 0; i < num_scripts; i++) {
-      Dart_Handle script_url = Dart_ListGetAt(scripts, i);
-      char const* chars;
-      Dart_StringToCString(script_url, &chars);
-      OS::Print("  script %d: '%s'\n", i + 1, chars);
-    }
-  }
-
-  Dart_Handle lib_url = NewString(TestCase::url());
-  Dart_Handle source = Dart_ScriptGetSource((num_libs - 1), lib_url);
-  EXPECT(Dart_IsString(source));
-  char const* source_chars;
-  Dart_StringToCString(source, &source_chars);
-  OS::Print("\n=== source: ===\n%s", source_chars);
-  EXPECT_STREQ(kScriptChars, source_chars);
-}
-
-
 static Dart_IsolateId test_isolate_id = ILLEGAL_ISOLATE_ID;
 static int verify_callback = 0;
 static void TestIsolateID(Dart_IsolateId isolate_id, Dart_IsolateEvent kind) {
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index 717d867..9c9dd24 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -16,6 +16,7 @@
 DEFINE_FLAG(bool, compress_deopt_info, true,
             "Compress the size of the deoptimization info for optimized code.");
 DECLARE_FLAG(bool, trace_deoptimization);
+DECLARE_FLAG(bool, trace_deoptimization_verbose);
 
 DeoptimizationContext::DeoptimizationContext(intptr_t* to_frame_start,
                                              intptr_t to_frame_size,
@@ -283,6 +284,18 @@
         ic_data.set_deopt_reason(deopt_context->deopt_reason());
       }
     }
+
+    const Array& deopt_history = Array::Handle(function.deopt_history());
+    ASSERT(!deopt_history.IsNull());
+    intptr_t count = function.deoptimization_counter();
+    ASSERT(count > 0);
+    if (count <= deopt_history.Length()) {
+      deopt_history.SetAt(count - 1, Smi::Handle(Smi::New(deopt_id_)));
+      if (FLAG_trace_deoptimization_verbose) {
+        OS::Print("  adding id %"Pd" to history at %"Pd"\n",
+                  deopt_id_, count - 1);
+      }
+    }
   }
 
   intptr_t object_table_index() const { return object_table_index_; }
@@ -742,6 +755,8 @@
   ASSERT(instr->kind() == kRetAddress);
   DeoptRetAddressInstr* ret_address_instr =
       static_cast<DeoptRetAddressInstr*>(instr);
+  // TODO(regis): The following assert may trigger when displaying a backtrace
+  // from the simulator.
   ASSERT(Isolate::IsDeoptAfter(ret_address_instr->deopt_id()));
   ASSERT(!object_table.IsNull());
   ASSERT(func != NULL);
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index d27f76c..f0343db 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -129,16 +129,13 @@
   // block entries as a side effect).
   SortExits();
   intptr_t num_exits = exits_.length();
-  if (num_exits == 0) {
-    // TODO(zerny): Add support for non-local exits, such as throw.
-    UNREACHABLE();
-    return NULL;
-  } else if (num_exits == 1) {
+  if (num_exits == 1) {
     ReturnAt(0)->UnuseAllInputs();
     *exit_block = ExitBlockAt(0);
     *last_instruction = LastInstructionAt(0);
     return call_->HasUses() ? ValueAt(0)->definition() : NULL;
   } else {
+    ASSERT(num_exits > 1);
     // Create a join of the returns.
     intptr_t join_id = caller_graph_->max_block_id() + 1;
     caller_graph_->set_max_block_id(join_id);
@@ -237,67 +234,102 @@
   // Insert the callee graph into the caller graph.
   BlockEntryInstr* callee_exit = NULL;
   Instruction* callee_last_instruction = NULL;
-  Definition* callee_result = JoinReturns(&callee_exit,
-                                          &callee_last_instruction);
-  if (callee_result != NULL) {
-    call_->ReplaceUsesWith(callee_result);
-  }
-  if (callee_last_instruction == callee_entry) {
-    // There are no instructions in the inlined function (e.g., it might be
-    // a return of a parameter or a return of a constant defined in the
-    // initial definitions).
-    call_->previous()->LinkTo(call_->next());
+
+  if (exits_.length() == 0) {
+    // Handle the case when there are no normal return exits from the callee
+    // (i.e. the callee unconditionally throws) by inserting an artificial
+    // branch (true === true).
+    // The true successor is the inlined body, the false successor
+    // goes to the rest of the caller graph. It is removed as unreachable code
+    // by the constant propagation.
+    TargetEntryInstr* false_block =
+        new TargetEntryInstr(caller_graph_->allocate_block_id(),
+                             call_block->try_index());
+    false_block->InheritDeoptTargetAfter(call_);
+    false_block->LinkTo(call_->next());
+    call_block->ReplaceAsPredecessorWith(false_block);
+
+    ConstantInstr* true_const = caller_graph_->GetConstant(Bool::True());
+    BranchInstr* branch =
+        new BranchInstr(new StrictCompareInstr(call_block->start_pos(),
+                                               Token::kEQ_STRICT,
+                                               new Value(true_const),
+                                               new Value(true_const)));
+    branch->InheritDeoptTarget(call_);
+    *branch->true_successor_address() = callee_entry;
+    *branch->false_successor_address() = false_block;
+
+    call_->previous()->AppendInstruction(branch);
+    call_block->set_last_instruction(branch);
+
+    // Update dominator tree.
+    call_block->AddDominatedBlock(callee_entry);
+    call_block->AddDominatedBlock(false_block);
+
   } else {
-    call_->previous()->LinkTo(callee_entry->next());
-    callee_last_instruction->LinkTo(call_->next());
-  }
-  if (callee_exit != callee_entry) {
-    // In case of control flow, locally update the predecessors, phis and
-    // dominator tree.
-    //
-    // Pictorially, the graph structure is:
-    //
-    //   Bc : call_block      Bi : callee_entry
-    //     before_call          inlined_head
-    //     call               ... other blocks ...
-    //     after_call         Be : callee_exit
-    //                          inlined_foot
-    // And becomes:
-    //
-    //   Bc : call_block
-    //     before_call
-    //     inlined_head
-    //   ... other blocks ...
-    //   Be : callee_exit
-    //    inlined_foot
-    //    after_call
-    //
-    // For successors of 'after_call', the call block (Bc) is replaced as a
-    // predecessor by the callee exit (Be).
-    call_block->ReplaceAsPredecessorWith(callee_exit);
-    // For successors of 'inlined_head', the callee entry (Bi) is replaced
-    // as a predecessor by the call block (Bc).
-    callee_entry->ReplaceAsPredecessorWith(call_block);
-
-    // The callee exit is now the immediate dominator of blocks whose
-    // immediate dominator was the call block.
-    ASSERT(callee_exit->dominated_blocks().is_empty());
-    for (intptr_t i = 0; i < call_block->dominated_blocks().length(); ++i) {
-      BlockEntryInstr* block = call_block->dominated_blocks()[i];
-      callee_exit->AddDominatedBlock(block);
+    Definition* callee_result = JoinReturns(&callee_exit,
+                                            &callee_last_instruction);
+    if (callee_result != NULL) {
+      call_->ReplaceUsesWith(callee_result);
     }
-    // The call block is now the immediate dominator of blocks whose
-    // immediate dominator was the callee entry.
-    call_block->ClearDominatedBlocks();
-    for (intptr_t i = 0; i < callee_entry->dominated_blocks().length(); ++i) {
-      BlockEntryInstr* block = callee_entry->dominated_blocks()[i];
-      call_block->AddDominatedBlock(block);
+    if (callee_last_instruction == callee_entry) {
+      // There are no instructions in the inlined function (e.g., it might be
+      // a return of a parameter or a return of a constant defined in the
+      // initial definitions).
+      call_->previous()->LinkTo(call_->next());
+    } else {
+      call_->previous()->LinkTo(callee_entry->next());
+      callee_last_instruction->LinkTo(call_->next());
     }
-  }
+    if (callee_exit != callee_entry) {
+      // In case of control flow, locally update the predecessors, phis and
+      // dominator tree.
+      //
+      // Pictorially, the graph structure is:
+      //
+      //   Bc : call_block      Bi : callee_entry
+      //     before_call          inlined_head
+      //     call               ... other blocks ...
+      //     after_call         Be : callee_exit
+      //                          inlined_foot
+      // And becomes:
+      //
+      //   Bc : call_block
+      //     before_call
+      //     inlined_head
+      //   ... other blocks ...
+      //   Be : callee_exit
+      //    inlined_foot
+      //    after_call
+      //
+      // For successors of 'after_call', the call block (Bc) is replaced as a
+      // predecessor by the callee exit (Be).
+      call_block->ReplaceAsPredecessorWith(callee_exit);
+      // For successors of 'inlined_head', the callee entry (Bi) is replaced
+      // as a predecessor by the call block (Bc).
+      callee_entry->ReplaceAsPredecessorWith(call_block);
 
-  // Neither call nor callee entry nor the graph entry (if present) are in the
+      // The callee exit is now the immediate dominator of blocks whose
+      // immediate dominator was the call block.
+      ASSERT(callee_exit->dominated_blocks().is_empty());
+      for (intptr_t i = 0; i < call_block->dominated_blocks().length(); ++i) {
+        BlockEntryInstr* block = call_block->dominated_blocks()[i];
+        callee_exit->AddDominatedBlock(block);
+      }
+      // The call block is now the immediate dominator of blocks whose
+      // immediate dominator was the callee entry.
+      call_block->ClearDominatedBlocks();
+      for (intptr_t i = 0; i < callee_entry->dominated_blocks().length(); ++i) {
+        BlockEntryInstr* block = callee_entry->dominated_blocks()[i];
+        call_block->AddDominatedBlock(block);
+      }
+    }
+
+    // Callee entry in not in the graph anymore. Remove it from use lists.
+    callee_entry->UnuseAllInputs();
+  }
+  // Neither call nor the graph entry (if present) are in the
   // graph at this point. Remove them from use lists.
-  callee_entry->UnuseAllInputs();
   if (callee_entry->PredecessorCount() > 0) {
     callee_entry->PredecessorAt(0)->AsGraphEntry()->UnuseAllInputs();
   }
@@ -620,7 +652,10 @@
   }
   Value* constant_true = Bind(new ConstantInstr(Bool::True()));
   StrictCompareInstr* comp =
-      new StrictCompareInstr(Token::kEQ_STRICT, value, constant_true);
+      new StrictCompareInstr(condition_token_pos(),
+                             Token::kEQ_STRICT,
+                             value,
+                             constant_true);
   BranchInstr* branch = new BranchInstr(comp);
   AddInstruction(branch);
   CloseFragment();
@@ -633,13 +668,15 @@
 void TestGraphVisitor::MergeBranchWithComparison(ComparisonInstr* comp) {
   ControlInstruction* branch;
   if (Token::IsStrictEqualityOperator(comp->kind())) {
-    branch = new BranchInstr(new StrictCompareInstr(comp->kind(),
+    branch = new BranchInstr(new StrictCompareInstr(comp->token_pos(),
+                                                    comp->kind(),
                                                     comp->left(),
                                                     comp->right()));
   } else if (Token::IsEqualityOperator(comp->kind()) &&
              (comp->left()->BindsToConstantNull() ||
               comp->right()->BindsToConstantNull())) {
     branch = new BranchInstr(new StrictCompareInstr(
+        comp->token_pos(),
         (comp->kind() == Token::kEQ) ? Token::kEQ_STRICT : Token::kNE_STRICT,
         comp->left(),
         comp->right()));
@@ -657,7 +694,10 @@
   ASSERT(!FLAG_enable_type_checks);
   Value* constant_true = Bind(new ConstantInstr(Bool::True()));
   BranchInstr* branch = new BranchInstr(
-      new StrictCompareInstr(Token::kNE_STRICT, neg->value(), constant_true));
+      new StrictCompareInstr(condition_token_pos(),
+                             Token::kNE_STRICT,
+                             neg->value(),
+                             constant_true));
   AddInstruction(branch);
   CloseFragment();
   true_successor_addresses_.Add(branch->true_successor_address());
@@ -959,7 +999,8 @@
     }
     Value* constant_true = for_right.Bind(new ConstantInstr(Bool::True()));
     Value* compare =
-        for_right.Bind(new StrictCompareInstr(Token::kEQ_STRICT,
+        for_right.Bind(new StrictCompareInstr(node->token_pos(),
+                                              Token::kEQ_STRICT,
                                               right_value,
                                               constant_true));
     for_right.Do(BuildStoreExprTemp(compare));
@@ -1269,8 +1310,10 @@
     ValueGraphVisitor for_right_value(owner(), temp_index());
     node->right()->Visit(&for_right_value);
     Append(for_right_value);
-    StrictCompareInstr* comp = new StrictCompareInstr(
-        node->kind(), for_left_value.value(), for_right_value.value());
+    StrictCompareInstr* comp = new StrictCompareInstr(node->token_pos(),
+                                                      node->kind(),
+                                                      for_left_value.value(),
+                                                      for_right_value.value());
     ReturnDefinition(comp);
     return;
   }
@@ -3293,9 +3336,6 @@
 
 
 void EffectGraphVisitor::BuildThrowNode(ThrowNode* node) {
-  // TODO(kmillikin) non-local control flow is not handled correctly
-  // by the inliner.
-  InlineBailout("EffectGraphVisitor::BuildThrowNode (exception)");
   ValueGraphVisitor for_exception(owner(), temp_index());
   node->exception()->Visit(&for_exception);
   Append(for_exception);
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 0cb7843..a5672d4 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -377,10 +377,12 @@
 
   void EmitEqualityRegConstCompare(Register reg,
                                    const Object& obj,
-                                   bool needs_number_check);
+                                   bool needs_number_check,
+                                   intptr_t token_pos);
   void EmitEqualityRegRegCompare(Register left,
                                  Register right,
-                                 bool needs_number_check);
+                                 bool needs_number_check,
+                                 intptr_t token_pos);
   // Implement equality: if any of the arguments is null do identity check.
   // Fallthrough calls super equality.
   void EmitSuperEqualityCallPrologue(Register result, Label* skip_call);
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index d1e17a8..686c7e0 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -63,9 +63,7 @@
   // Current PP, FP, and PC.
   builder->AddPp(current->function(), slot_ix++);
   builder->AddCallerFp(slot_ix++);
-  builder->AddReturnAddress(current->function(),
-                            deopt_id(),
-                            slot_ix++);
+  builder->AddReturnAddress(current->function(), deopt_id(), slot_ix++);
 
   // Callee's PC marker is not used anymore. Pass Function::null() to set to 0.
   builder->AddPcMarker(Function::Handle(), slot_ix++);
@@ -535,12 +533,84 @@
 }
 
 
+// If instanceof type test cannot be performed successfully at compile time and
+// therefore eliminated, optimize it by adding inlined tests for:
+// - NULL -> return false.
+// - Smi -> compile time subtype check (only if dst class is not parameterized).
+// - Class equality (only if class is not parameterized).
+// Inputs:
+// - R0: object.
+// - R1: instantiator type arguments or raw_null.
+// - R2: instantiator or raw_null.
+// Returns:
+// - true or false in R0.
 void FlowGraphCompiler::GenerateInstanceOf(intptr_t token_pos,
                                            intptr_t deopt_id,
                                            const AbstractType& type,
                                            bool negate_result,
                                            LocationSummary* locs) {
-  UNIMPLEMENTED();
+  ASSERT(type.IsFinalized() && !type.IsMalformed());
+
+  // Preserve instantiator (R2) and its type arguments (R1).
+  __ PushList((1 << R1) | (1 << R2));
+
+  Label is_instance, is_not_instance;
+  // If type is instantiated and non-parameterized, we can inline code
+  // checking whether the tested instance is a Smi.
+  if (type.IsInstantiated()) {
+    // A null object is only an instance of Object and dynamic, which has
+    // already been checked above (if the type is instantiated). So we can
+    // return false here if the instance is null (and if the type is
+    // instantiated).
+    // We can only inline this null check if the type is instantiated at compile
+    // time, since an uninstantiated type at compile time could be Object or
+    // dynamic at run time.
+    __ CompareImmediate(R0, reinterpret_cast<int32_t>(Object::null()));
+    __ b(&is_not_instance, EQ);
+  }
+
+  // Generate inline instanceof test.
+  SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle();
+  test_cache = GenerateInlineInstanceof(token_pos, type,
+                                        &is_instance, &is_not_instance);
+
+  // test_cache is null if there is no fall-through.
+  Label done;
+  if (!test_cache.IsNull()) {
+    // Generate runtime call.
+    // Load instantiator (R2) and its type arguments (R1).
+    __ ldm(IA, SP,  (1 << R1) | (1 << R2));
+    __ PushObject(Object::ZoneHandle());  // Make room for the result.
+    __ Push(R0);  // Push the instance.
+    __ PushObject(type);  // Push the type.
+    // Push instantiator (R2) and its type arguments (R1).
+    __ PushList((1 << R1) | (1 << R2));
+    __ LoadObject(R0, test_cache);
+    __ Push(R0);
+    GenerateCallRuntime(token_pos, deopt_id, kInstanceofRuntimeEntry, locs);
+    // Pop the parameters supplied to the runtime entry. The result of the
+    // instanceof runtime call will be left as the result of the operation.
+    __ Drop(5);
+    if (negate_result) {
+      __ Pop(R1);
+      __ LoadObject(R0, Bool::True());
+      __ cmp(R1, ShifterOperand(R0));
+      __ b(&done, NE);
+      __ LoadObject(R0, Bool::False());
+    } else {
+      __ Pop(R0);
+    }
+    __ b(&done);
+  }
+  __ Bind(&is_not_instance);
+  __ LoadObject(R0, negate_result ? Bool::True() : Bool::False());
+  __ b(&done);
+
+  __ Bind(&is_instance);
+  __ LoadObject(R0, negate_result ? Bool::False() : Bool::True());
+  __ Bind(&done);
+  // Remove instantiator (R2) and its type arguments (R1).
+  __ Drop(2);
 }
 
 
@@ -1101,12 +1171,12 @@
 
   __ bkpt(0);
   GenerateDeferredCode();
-  // Emit function patching code. This will be swapped with the first 5 bytes
-  // at entry point.
+  // Emit function patching code. This will be swapped with the first 3
+  // instructions at entry point.
   AddCurrentDescriptor(PcDescriptors::kPatchCode,
                        Isolate::kNoDeoptId,
                        0);  // No token position.
-  __ Branch(&StubCode::FixCallersTargetLabel());
+  __ BranchPatchable(&StubCode::FixCallersTargetLabel());
   AddCurrentDescriptor(PcDescriptors::kLazyDeoptJump,
                        Isolate::kNoDeoptId,
                        0);  // No token position.
@@ -1245,12 +1315,16 @@
 
 void FlowGraphCompiler::EmitEqualityRegConstCompare(Register reg,
                                                     const Object& obj,
-                                                    bool needs_number_check) {
+                                                    bool needs_number_check,
+                                                    intptr_t token_pos) {
   if (needs_number_check &&
       (obj.IsMint() || obj.IsDouble() || obj.IsBigint())) {
     __ Push(reg);
     __ PushObject(obj);
     __ BranchLink(&StubCode::IdenticalWithNumberCheckLabel());
+    AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+                         Isolate::kNoDeoptId,
+                         token_pos);
     __ Drop(1);  // Discard constant.
     __ Pop(reg);  // Restore 'reg'.
     return;
@@ -1262,11 +1336,15 @@
 
 void FlowGraphCompiler::EmitEqualityRegRegCompare(Register left,
                                                   Register right,
-                                                  bool needs_number_check) {
+                                                  bool needs_number_check,
+                                                  intptr_t token_pos) {
   if (needs_number_check) {
     __ Push(left);
     __ Push(right);
     __ BranchLink(&StubCode::IdenticalWithNumberCheckLabel());
+    AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+                         Isolate::kNoDeoptId,
+                         token_pos);
     // Stub returns result in flags (result of a cmpl, we need ZF computed).
     __ Pop(right);
     __ Pop(left);
@@ -1317,13 +1395,48 @@
 
 void FlowGraphCompiler::EmitTestAndCall(const ICData& ic_data,
                                         Register class_id_reg,
-                                        intptr_t arg_count,
-                                        const Array& arg_names,
+                                        intptr_t argument_count,
+                                        const Array& argument_names,
                                         Label* deopt,
                                         intptr_t deopt_id,
                                         intptr_t token_index,
                                         LocationSummary* locs) {
-  UNIMPLEMENTED();
+  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);
+  ASSERT(class_id_reg != R4);
+  ASSERT(len > 0);  // Why bother otherwise.
+  const Array& arguments_descriptor =
+      Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
+                                                 argument_names));
+  __ LoadObject(R4, arguments_descriptor);
+  for (intptr_t i = 0; i < len; i++) {
+    const bool is_last_check = (i == (len - 1));
+    Label next_test;
+    assembler()->CompareImmediate(class_id_reg, sorted[i].cid);
+    if (is_last_check) {
+      assembler()->b(deopt, NE);
+    } else {
+      assembler()->b(&next_test, NE);
+    }
+    // Do not use the code from the function, but let the code be patched so
+    // that we can record the outgoing edges to other code.
+    GenerateDartCall(deopt_id,
+                     token_index,
+                     &StubCode::CallStaticFunctionLabel(),
+                     PcDescriptors::kFuncCall,
+                     locs);
+    const Function& function = *sorted[i].target;
+    AddStaticCallTarget(function);
+    __ Drop(argument_count);
+    if (!is_last_check) {
+      assembler()->b(&match_found);
+    }
+    assembler()->Bind(&next_test);
+  }
+  assembler()->Bind(&match_found);
 }
 
 
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index aa731d9..593b42d 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -68,9 +68,7 @@
 
   // Current FP and PC.
   builder->AddCallerFp(slot_ix++);
-  builder->AddReturnAddress(current->function(),
-                            deopt_id(),
-                            slot_ix++);
+  builder->AddReturnAddress(current->function(), deopt_id(), slot_ix++);
 
   // Emit all values that are needed for materialization as a part of the
   // expression stack for the bottom-most frame. This guarantees that GC
@@ -1442,7 +1440,8 @@
 
 void FlowGraphCompiler::EmitEqualityRegConstCompare(Register reg,
                                                     const Object& obj,
-                                                    bool needs_number_check) {
+                                                    bool needs_number_check,
+                                                    intptr_t token_pos) {
   if (needs_number_check) {
     if (!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint()) {
       needs_number_check = false;
@@ -1459,6 +1458,9 @@
     __ pushl(reg);
     __ PushObject(obj);
     __ call(&StubCode::IdenticalWithNumberCheckLabel());
+    AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+                         Isolate::kNoDeoptId,
+                         token_pos);
     __ popl(reg);  // Discard constant.
     __ popl(reg);  // Restore 'reg'.
     return;
@@ -1470,11 +1472,15 @@
 
 void FlowGraphCompiler::EmitEqualityRegRegCompare(Register left,
                                                   Register right,
-                                                  bool needs_number_check) {
+                                                  bool needs_number_check,
+                                                  intptr_t token_pos) {
   if (needs_number_check) {
     __ pushl(left);
     __ pushl(right);
     __ call(&StubCode::IdenticalWithNumberCheckLabel());
+    AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+                         Isolate::kNoDeoptId,
+                         token_pos);
     // Stub returns result in flags (result of a cmpl, we need ZF computed).
     __ popl(right);
     __ popl(left);
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index 4b88a5f..efcd64c 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -1213,13 +1213,17 @@
 
 void FlowGraphCompiler::EmitEqualityRegConstCompare(Register reg,
                                                     const Object& obj,
-                                                    bool needs_number_check) {
+                                                    bool needs_number_check,
+                                                    intptr_t token_pos) {
   if (needs_number_check &&
       (obj.IsMint() || obj.IsDouble() || obj.IsBigint())) {
     __ addiu(SP, SP, Immediate(-2 * kWordSize));
     __ sw(reg, Address(SP, 1 * kWordSize));
     __ LoadObject(TMP1, obj);
     __ BranchLink(&StubCode::IdenticalWithNumberCheckLabel());
+    AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+                         Isolate::kNoDeoptId,
+                         token_pos);
     __ delay_slot()->sw(TMP1, Address(SP, 0 * kWordSize));
     __ lw(reg, Address(SP, 1 * kWordSize));  // Restore 'reg'.
     __ addiu(SP, SP, Immediate(2 * kWordSize));  // Discard constant.
@@ -1231,12 +1235,16 @@
 
 void FlowGraphCompiler::EmitEqualityRegRegCompare(Register left,
                                                   Register right,
-                                                  bool needs_number_check) {
+                                                  bool needs_number_check,
+                                                  intptr_t token_pos) {
   __ TraceSimMsg("EqualityRegRegCompare");
   if (needs_number_check) {
     __ addiu(SP, SP, Immediate(-2 * kWordSize));
     __ sw(left, Address(SP, 1 * kWordSize));
     __ BranchLink(&StubCode::IdenticalWithNumberCheckLabel());
+    AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+                         Isolate::kNoDeoptId,
+                         token_pos);
     __ delay_slot()->sw(right, Address(SP, 0 * kWordSize));
     __ TraceSimMsg("EqualityRegRegCompare return");
     // Stub returns result in CMPRES. If it is 0, then left and right are equal.
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index dd764ea..8c9e874 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -66,9 +66,7 @@
 
   // Current FP and PC.
   builder->AddCallerFp(slot_ix++);
-  builder->AddReturnAddress(current->function(),
-                            deopt_id(),
-                            slot_ix++);
+  builder->AddReturnAddress(current->function(), deopt_id(), slot_ix++);
 
   // Emit all values that are needed for materialization as a part of the
   // expression stack for the bottom-most frame. This guarantees that GC
@@ -1439,7 +1437,8 @@
 
 void FlowGraphCompiler::EmitEqualityRegConstCompare(Register reg,
                                                     const Object& obj,
-                                                    bool needs_number_check) {
+                                                    bool needs_number_check,
+                                                    intptr_t token_pos) {
   if (needs_number_check) {
     if (!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint()) {
       needs_number_check = false;
@@ -1456,6 +1455,9 @@
     __ pushq(reg);
     __ PushObject(obj);
     __ call(&StubCode::IdenticalWithNumberCheckLabel());
+    AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+                         Isolate::kNoDeoptId,
+                         token_pos);
     __ popq(reg);  // Discard constant.
     __ popq(reg);  // Restore 'reg'.
     return;
@@ -1467,11 +1469,15 @@
 
 void FlowGraphCompiler::EmitEqualityRegRegCompare(Register left,
                                                   Register right,
-                                                  bool needs_number_check) {
+                                                  bool needs_number_check,
+                                                  intptr_t token_pos) {
   if (needs_number_check) {
     __ pushq(left);
     __ pushq(right);
     __ call(&StubCode::IdenticalWithNumberCheckLabel());
+    AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+                         Isolate::kNoDeoptId,
+                         token_pos);
     // Stub returns result in flags (result of a cmpl, we need ZF computed).
     __ popq(right);
     __ popq(left);
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 541b3f6..0c0a38d 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -579,17 +579,16 @@
       GraphInfoCollector info;
       info.Collect(*callee_graph);
       const intptr_t size = info.instruction_count();
+      const intptr_t call_site_count = info.call_site_count();
 
       function.set_optimized_instruction_count(size);
-      function.set_optimized_call_site_count(info.call_site_count());
+      function.set_optimized_call_site_count(call_site_count);
 
       // Use heuristics do decide if this call should be inlined.
-      if (!ShouldWeInline(size,
-                          info.call_site_count(),
-                          constants_count)) {
+      if (!ShouldWeInline(size, call_site_count, constants_count)) {
         // If size is larger than all thresholds, don't consider it again.
         if ((size > FLAG_inlining_size_threshold) &&
-            (size > FLAG_inlining_callee_call_sites_threshold) &&
+            (call_site_count > FLAG_inlining_callee_call_sites_threshold) &&
             (size > FLAG_inlining_constant_arguments_size_threshold)) {
           function.set_is_inlinable(false);
         }
@@ -600,7 +599,7 @@
                                  "call sites: %"Pd", "
                                  "const args: %"Pd"\n",
                                  size,
-                                 info.call_site_count(),
+                                 call_site_count,
                                  constants_count));
         return false;
       }
@@ -613,6 +612,14 @@
       // Add the function to the cache.
       if (!in_cache) function_cache_.Add(parsed_function);
 
+      // Functions can be inlined before they are optimized.
+      // If not yet present, allocate deoptimization history array.
+      Array& deopt_history = Array::Handle(function.deopt_history());
+      if (deopt_history.IsNull()) {
+        deopt_history = Array::New(FLAG_deoptimization_counter_threshold);
+        function.set_deopt_history(deopt_history);
+      }
+
       // Build succeeded so we restore the bailout jump.
       inlined_ = true;
       inlined_size_ += size;
@@ -1148,7 +1155,8 @@
       cid_constant->set_ssa_temp_index(
           owner_->caller_graph()->alloc_ssa_temp_index());
       StrictCompareInstr* compare =
-          new StrictCompareInstr(Token::kEQ_STRICT,
+          new StrictCompareInstr(call_->instance_call()->token_pos(),
+                                 Token::kEQ_STRICT,
                                  new Value(load_cid),
                                  new Value(cid_constant));
       BranchInstr* branch = new BranchInstr(compare);
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 2da6e02..81ebad6 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -1397,7 +1397,8 @@
 
   ConstantInstr* zero = flow_graph()->GetConstant(Smi::Handle(Smi::New(0)));
   StrictCompareInstr* compare =
-      new StrictCompareInstr(Token::kEQ_STRICT,
+      new StrictCompareInstr(call->token_pos(),
+                             Token::kEQ_STRICT,
                              new Value(load),
                              new Value(zero));
   ReplaceCall(call, compare);
@@ -2607,7 +2608,8 @@
     Token::Kind strict_kind = (compare->kind() == Token::kEQ) ?
         Token::kEQ_STRICT : Token::kNE_STRICT;
     StrictCompareInstr* strict_comp =
-        new StrictCompareInstr(strict_kind,
+        new StrictCompareInstr(compare->token_pos(),
+                               strict_kind,
                                compare->left()->CopyWithType(),
                                compare->right()->CopyWithType());
     current_instruction->ReplaceWith(strict_comp, current_iterator());
@@ -3415,8 +3417,6 @@
 void LICM::Hoist(ForwardInstructionIterator* it,
                  BlockEntryInstr* pre_header,
                  Instruction* current) {
-  // TODO(fschneider): Avoid repeated deoptimization when
-  // speculatively hoisting checks.
   if (FLAG_trace_optimization) {
     OS::Print("Hoisting instruction %s:%"Pd" from B%"Pd" to B%"Pd"\n",
               current->DebugName(),
@@ -3472,7 +3472,7 @@
   }
 
   // Host CheckSmi instruction and make this phi smi one.
-  Hoist(it, pre_header, current);
+  if (MayHoist(current, pre_header)) Hoist(it, pre_header, current);
 
   // Replace value we are checking with phi's input.
   current->value()->BindTo(phi->InputAt(non_smi_input)->definition());
@@ -3491,6 +3491,31 @@
 }
 
 
+bool LICM::MayHoist(Instruction* instr, BlockEntryInstr* pre_header) {
+  // TODO(fschneider): Enable hoisting of Assert-instructions
+  // if it safe to do.
+  if (instr->IsAssertAssignable()) return false;
+  if (instr->IsAssertBoolean()) return false;
+
+  if (instr->CanDeoptimize()) {
+    intptr_t target_deopt_id =
+        pre_header->last_instruction()->AsGoto()->GetDeoptId();
+    const Function& function = flow_graph_->parsed_function().function();
+    const Array& deopt_history = Array::Handle(function.deopt_history());
+    if (deopt_history.IsNull()) return true;
+
+    Smi& deopt_id = Smi::Handle();
+    for (intptr_t i = 0; i < deopt_history.Length(); ++i) {
+      deopt_id ^= deopt_history.At(i);
+      if (!deopt_id.IsNull() && (deopt_id.Value() == target_deopt_id)) {
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
+
 void LICM::Optimize() {
   const ZoneGrowableArray<BlockEntryInstr*>& loop_headers =
       flow_graph()->loop_headers();
@@ -3525,11 +3550,7 @@
               break;
             }
           }
-          if (inputs_loop_invariant &&
-              !current->IsAssertAssignable() &&
-              !current->IsAssertBoolean()) {
-            // TODO(fschneider): Enable hoisting of Assert-instructions
-            // if it safe to do.
+          if (inputs_loop_invariant && MayHoist(current, pre_header)) {
             Hoist(&it, pre_header, current);
           } else if (current->IsCheckSmi() &&
                      current->InputAt(0)->definition()->IsPhi()) {
@@ -5338,44 +5359,56 @@
 }
 
 
-void ConstantPropagator::VisitBinarySmiOp(BinarySmiOpInstr* instr) {
-  const Object& left = instr->left()->definition()->constant_value();
-  const Object& right = instr->right()->definition()->constant_value();
+void ConstantPropagator::HandleBinaryOp(Definition* instr,
+                                        Token::Kind op_kind,
+                                        const Value& left_val,
+                                        const Value& right_val) {
+  const Object& left = left_val.definition()->constant_value();
+  const Object& right = right_val.definition()->constant_value();
   if (IsNonConstant(left) || IsNonConstant(right)) {
+    // TODO(srdjan): Add arithemtic simplifications, e.g, add with 0.
     SetValue(instr, non_constant_);
   } else if (IsConstant(left) && IsConstant(right)) {
-    if (left.IsSmi() && right.IsSmi()) {
-      const Smi& left_smi = Smi::Cast(left);
-      const Smi& right_smi = Smi::Cast(right);
-      switch (instr->op_kind()) {
+    if (left.IsInteger() && right.IsInteger()) {
+      const Integer& left_int = Integer::Cast(left);
+      const Integer& right_int = Integer::Cast(right);
+      switch (op_kind) {
         case Token::kADD:
         case Token::kSUB:
         case Token::kMUL:
         case Token::kTRUNCDIV:
         case Token::kMOD: {
-          const Object& result = Integer::ZoneHandle(
-              left_smi.ArithmeticOp(instr->op_kind(), right_smi));
+          Instance& result = Integer::ZoneHandle(
+              left_int.ArithmeticOp(op_kind, right_int));
+          result = result.Canonicalize();
           SetValue(instr, result);
           break;
         }
         case Token::kSHL:
-        case Token::kSHR: {
-          const Object& result = Integer::ZoneHandle(
-              left_smi.ShiftOp(instr->op_kind(), right_smi));
-          SetValue(instr, result);
+        case Token::kSHR:
+          if (left.IsSmi() && right.IsSmi()) {
+            Instance& result = Integer::ZoneHandle(
+                Smi::Cast(left_int).ShiftOp(op_kind, Smi::Cast(right_int)));
+            result = result.Canonicalize();
+            SetValue(instr, result);
+          } else {
+            SetValue(instr, non_constant_);
+          }
           break;
-        }
         case Token::kBIT_AND:
         case Token::kBIT_OR:
         case Token::kBIT_XOR: {
-          const Object& result = Integer::ZoneHandle(
-              left_smi.BitOp(instr->op_kind(), right_smi));
+          Instance& result = Integer::ZoneHandle(
+              left_int.BitOp(op_kind, right_int));
+          result = result.Canonicalize();
           SetValue(instr, result);
           break;
         }
-        default:
-          // TODO(kmillikin): support other smi operations.
+        case Token::kDIV:
           SetValue(instr, non_constant_);
+          break;
+        default:
+          UNREACHABLE();
       }
     } else {
       // TODO(kmillikin): support other types.
@@ -5385,6 +5418,11 @@
 }
 
 
+void ConstantPropagator::VisitBinarySmiOp(BinarySmiOpInstr* instr) {
+  HandleBinaryOp(instr, instr->op_kind(), *instr->left(), *instr->right());
+}
+
+
 void ConstantPropagator::VisitBoxInteger(BoxIntegerInstr* instr) {
   // TODO(kmillikin): Handle box operation.
   SetValue(instr, non_constant_);
@@ -5399,15 +5437,13 @@
 
 void ConstantPropagator::VisitBinaryMintOp(
     BinaryMintOpInstr* instr) {
-  // TODO(kmillikin): Handle binary operations.
-  SetValue(instr, non_constant_);
+  HandleBinaryOp(instr, instr->op_kind(), *instr->left(), *instr->right());
 }
 
 
 void ConstantPropagator::VisitShiftMintOp(
     ShiftMintOpInstr* instr) {
-  // TODO(kmillikin): Handle shift operations.
-  SetValue(instr, non_constant_);
+  HandleBinaryOp(instr, instr->op_kind(), *instr->left(), *instr->right());
 }
 
 
@@ -5977,7 +6013,10 @@
   ComparisonInstr* comparison = branch->comparison();
   ComparisonInstr* new_comparison = NULL;
   if (comparison->IsStrictCompare()) {
-    new_comparison = new StrictCompareInstr(comparison->kind(), left, right);
+    new_comparison = new StrictCompareInstr(comparison->token_pos(),
+                                            comparison->kind(),
+                                            left,
+                                            right);
   } else if (comparison->IsEqualityCompare()) {
     EqualityCompareInstr* equality_compare = comparison->AsEqualityCompare();
     EqualityCompareInstr* new_equality_compare =
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index 18b4eec..dfa24a6 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -200,6 +200,8 @@
  private:
   FlowGraph* flow_graph() const { return flow_graph_; }
 
+  bool MayHoist(Instruction* instr, BlockEntryInstr* pre_header);
+
   void Hoist(ForwardInstructionIterator* it,
              BlockEntryInstr* pre_header,
              Instruction* current);
@@ -267,6 +269,11 @@
     return !IsNonConstant(value) && !IsUnknown(value);
   }
 
+  void HandleBinaryOp(Definition* instr,
+                      Token::Kind op_kind,
+                      const Value& left,
+                      const Value& right);
+
   virtual void VisitBlocks() { UNREACHABLE(); }
 
 #define DECLARE_VISIT(type) virtual void Visit##type(type##Instr* instr);
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index ed56e35..ce76be5 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -4,6 +4,7 @@
 
 #include "vm/intermediate_language.h"
 
+#include "vm/bigint_operations.h"
 #include "vm/bit_vector.h"
 #include "vm/dart_entry.h"
 #include "vm/flow_graph_allocator.h"
@@ -204,6 +205,16 @@
 }
 
 
+ConstantInstr::ConstantInstr(const Object& value) : value_(value) {
+  // Check that the value is not an incorrect Integer representation.
+  ASSERT(!value.IsBigint() ||
+         !BigintOperations::FitsIntoSmi(Bigint::Cast(value)));
+  ASSERT(!value.IsBigint() ||
+         !BigintOperations::FitsIntoInt64(Bigint::Cast(value)));
+  ASSERT(!value.IsMint() || !Smi::IsValid64(Mint::Cast(value).AsInt64Value()));
+}
+
+
 bool ConstantInstr::AttributesEqual(Instruction* other) const {
   ConstantInstr* other_constant = other->AsConstant();
   ASSERT(other_constant != NULL);
@@ -427,6 +438,18 @@
 }
 
 
+Instruction* Instruction::AppendInstruction(Instruction* tail) {
+  LinkTo(tail);
+  // Update def-use chains whenever instructions are added to the graph
+  // after initial graph construction.
+  for (intptr_t i = tail->InputCount() - 1; i >= 0; --i) {
+    Value* input = tail->InputAt(i);
+    input->definition()->AddInputUse(input);
+  }
+  return tail;
+}
+
+
 BlockEntryInstr* Instruction::GetBlock() const {
   // TODO(fschneider): Implement a faster way to get the block of an
   // instruction.
@@ -1562,10 +1585,11 @@
 }
 
 
-StrictCompareInstr::StrictCompareInstr(Token::Kind kind,
+StrictCompareInstr::StrictCompareInstr(intptr_t token_pos,
+                                       Token::Kind kind,
                                        Value* left,
                                        Value* right)
-    : ComparisonInstr(kind, left, right),
+    : ComparisonInstr(token_pos, kind, left, right),
       needs_number_check_(FLAG_new_identity_spec) {
   ASSERT((kind == Token::kEQ_STRICT) || (kind == Token::kNE_STRICT));
 }
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 42c8470..683642f 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -798,6 +798,11 @@
   // Insert this instruction after 'prev' after use lists are computed.
   void InsertAfter(Instruction* prev);
 
+  // Append an instruction to the current one and return the tail.
+  // This function updated def-use chains of the newly appended
+  // instruction.
+  Instruction* AppendInstruction(Instruction* tail);
+
   // Returns true if CSE and LICM are allowed for this instruction.
   virtual bool AllowsCSE() const {
     return false;
@@ -2377,8 +2382,7 @@
 
 class ConstantInstr : public TemplateDefinition<0> {
  public:
-  explicit ConstantInstr(const Object& value)
-      : value_(value) { }
+  explicit ConstantInstr(const Object& value);
 
   DECLARE_INSTRUCTION(Constant)
   virtual CompileType ComputeType() const;
@@ -2705,8 +2709,11 @@
 
 class ComparisonInstr : public TemplateDefinition<2> {
  public:
-  ComparisonInstr(Token::Kind kind, Value* left, Value* right)
-      : kind_(kind) {
+  ComparisonInstr(intptr_t token_pos,
+                  Token::Kind kind,
+                  Value* left,
+                  Value* right)
+      : token_pos_(token_pos), kind_(kind) {
     SetInputAt(0, left);
     SetInputAt(1, right);
   }
@@ -2716,6 +2723,7 @@
 
   virtual ComparisonInstr* AsComparison() { return this; }
 
+  intptr_t token_pos() const { return token_pos_; }
   Token::Kind kind() const { return kind_; }
 
   virtual void EmitBranchCode(FlowGraphCompiler* compiler,
@@ -2726,6 +2734,7 @@
   }
 
  protected:
+  intptr_t token_pos_;
   Token::Kind kind_;
 };
 
@@ -2792,7 +2801,10 @@
 
 class StrictCompareInstr : public ComparisonInstr {
  public:
-  StrictCompareInstr(Token::Kind kind, Value* left, Value* right);
+  StrictCompareInstr(intptr_t token_pos,
+                     Token::Kind kind,
+                     Value* left,
+                     Value* right);
 
   DECLARE_INSTRUCTION(StrictCompare)
   virtual CompileType ComputeType() const;
@@ -2838,9 +2850,8 @@
                        Value* left,
                        Value* right,
                        const Array& ic_data_array)
-      : ComparisonInstr(kind, left, right),
+      : ComparisonInstr(token_pos, kind, left, right),
         ic_data_(GetICData(ic_data_array)),
-        token_pos_(token_pos),
         receiver_class_id_(kIllegalCid) {
     ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
   }
@@ -2855,8 +2866,6 @@
   }
   void set_ic_data(const ICData* value) { ic_data_ = value; }
 
-  intptr_t token_pos() const { return token_pos_; }
-
   // Receiver class id is computed from collected ICData.
   void set_receiver_class_id(intptr_t value) { receiver_class_id_ = value; }
   intptr_t receiver_class_id() const { return receiver_class_id_; }
@@ -2903,7 +2912,6 @@
 
  private:
   const ICData* ic_data_;
-  const intptr_t token_pos_;
   intptr_t receiver_class_id_;  // Set by optimizer.
 
   DISALLOW_COPY_AND_ASSIGN(EqualityCompareInstr);
@@ -2917,9 +2925,8 @@
                     Value* left,
                     Value* right,
                     const Array& ic_data_array)
-      : ComparisonInstr(kind, left, right),
+      : ComparisonInstr(token_pos, kind, left, right),
         ic_data_(GetICData(ic_data_array)),
-        token_pos_(token_pos),
         operands_class_id_(kIllegalCid) {
     ASSERT(Token::IsRelationalOperator(kind));
   }
@@ -2934,8 +2941,6 @@
   }
   void set_ic_data(const ICData* value) { ic_data_ = value; }
 
-  intptr_t token_pos() const { return token_pos_; }
-
   // TODO(srdjan): instead of class-id pass an enum that can differentiate
   // between boxed and unboxed doubles and integers.
   void set_operands_class_id(intptr_t value) {
@@ -2979,7 +2984,6 @@
 
  private:
   const ICData* ic_data_;
-  const intptr_t token_pos_;
   intptr_t operands_class_id_;  // class id of both operands.
 
   DISALLOW_COPY_AND_ASSIGN(RelationalOpInstr);
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index ecbaf96..d07ab4d 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -339,7 +339,10 @@
     const intptr_t kNumTemps = 1;
     LocationSummary* locs =
         new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
-    UNIMPLEMENTED();  // TODO(regis): Verify register allocation.
+    locs->set_in(0, Location::RegisterLocation(R1));
+    locs->set_in(1, Location::RegisterLocation(R0));
+    locs->set_temp(0, Location::RegisterLocation(R5));
+    locs->set_out(Location::RegisterLocation(R0));
     return locs;
   }
   const intptr_t kNumTemps = 1;
@@ -424,7 +427,7 @@
     // Pass left in R1 and right in R0.
     compiler->GenerateCall(token_pos,
                            &StubCode::EqualityWithNullArgLabel(),
-                           PcDescriptors::kEqualNull,
+                           PcDescriptors::kRuntimeCall,
                            locs);
   }
   __ Bind(&check_ne);
@@ -457,6 +460,104 @@
 }
 
 
+static Condition NegateCondition(Condition condition) {
+  switch (condition) {
+    case EQ: return NE;
+    case NE: return EQ;
+    case LT: return GE;
+    case LE: return GT;
+    case GT: return LE;
+    case GE: return LT;
+    case CC: return CS;
+    case LS: return HI;
+    case HI: return LS;
+    case CS: return CC;
+    default:
+      UNIMPLEMENTED();
+      return EQ;
+  }
+}
+
+
+// R1: left.
+// R0: right.
+static void EmitEqualityAsPolymorphicCall(FlowGraphCompiler* compiler,
+                                          const ICData& orig_ic_data,
+                                          LocationSummary* locs,
+                                          BranchInstr* branch,
+                                          Token::Kind kind,
+                                          intptr_t deopt_id,
+                                          intptr_t token_pos) {
+  ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
+  const ICData& ic_data = ICData::Handle(orig_ic_data.AsUnaryClassChecks());
+  ASSERT(ic_data.NumberOfChecks() > 0);
+  ASSERT(ic_data.num_args_tested() == 1);
+  Label* deopt = compiler->AddDeoptStub(deopt_id, kDeoptEquality);
+  Register left = locs->in(0).reg();
+  Register right = locs->in(1).reg();
+  ASSERT(left == R1);
+  ASSERT(right == R0);
+  Register temp = locs->temp(0).reg();
+  LoadValueCid(compiler, temp, left,
+               (ic_data.GetReceiverClassIdAt(0) == kSmiCid) ? NULL : deopt);
+  // 'temp' contains class-id of the left argument.
+  ObjectStore* object_store = Isolate::Current()->object_store();
+  Condition cond = TokenKindToSmiCondition(kind);
+  Label done;
+  const intptr_t len = ic_data.NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
+    // Assert that the Smi is at position 0, if at all.
+    ASSERT((ic_data.GetReceiverClassIdAt(i) != kSmiCid) || (i == 0));
+    Label next_test;
+    __ CompareImmediate(temp, ic_data.GetReceiverClassIdAt(i));
+    if (i < len - 1) {
+      __ b(&next_test, NE);
+    } else {
+      __ b(deopt, NE);
+    }
+    const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(i));
+    if (target.Owner() == object_store->object_class()) {
+      // Object.== is same as ===.
+      __ cmp(left, ShifterOperand(right));
+      if (branch != NULL) {
+        branch->EmitBranchOnCondition(compiler, cond);
+      } else {
+        Register result = locs->out().reg();
+        __ LoadObject(result, Bool::True(), cond);
+        __ LoadObject(result, Bool::False(), NegateCondition(cond));
+      }
+    } else {
+      const int kNumberOfArguments = 2;
+      const Array& kNoArgumentNames = Array::Handle();
+      compiler->GenerateStaticCall(deopt_id,
+                                   token_pos,
+                                   target,
+                                   kNumberOfArguments,
+                                   kNoArgumentNames,
+                                   locs);
+      if (branch == NULL) {
+        if (kind == Token::kNE) {
+          __ CompareObject(R0, Bool::True());
+          __ LoadObject(R0, Bool::True(), NE);
+          __ LoadObject(R0, Bool::False(), EQ);
+        }
+      } else {
+        if (branch->is_checked()) {
+          EmitAssertBoolean(R0, token_pos, deopt_id, locs, compiler);
+        }
+        __ CompareObject(R0, Bool::True());
+        branch->EmitBranchOnCondition(compiler, cond);
+      }
+    }
+    if (i < len - 1) {
+      __ b(&done);
+      __ Bind(&next_test);
+    }
+  }
+  __ Bind(&done);
+}
+
+
 // Emit code when ICData's targets are all Object == (which is ===).
 static void EmitCheckedStrictEqual(FlowGraphCompiler* compiler,
                                    const ICData& ic_data,
@@ -478,26 +579,38 @@
                                        const ICData& ic_data,
                                        intptr_t deopt_id,
                                        intptr_t token_pos) {
-  UNIMPLEMENTED();
-}
-
-
-static Condition NegateCondition(Condition condition) {
-  switch (condition) {
-    case EQ: return NE;
-    case NE: return EQ;
-    case LT: return GE;
-    case LE: return GT;
-    case GT: return LE;
-    case GE: return LT;
-    case CC: return CS;
-    case LS: return HI;
-    case HI: return LS;
-    case CS: return CC;
-    default:
-      UNIMPLEMENTED();
-      return EQ;
+  ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
+  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
+  Register left = locs->in(0).reg();
+  Register right = locs->in(1).reg();
+  Label done, identity_compare, non_null_compare;
+  __ LoadImmediate(IP, reinterpret_cast<intptr_t>(Object::null()));
+  __ cmp(right, ShifterOperand(IP));
+  __ b(&identity_compare, EQ);
+  __ cmp(left, ShifterOperand(IP));
+  __ b(&non_null_compare, NE);
+  // Comparison with NULL is "===".
+  __ Bind(&identity_compare);
+  __ cmp(left, ShifterOperand(right));
+  Condition cond = TokenKindToSmiCondition(kind);
+  if (branch != NULL) {
+    branch->EmitBranchOnCondition(compiler, cond);
+  } else {
+    Register result = locs->out().reg();
+    Label load_true;
+    __ b(&load_true, cond);
+    __ LoadObject(result, Bool::False());
+    __ b(&done);
+    __ Bind(&load_true);
+    __ LoadObject(result, Bool::True());
   }
+  __ b(&done);
+  __ Bind(&non_null_compare);  // Receiver is not null.
+  ASSERT(left == R1);
+  ASSERT(right == R0);
+  EmitEqualityAsPolymorphicCall(compiler, ic_data, locs, branch, kind,
+                                deopt_id, token_pos);
+  __ Bind(&done);
 }
 
 
@@ -845,13 +958,25 @@
 
 
 LocationSummary* LoadClassIdInstr::MakeLocationSummary() const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  return LocationSummary::Make(kNumInputs,
+                               Location::RequiresRegister(),
+                               LocationSummary::kNoCall);
 }
 
 
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register object = locs()->in(0).reg();
+  Register result = locs()->out().reg();
+  Label load, done;
+  __ tst(object, ShifterOperand(kSmiTagMask));
+  __ b(&load, NE);
+  __ LoadImmediate(result, Smi::RawValue(kSmiCid));
+  __ b(&done);
+  __ Bind(&load);
+  __ LoadClassId(result, object);
+  __ SmiTag(result);
+  __ Bind(&done);
 }
 
 
@@ -992,9 +1117,6 @@
   }
 
   Register result = locs()->out().reg();
-  if ((index_scale() == 1) && index.IsRegister()) {
-    __ SmiUntag(index.reg());
-  }
   switch (class_id()) {
     case kTypedDataInt8ArrayCid:
       ASSERT(index_scale() == 1);
@@ -1105,7 +1227,7 @@
     case kTypedDataUint16ArrayCid:
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      locs->set_in(2, Location::RequiresRegister());
+      locs->set_in(2, Location::WritableRegister());
       break;
     case kTypedDataFloat32ArrayCid:
       // TODO(regis): Verify.
@@ -1479,13 +1601,29 @@
 
 
 LocationSummary* InstanceOfInstr::MakeLocationSummary() const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 3;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  summary->set_in(0, Location::RegisterLocation(R0));
+  summary->set_in(1, Location::RegisterLocation(R2));
+  summary->set_in(2, Location::RegisterLocation(R1));
+  summary->set_out(Location::RegisterLocation(R0));
+  return summary;
 }
 
 
 void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  ASSERT(locs()->in(0).reg() == R0);  // Value.
+  ASSERT(locs()->in(1).reg() == R2);  // Instantiator.
+  ASSERT(locs()->in(2).reg() == R1);  // Instantiator type arguments.
+
+  compiler->GenerateInstanceOf(token_pos(),
+                               deopt_id(),
+                               type(),
+                               negate_result(),
+                               locs());
+  ASSERT(locs()->out().reg() == R0);
 }
 
 
@@ -1935,9 +2073,13 @@
     }
     case Token::kMUL: {
       __ SmiUntag(left);
-      __ mul(result, left, right);
-      if (deopt != NULL) {
-        UNIMPLEMENTED();
+      if (deopt == NULL) {
+        __ mul(result, left, right);
+      } else {
+        __ smull(result, IP, left, right);
+        // IP: result bits 32..63.
+        __ cmp(IP, ShifterOperand(result, ASR, 31));
+        __ b(deopt, NE);
       }
       break;
     }
@@ -2719,15 +2861,18 @@
   if (left.IsConstant()) {
     compiler->EmitEqualityRegConstCompare(right.reg(),
                                           left.constant(),
-                                          needs_number_check());
+                                          needs_number_check(),
+                                          token_pos());
   } else if (right.IsConstant()) {
     compiler->EmitEqualityRegConstCompare(left.reg(),
                                           right.constant(),
-                                          needs_number_check());
+                                          needs_number_check(),
+                                          token_pos());
   } else {
     compiler->EmitEqualityRegRegCompare(left.reg(),
                                        right.reg(),
-                                       needs_number_check());
+                                       needs_number_check(),
+                                       token_pos());
   }
 
   Register result = locs()->out().reg();
@@ -2753,15 +2898,18 @@
   if (left.IsConstant()) {
     compiler->EmitEqualityRegConstCompare(right.reg(),
                                           left.constant(),
-                                          needs_number_check());
+                                          needs_number_check(),
+                                          token_pos());
   } else if (right.IsConstant()) {
     compiler->EmitEqualityRegConstCompare(left.reg(),
                                           right.constant(),
-                                          needs_number_check());
+                                          needs_number_check(),
+                                          token_pos());
   } else {
     compiler->EmitEqualityRegRegCompare(left.reg(),
                                         right.reg(),
-                                        needs_number_check());
+                                        needs_number_check(),
+                                        token_pos());
   }
 
   Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQ : NE;
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 6569c52..23b6241 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -119,7 +119,8 @@
 
 
 LocationSummary* LoadLocalInstr::MakeLocationSummary() const {
-  return LocationSummary::Make(0,
+  const intptr_t kNumInputs = 0;
+  return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -132,7 +133,8 @@
 
 
 LocationSummary* StoreLocalInstr::MakeLocationSummary() const {
-  return LocationSummary::Make(1,
+  const intptr_t kNumInputs = 1;
+  return LocationSummary::Make(kNumInputs,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
@@ -147,7 +149,8 @@
 
 
 LocationSummary* ConstantInstr::MakeLocationSummary() const {
-  return LocationSummary::Make(0,
+  const intptr_t kNumInputs = 0;
+  return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -294,9 +297,10 @@
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
+    // Only right can be a stack slot.
     locs->set_in(1, locs->in(0).IsConstant()
                         ? Location::RequiresRegister()
-                        : Location::RegisterOrConstant(right()));
+                        : Location::AnyOrConstant(right()));
     locs->set_out(Location::RequiresRegister());
     return locs;
   }
@@ -404,7 +408,7 @@
     __ LoadObject(ic_data_reg, equality_ic_data);
     compiler->GenerateCall(token_pos,
                            &StubCode::EqualityWithNullArgLabel(),
-                           PcDescriptors::kEqualNull,
+                           PcDescriptors::kRuntimeCall,
                            locs);
     __ Drop(2);
   }
@@ -640,6 +644,8 @@
     true_condition = FlowGraphCompiler::FlipCondition(true_condition);
   } else if (right.IsConstant()) {
     __ CompareObject(left.reg(), right.constant());
+  } else if (right.IsStackSlot()) {
+    __ cmpl(left.reg(), right.ToStackSlotAddress());
   } else {
     __ cmpl(left.reg(), right.reg());
   }
@@ -919,7 +925,7 @@
     // operands should be handled by constant propagation.
     summary->set_in(1, summary->in(0).IsConstant()
                            ? Location::RequiresRegister()
-                           : Location::RegisterOrConstant(right()));
+                           : Location::AnyOrConstant(right()));
     summary->set_out(Location::RequiresRegister());
     return summary;
   }
@@ -4370,15 +4376,18 @@
   if (left.IsConstant()) {
     compiler->EmitEqualityRegConstCompare(right.reg(),
                                           left.constant(),
-                                          needs_number_check());
+                                          needs_number_check(),
+                                          token_pos());
   } else if (right.IsConstant()) {
     compiler->EmitEqualityRegConstCompare(left.reg(),
                                           right.constant(),
-                                          needs_number_check());
+                                          needs_number_check(),
+                                          token_pos());
   } else {
     compiler->EmitEqualityRegRegCompare(left.reg(),
                                        right.reg(),
-                                       needs_number_check());
+                                       needs_number_check(),
+                                       token_pos());
   }
 
   Register result = locs()->out().reg();
@@ -4409,15 +4418,18 @@
   if (left.IsConstant()) {
     compiler->EmitEqualityRegConstCompare(right.reg(),
                                           left.constant(),
-                                          needs_number_check());
+                                          needs_number_check(),
+                                          token_pos());
   } else if (right.IsConstant()) {
     compiler->EmitEqualityRegConstCompare(left.reg(),
                                           right.constant(),
-                                          needs_number_check());
+                                          needs_number_check(),
+                                          token_pos());
   } else {
     compiler->EmitEqualityRegRegCompare(left.reg(),
                                         right.reg(),
-                                        needs_number_check());
+                                        needs_number_check(),
+                                        token_pos());
   }
 
   Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL;
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index f9e270b..5107f34 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -418,7 +418,7 @@
     // Pass left in A1 and right in A0.
     compiler->GenerateCall(token_pos,
                            &StubCode::EqualityWithNullArgLabel(),
-                           PcDescriptors::kEqualNull,
+                           PcDescriptors::kRuntimeCall,
                            locs);
   }
   __ Bind(&check_ne);
@@ -2738,15 +2738,18 @@
   if (left.IsConstant()) {
     compiler->EmitEqualityRegConstCompare(right.reg(),
                                           left.constant(),
-                                          needs_number_check());
+                                          needs_number_check(),
+                                          token_pos());
   } else if (right.IsConstant()) {
     compiler->EmitEqualityRegConstCompare(left.reg(),
                                           right.constant(),
-                                          needs_number_check());
+                                          needs_number_check(),
+                                          token_pos());
   } else {
     compiler->EmitEqualityRegRegCompare(left.reg(),
                                        right.reg(),
-                                       needs_number_check());
+                                       needs_number_check(),
+                                       token_pos());
   }
 
   Register result = locs()->out().reg();
@@ -2782,15 +2785,18 @@
   if (left.IsConstant()) {
     compiler->EmitEqualityRegConstCompare(right.reg(),
                                           left.constant(),
-                                          needs_number_check());
+                                          needs_number_check(),
+                                          token_pos());
   } else if (right.IsConstant()) {
     compiler->EmitEqualityRegConstCompare(left.reg(),
                                           right.constant(),
-                                          needs_number_check());
+                                          needs_number_check(),
+                                          token_pos());
   } else {
     compiler->EmitEqualityRegRegCompare(left.reg(),
                                         right.reg(),
-                                        needs_number_check());
+                                        needs_number_check(),
+                                        token_pos());
   }
 
   Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQ : NE;
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 88557a7..6cb751f 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -284,7 +284,8 @@
 
 
 LocationSummary* LoadLocalInstr::MakeLocationSummary() const {
-  return LocationSummary::Make(0,
+  const intptr_t kNumInputs = 0;
+  return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -297,7 +298,8 @@
 
 
 LocationSummary* StoreLocalInstr::MakeLocationSummary() const {
-  return LocationSummary::Make(1,
+  const intptr_t kNumInputs = 1;
+  return LocationSummary::Make(kNumInputs,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
@@ -312,7 +314,8 @@
 
 
 LocationSummary* ConstantInstr::MakeLocationSummary() const {
-  return LocationSummary::Make(0,
+  const intptr_t kNumInputs = 0;
+  return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -449,9 +452,10 @@
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
+    // Only right can be a stack slot.
     locs->set_in(1, locs->in(0).IsConstant()
                         ? Location::RequiresRegister()
-                        : Location::RegisterOrConstant(right()));
+                        : Location::AnyOrConstant(right()));
     locs->set_out(Location::RequiresRegister());
     return locs;
   }
@@ -559,7 +563,7 @@
     __ LoadObject(ic_data_reg, equality_ic_data);
     compiler->GenerateCall(token_pos,
                            &StubCode::EqualityWithNullArgLabel(),
-                           PcDescriptors::kEqualNull,
+                           PcDescriptors::kRuntimeCall,
                            locs);
     __ Drop(2);
   }
@@ -796,6 +800,8 @@
     true_condition = FlowGraphCompiler::FlipCondition(true_condition);
   } else if (right.IsConstant()) {
     __ CompareObject(left.reg(), right.constant());
+  } else if (right.IsStackSlot()) {
+    __ cmpq(left.reg(), right.ToStackSlotAddress());
   } else {
     __ cmpq(left.reg(), right.reg());
   }
@@ -949,7 +955,7 @@
     // operands should be handled by constant propagation.
     summary->set_in(1, summary->in(0).IsConstant()
                            ? Location::RequiresRegister()
-                           : Location::RegisterOrConstant(right()));
+                           : Location::AnyOrConstant(right()));
     summary->set_out(Location::RequiresRegister());
     return summary;
   }
@@ -4152,15 +4158,18 @@
   if (left.IsConstant()) {
     compiler->EmitEqualityRegConstCompare(right.reg(),
                                           left.constant(),
-                                          needs_number_check());
+                                          needs_number_check(),
+                                          token_pos());
   } else if (right.IsConstant()) {
     compiler->EmitEqualityRegConstCompare(left.reg(),
                                           right.constant(),
-                                          needs_number_check());
+                                          needs_number_check(),
+                                          token_pos());
   } else {
     compiler->EmitEqualityRegRegCompare(left.reg(),
                                        right.reg(),
-                                       needs_number_check());
+                                       needs_number_check(),
+                                       token_pos());
   }
 
   Register result = locs()->out().reg();
@@ -4191,15 +4200,18 @@
   if (left.IsConstant()) {
     compiler->EmitEqualityRegConstCompare(right.reg(),
                                           left.constant(),
-                                          needs_number_check());
+                                          needs_number_check(),
+                                          token_pos());
   } else if (right.IsConstant()) {
     compiler->EmitEqualityRegConstCompare(left.reg(),
                                           right.constant(),
-                                          needs_number_check());
+                                          needs_number_check(),
+                                          token_pos());
   } else {
     compiler->EmitEqualityRegRegCompare(left.reg(),
                                         right.reg(),
-                                        needs_number_check());
+                                        needs_number_check(),
+                                        token_pos());
   }
 
   Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL;
diff --git a/runtime/vm/intrinsifier.cc b/runtime/vm/intrinsifier.cc
index 068c817..f8f2542 100644
--- a/runtime/vm/intrinsifier.cc
+++ b/runtime/vm/intrinsifier.cc
@@ -92,10 +92,12 @@
 
 
 void Intrinsifier::InitializeState() {
-  Library& lib = Library::Handle();
-  Class& cls = Class::Handle();
-  Function& func = Function::Handle();
-  String& str = String::Handle();
+  Isolate* isolate = Isolate::Current();
+  Library& lib = Library::Handle(isolate);
+  Class& cls = Class::Handle(isolate);
+  Function& func = Function::Handle(isolate);
+  String& str = String::Handle(isolate);
+  Error& error = Error::Handle(isolate);
 
 #define SETUP_FUNCTION(class_name, function_name, destination, fp)             \
   if (strcmp(#class_name, "::") == 0) {                                        \
@@ -105,6 +107,8 @@
     str = String::New(#class_name);                                            \
     cls = lib.LookupClassAllowPrivate(str);                                    \
     ASSERT(!cls.IsNull());                                                     \
+    error = cls.EnsureIsFinalized(isolate);                                    \
+    ASSERT(error.IsNull());                                                    \
     if (#function_name[0] == '.') {                                            \
       str = String::New(#class_name#function_name);                            \
     } else {                                                                   \
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index ae6e05b..f455a0a 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -29,6 +29,7 @@
 #include "vm/heap.h"
 #include "vm/intermediate_language.h"
 #include "vm/intrinsifier.h"
+#include "vm/longjump.h"
 #include "vm/object_store.h"
 #include "vm/parser.h"
 #include "vm/runtime_entry.h"
@@ -363,6 +364,7 @@
     cls.set_id(Class::kClassId);
     cls.raw_ptr()->state_bits_ = 0;
     cls.set_is_finalized();
+    cls.set_is_type_finalized();
     cls.raw_ptr()->type_arguments_field_offset_in_words_ =
         Class::kNoTypeArguments;
     cls.raw_ptr()->num_native_fields_ = 0;
@@ -373,11 +375,13 @@
   // Allocate and initialize the null class.
   cls = Class::New<Instance>(kNullCid);
   cls.set_is_finalized();
+  cls.set_is_type_finalized();
   null_class_ = cls.raw();
 
   // Allocate and initialize the free list element class.
   cls = Class::New<FreeListElement::FakeInstance>(kFreeListElement);
   cls.set_is_finalized();
+  cls.set_is_type_finalized();
 
   // Allocate and initialize the sentinel values of Null class.
   {
@@ -398,6 +402,7 @@
 
   cls = Class::New<Instance>(kDynamicCid);
   cls.set_is_finalized();
+  cls.set_is_type_finalized();
   cls.set_is_abstract();
   dynamic_class_ = cls.raw();
 
@@ -407,6 +412,7 @@
 
   cls = Class::New<Instance>(kVoidCid);
   cls.set_is_finalized();
+  cls.set_is_type_finalized();
   void_class_ = cls.raw();
 
   cls = Class::New<TypeArguments>();
@@ -994,6 +1000,7 @@
   cls = Class::New<Instance>(kIllegalCid);
   cls.set_is_prefinalized();
   RegisterClass(cls, name, core_lib);
+  cls.set_is_prefinalized();
   pending_classes.Add(cls, Heap::kOld);
   type = Type::NewNonParameterizedType(cls);
   object_store->set_string_type(type);
@@ -1543,7 +1550,7 @@
 
 
 void Class::set_state_bits(intptr_t bits) const {
-  raw_ptr()->state_bits_ = static_cast<uint8_t>(bits);
+  raw_ptr()->state_bits_ = static_cast<uint16_t>(bits);
 }
 
 
@@ -1558,12 +1565,11 @@
 
 
 intptr_t Class::NumTypeParameters() const {
-  const TypeArguments& type_params = TypeArguments::Handle(type_parameters());
-  if (type_params.IsNull()) {
+  if (type_parameters() == TypeArguments::null()) {
     return 0;
-  } else {
-    return type_params.Length();
   }
+  const TypeArguments& type_params = TypeArguments::Handle(type_parameters());
+  return type_params.Length();
 }
 
 
@@ -1579,17 +1585,17 @@
     }
   }
   intptr_t num_type_args = NumTypeParameters();
-  const Class& superclass = Class::Handle(cls.SuperClass());
+  cls = cls.SuperClass();
   // Object is its own super class during bootstrap.
-  if (!superclass.IsNull() && (superclass.raw() != raw())) {
-    num_type_args += superclass.NumTypeArguments();
+  if (!cls.IsNull() && (cls.raw() != raw())) {
+    num_type_args += cls.NumTypeArguments();
   }
   return num_type_args;
 }
 
 
 bool Class::HasTypeArguments() const {
-  if (!IsSignatureClass() && (is_finalized() || is_prefinalized())) {
+  if (!IsSignatureClass() && (is_type_finalized() || is_prefinalized())) {
     // More efficient than calling NumTypeArguments().
     return type_arguments_field_offset() != kNoTypeArguments;
   } else {
@@ -1783,6 +1789,22 @@
 }
 
 
+// Ensure that top level parsing of the class has been done.
+RawError* Class::EnsureIsFinalized(Isolate* isolate) const {
+  // Finalized classes have already been parsed.
+  if (is_finalized()) {
+    return Error::null();
+  }
+  ASSERT(isolate != NULL);
+  const Error& error = Error::Handle(isolate, Compiler::CompileClass(*this));
+  if (!error.IsNull() && (isolate->long_jump_base() != NULL)) {
+    isolate->long_jump_base()->Jump(1, error);
+    UNREACHABLE();
+  }
+  return error.raw();
+}
+
+
 void Class::SetFields(const Array& value) const {
   ASSERT(!value.IsNull());
 #if defined(DEBUG)
@@ -1848,6 +1870,7 @@
   result.set_instance_size(Closure::InstanceSize());
   result.set_next_field_offset(Closure::InstanceSize());
   result.set_super_type(super_type);
+  result.set_is_synthesized_class();
   result.set_type_arguments_field_offset(Closure::type_arguments_offset());
   // Implements interface "Function".
   const Type& function_type = Type::Handle(Type::Function());
@@ -1908,6 +1931,7 @@
     cls.set_next_field_offset(instance_size);
     cls.set_num_native_fields(field_count);
     cls.set_is_finalized();
+    cls.set_is_type_finalized();
     library.AddClass(cls);
     return cls.raw();
   } else {
@@ -1994,6 +2018,21 @@
 }
 
 
+void Class::set_is_type_finalized() const {
+  set_state_bits(TypeFinalizedBit::update(true, raw_ptr()->state_bits_));
+}
+
+
+void Class::set_is_patch() const {
+  set_state_bits(PatchBit::update(true, raw_ptr()->state_bits_));
+}
+
+
+void Class::set_is_synthesized_class() const {
+  set_state_bits(SynthesizedClassBit::update(true, raw_ptr()->state_bits_));
+}
+
+
 void Class::set_is_const() const {
   set_state_bits(ConstBit::update(true, raw_ptr()->state_bits_));
 }
@@ -2013,6 +2052,16 @@
 }
 
 
+void Class::set_is_marked_for_parsing() const {
+  set_state_bits(MarkedForParsingBit::update(true, raw_ptr()->state_bits_));
+}
+
+
+void Class::reset_is_marked_for_parsing() const {
+  set_state_bits(MarkedForParsingBit::update(false, raw_ptr()->state_bits_));
+}
+
+
 void Class::set_interfaces(const Array& value) const {
   // Verification and resolving of interfaces occurs in finalizer.
   ASSERT(!value.IsNull());
@@ -2027,6 +2076,12 @@
 }
 
 
+void Class::set_patch_class(const Class& cls) const {
+  ASSERT(patch_class() == Class::null());
+  StorePointer(&raw_ptr()->patch_class_, cls.raw());
+}
+
+
 void Class::AddDirectSubclass(const Class& subclass) const {
   ASSERT(!subclass.IsNull());
   ASSERT(subclass.SuperClass() == raw());
@@ -2342,6 +2397,9 @@
 
 RawFunction* Class::LookupFunction(const String& name) const {
   Isolate* isolate = Isolate::Current();
+  if (EnsureIsFinalized(isolate) != Error::null()) {
+    return Function::null();
+  }
   Array& funcs = Array::Handle(isolate, functions());
   if (funcs.IsNull()) {
     // This can occur, e.g., for Null classes.
@@ -2375,6 +2433,9 @@
 
 RawFunction* Class::LookupFunctionAllowPrivate(const String& name) const {
   Isolate* isolate = Isolate::Current();
+  if (EnsureIsFinalized(isolate) != Error::null()) {
+    return Function::null();
+  }
   Array& funcs = Array::Handle(isolate, functions());
   if (funcs.IsNull()) {
     // This can occur, e.g., for Null classes.
@@ -2409,6 +2470,9 @@
                                            intptr_t prefix_length,
                                            const String& name) const {
   Isolate* isolate = Isolate::Current();
+  if (EnsureIsFinalized(isolate) != Error::null()) {
+    return Function::null();
+  }
   Array& funcs = Array::Handle(isolate, functions());
   Function& function = Function::Handle(isolate, Function::null());
   String& function_name = String::Handle(isolate, String::null());
@@ -2429,12 +2493,16 @@
 RawFunction* Class::LookupFunctionAtToken(intptr_t token_pos) const {
   // TODO(hausner): we can shortcut the negative case if we knew the
   // beginning and end token position of the class.
-  Function& func = Function::Handle();
+  Isolate* isolate = Isolate::Current();
+  if (EnsureIsFinalized(isolate) != Error::null()) {
+    return Function::null();
+  }
+  Function& func = Function::Handle(isolate);
   func = LookupClosureFunction(token_pos);
   if (!func.IsNull()) {
     return func.raw();
   }
-  Array& funcs = Array::Handle(functions());
+  Array& funcs = Array::Handle(isolate, functions());
   intptr_t len = funcs.Length();
   for (intptr_t i = 0; i < len; i++) {
     func ^= funcs.At(i);
@@ -2449,8 +2517,12 @@
 
 
 RawField* Class::LookupInstanceField(const String& name) const {
+  Isolate* isolate = Isolate::Current();
+  if (EnsureIsFinalized(isolate) != Error::null()) {
+    return Field::null();
+  }
   ASSERT(is_finalized());
-  const Field& field = Field::Handle(LookupField(name));
+  const Field& field = Field::Handle(isolate, LookupField(name));
   if (!field.IsNull()) {
     if (field.is_static()) {
       // Name matches but it is not of the correct kind, return NULL.
@@ -2464,8 +2536,12 @@
 
 
 RawField* Class::LookupStaticField(const String& name) const {
+  Isolate* isolate = Isolate::Current();
+  if (EnsureIsFinalized(isolate) != Error::null()) {
+    return Field::null();
+  }
   ASSERT(is_finalized());
-  const Field& field = Field::Handle(LookupField(name));
+  const Field& field = Field::Handle(isolate, LookupField(name));
   if (!field.IsNull()) {
     if (!field.is_static()) {
       // Name matches but it is not of the correct kind, return NULL.
@@ -2480,6 +2556,9 @@
 
 RawField* Class::LookupField(const String& name) const {
   Isolate* isolate = Isolate::Current();
+  if (EnsureIsFinalized(isolate) != Error::null()) {
+    return Field::null();
+  }
   const Array& flds = Array::Handle(isolate, fields());
   Field& field = Field::Handle(isolate, Field::null());
   String& field_name = String::Handle(isolate, String::null());
@@ -3340,6 +3419,11 @@
 }
 
 
+void Function::set_deopt_history(const Array& value) const {
+  StorePointer(&raw_ptr()->deopt_history_, value.raw());
+}
+
+
 RawContextScope* Function::context_scope() const {
   if (IsClosureFunction()) {
     const Object& obj = Object::Handle(raw_ptr()->data_);
@@ -3841,8 +3925,9 @@
     return false;
   }
   // Verify that all argument names are valid parameter names.
-  String& argument_name = String::Handle();
-  String& parameter_name = String::Handle();
+  Isolate* isolate = Isolate::Current();
+  String& argument_name = String::Handle(isolate);
+  String& parameter_name = String::Handle(isolate);
   for (int i = 0; i < num_named_arguments; i++) {
     argument_name ^= argument_names.At(i);
     ASSERT(argument_name.IsSymbol());
@@ -4672,10 +4757,7 @@
 
 
 RawString* Field::GetterName(const String& field_name) {
-  String& str = String::Handle();
-  str = String::New(kGetterPrefix);
-  str = String::Concat(str, field_name);
-  return str.raw();
+  return String::Concat(Symbols::GetterPrefix(), field_name);
 }
 
 
@@ -4686,10 +4768,7 @@
 
 
 RawString* Field::SetterName(const String& field_name) {
-  String& str = String::Handle();
-  str = String::New(kSetterPrefix);
-  str = String::Concat(str, field_name);
-  return str.raw();
+  return String::Concat(Symbols::SetterPrefix(), field_name);
 }
 
 
@@ -4700,26 +4779,22 @@
 
 
 RawString* Field::NameFromGetter(const String& getter_name) {
-  String& str = String::Handle();
-  str = String::SubString(getter_name, strlen(kGetterPrefix));
-  return str.raw();
+  return String::SubString(getter_name, strlen(kGetterPrefix));
 }
 
 
 RawString* Field::NameFromSetter(const String& setter_name) {
-  String& str = String::Handle();
-  str = String::SubString(setter_name, strlen(kSetterPrefix));
-  return str.raw();
+  return String::SubString(setter_name, strlen(kSetterPrefix));
 }
 
 
 bool Field::IsGetterName(const String& function_name) {
-  return function_name.StartsWith(String::Handle(String::New(kGetterPrefix)));
+  return function_name.StartsWith(Symbols::GetterPrefix());
 }
 
 
 bool Field::IsSetterName(const String& function_name) {
-  return function_name.StartsWith(String::Handle(String::New(kSetterPrefix)));
+  return function_name.StartsWith(Symbols::SetterPrefix());
 }
 
 
@@ -6088,32 +6163,6 @@
 }
 
 
-RawFunction* Library::LookupFunctionInSource(const String& script_url,
-                                             intptr_t line_number) const {
-  Script& script = Script::Handle(LookupScript(script_url));
-  if (script.IsNull()) {
-    // The given script url is not loaded into this library.
-    return Function::null();
-  }
-
-  // Determine token position at given line number.
-  intptr_t first_token_pos, last_token_pos;
-  script.TokenRangeAtLine(line_number, &first_token_pos, &last_token_pos);
-  if (first_token_pos < 0) {
-    // Script does not contain the given line number.
-    return Function::null();
-  }
-  Function& func = Function::Handle();
-  for (intptr_t pos = first_token_pos; pos <= last_token_pos; pos++) {
-    func = LookupFunctionInScript(script, pos);
-    if (!func.IsNull()) {
-      return func.raw();
-    }
-  }
-  return Function::null();
-}
-
-
 RawFunction* Library::LookupFunctionInScript(const Script& script,
                                              intptr_t token_pos) const {
   Class& cls = Class::Handle();
@@ -6896,6 +6945,10 @@
     ClassDictionaryIterator it(lib);
     while (it.HasNext()) {
       cls = it.GetNextClass();
+      error = cls.EnsureIsFinalized(Isolate::Current());
+      if (!error.IsNull()) {
+        return error.raw();
+      }
       error = Compiler::CompileAllFunctions(cls);
       if (!error.IsNull()) {
         return error.raw();
@@ -7109,7 +7162,7 @@
     case PcDescriptors::kFuncCall:      return "fn-call      ";
     case PcDescriptors::kClosureCall:   return "closure-call ";
     case PcDescriptors::kReturn:        return "return       ";
-    case PcDescriptors::kEqualNull:     return "equal-null   ";
+    case PcDescriptors::kRuntimeCall:   return "runtime-call ";
     case PcDescriptors::kOther:         return "other        ";
   }
   UNREACHABLE();
@@ -8506,6 +8559,9 @@
                               count);
     }
   }
+  // Copy deoptimization reason.
+  result.set_deopt_reason(this->deopt_reason());
+
   return result.raw();
 }
 
@@ -9180,7 +9236,11 @@
 
 
 RawInstance* Instance::New(const Class& cls, Heap::Space space) {
-  Instance& result = Instance::Handle();
+  Isolate* isolate = Isolate::Current();
+  if (cls.EnsureIsFinalized(isolate) != Error::null()) {
+    return Instance::null();
+  }
+  Instance& result = Instance::Handle(isolate);
   {
     intptr_t instance_size = cls.instance_size();
     ASSERT(instance_size > 0);
@@ -9384,7 +9444,7 @@
     } else {
       // The actual type argument vector can be longer than necessary, because
       // of type optimizations.
-      if (IsFinalized() && cls.is_finalized()) {
+      if (IsFinalized() && cls.is_type_finalized()) {
         first_type_param_index = cls.NumTypeArguments() - num_type_params;
       } else {
         first_type_param_index = num_args - num_type_params;
@@ -10386,6 +10446,15 @@
 }
 
 
+RawInteger* Integer::NewFromUint64(uint64_t value, Heap::Space space) {
+  if (value > static_cast<uint64_t>(Mint::kMaxValue)) {
+    return BigintOperations::NewFromUint64(value);
+  } else {
+    return Integer::New(value);
+  }
+}
+
+
 double Integer::AsDoubleValue() const {
   UNIMPLEMENTED();
   return 0.0;
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 755262e..480ce5b 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -605,6 +605,7 @@
   void set_script(const Script& value) const;
 
   intptr_t token_pos() const { return raw_ptr()->token_pos_; }
+  void set_token_pos(intptr_t value) const;
 
   // This class represents the signature class of a closure function if
   // signature_function() is not null.
@@ -652,7 +653,7 @@
   // If this class is parameterized, each instance has a type_arguments field.
   static const intptr_t kNoTypeArguments = -1;
   intptr_t type_arguments_field_offset() const {
-    ASSERT(is_finalized() || is_prefinalized());
+    ASSERT(is_type_finalized() || is_prefinalized());
     if (raw_ptr()->type_arguments_field_offset_in_words_ == kNoTypeArguments) {
       return kNoTypeArguments;
     }
@@ -690,6 +691,11 @@
   RawType* mixin() const { return raw_ptr()->mixin_; }
   void set_mixin(const Type& value) const;
 
+  RawClass* patch_class() const {
+    return raw_ptr()->patch_class_;
+  }
+  void set_patch_class(const Class& patch_class) const;
+
   // Interfaces is an array of Types.
   RawArray* interfaces() const { return raw_ptr()->interfaces_; }
   void set_interfaces(const Array& value) const;
@@ -808,6 +814,21 @@
   }
   void set_is_abstract() const;
 
+  bool is_type_finalized() const {
+    return TypeFinalizedBit::decode(raw_ptr()->state_bits_);
+  }
+  void set_is_type_finalized() const;
+
+  bool is_patch() const {
+    return PatchBit::decode(raw_ptr()->state_bits_);
+  }
+  void set_is_patch() const;
+
+  bool is_synthesized_class() const {
+    return SynthesizedClassBit::decode(raw_ptr()->state_bits_);
+  }
+  void set_is_synthesized_class() const;
+
   bool is_finalized() const {
     return StateBits::decode(raw_ptr()->state_bits_) == RawClass::kFinalized;
   }
@@ -819,6 +840,12 @@
 
   void set_is_prefinalized() const;
 
+  bool is_marked_for_parsing() const {
+    return MarkedForParsingBit::decode(raw_ptr()->state_bits_);
+  }
+  void set_is_marked_for_parsing() const;
+  void reset_is_marked_for_parsing() const;
+
   bool is_const() const { return ConstBit::decode(raw_ptr()->state_bits_); }
   void set_is_const() const;
 
@@ -843,6 +870,8 @@
 
   const char* ApplyPatch(const Class& patch) const;
 
+  RawError* EnsureIsFinalized(Isolate* isolate) const;
+
   // Allocate a class used for VM internal objects.
   template <class FakeObject> static RawClass* New();
 
@@ -888,20 +917,27 @@
 
  private:
   enum {
-    kConstBit = 1,
-    kImplementedBit = 2,
-    kAbstractBit = 3,
-    kStateTagBit = 4,
+    kConstBit = 0,
+    kImplementedBit = 1,
+    kAbstractBit = 2,
+    kPatchBit = 3,
+    kSynthesizedClassBit = 4,
+    kTypeFinalizedBit = 5,
+    kStateTagBit = 6,
     kStateTagSize = 2,
+    kMarkedForParsingBit = 8,
   };
   class ConstBit : public BitField<bool, kConstBit, 1> {};
   class ImplementedBit : public BitField<bool, kImplementedBit, 1> {};
   class AbstractBit : public BitField<bool, kAbstractBit, 1> {};
+  class PatchBit : public BitField<bool, kPatchBit, 1> {};
+  class SynthesizedClassBit : public BitField<bool, kSynthesizedClassBit, 1> {};
+  class TypeFinalizedBit : public BitField<bool, kTypeFinalizedBit, 1> {};
   class StateBits : public BitField<RawClass::ClassState,
                                     kStateTagBit, kStateTagSize> {};  // NOLINT
+  class MarkedForParsingBit : public BitField<bool, kMarkedForParsingBit, 1> {};
 
   void set_name(const String& value) const;
-  void set_token_pos(intptr_t value) const;
   void set_signature_function(const Function& value) const;
   void set_signature_type(const AbstractType& value) const;
   void set_class_state(RawClass::ClassState state) const;
@@ -1278,6 +1314,9 @@
   static intptr_t code_offset() { return OFFSET_OF(RawFunction, code_); }
   inline bool HasCode() const;
 
+  RawArray* deopt_history() const { return raw_ptr()->deopt_history_; }
+  void set_deopt_history(const Array& value) const;
+
   // Returns true if there is at least one debugger breakpoint
   // set in this function.
   bool HasBreakpoint() const;
@@ -2163,8 +2202,6 @@
   RawLibrary* ImportLibraryAt(intptr_t index) const;
   bool ImportsCorelib() const;
 
-  RawFunction* LookupFunctionInSource(const String& script_url,
-                                      intptr_t line_number) const;
   RawFunction* LookupFunctionInScript(const Script& script,
                                       intptr_t token_pos) const;
 
@@ -2440,8 +2477,8 @@
     kIcCall,           // IC call.
     kFuncCall,         // Call to known target, e.g. static call.
     kClosureCall,      // Closure call.
+    kRuntimeCall,      // Runtime call.
     kReturn,           // Return from function.
-    kEqualNull,        // Stub for comparison with null.
     kOther
   };
 
@@ -3921,6 +3958,8 @@
 class Integer : public Number {
  public:
   static RawInteger* New(const String& str, Heap::Space space = Heap::kNew);
+  static RawInteger* NewFromUint64(
+      uint64_t value, Heap::Space space = Heap::kNew);
 
   // Returns a canonical Integer object allocated in the old gen space.
   static RawInteger* NewCanonical(const String& str);
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 29ae58d..4a6ce55 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -15,12 +15,20 @@
 
 namespace dart {
 
+static RawClass* CreateDummyClass(const String& class_name,
+                                  const Script& script) {
+  const Class& cls = Class::Handle(
+      Class::New(class_name, script, Scanner::kDummyTokenIndex));
+  cls.set_is_synthesized_class();  // Dummy class for testing.
+  return cls.raw();
+}
+
+
 TEST_CASE(Class) {
   // Allocate the class first.
   const String& class_name = String::Handle(Symbols::New("MyClass"));
   const Script& script = Script::Handle();
-  const Class& cls = Class::Handle(
-      Class::New(class_name, script, Scanner::kDummyTokenIndex));
+  const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
 
   // Class has no fields.
   cls.SetFields(Object::empty_array());
@@ -70,8 +78,20 @@
       true, false, false, false, cls, 0);
   functions.SetAt(5, function);
 
-  // Setup the functions in the class.
+  // Setup the functions and interfaces in the class.
   cls.SetFunctions(functions);
+  const Array& interfaces = Array::Handle(Array::New(2));
+  Class& interface = Class::Handle();
+  String& interface_name = String::Handle();
+  interface_name = Symbols::New("Harley");
+  interface = CreateDummyClass(interface_name, script);
+  interfaces.SetAt(0, Type::Handle(Type::NewNonParameterizedType(interface)));
+  interface_name = Symbols::New("Norton");
+  interface = CreateDummyClass(interface_name, script);
+  interfaces.SetAt(1, Type::Handle(Type::NewNonParameterizedType(interface)));
+  cls.set_interfaces(interfaces);
+  ClassFinalizer::FinalizeTypesInClass(cls);
+  cls.Finalize();
 
   function_name = String::New("Foo");
   function = cls.LookupDynamicFunction(function_name);
@@ -101,18 +121,6 @@
   EXPECT(!function.IsNull());
   EXPECT_EQ(kNumFixedParameters, function.num_fixed_parameters());
   EXPECT_EQ(kNumOptionalParameters, function.NumOptionalParameters());
-
-  const Array& interfaces = Array::Handle(Array::New(2));
-  Class& interface = Class::Handle();
-  String& interface_name = String::Handle();
-  interface_name = Symbols::New("Harley");
-  interface = Class::New(interface_name, script, Scanner::kDummyTokenIndex);
-  interfaces.SetAt(0, Type::Handle(Type::NewNonParameterizedType(interface)));
-  interface_name = Symbols::New("Norton");
-  interface = Class::New(interface_name, script, Scanner::kDummyTokenIndex);
-  interfaces.SetAt(1, Type::Handle(Type::NewNonParameterizedType(interface)));
-  cls.set_interfaces(interfaces);
-  cls.Finalize();
 }
 
 
@@ -165,10 +173,11 @@
   String& class_name = String::Handle(Symbols::New("EmptyClass"));
   Script& script = Script::Handle();
   const Class& empty_class =
-      Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex));
+      Class::Handle(CreateDummyClass(class_name, script));
 
   // No functions and no super class for the EmptyClass.
   empty_class.SetFields(Object::empty_array());
+  ClassFinalizer::FinalizeTypesInClass(empty_class);
   empty_class.Finalize();
   EXPECT_EQ(kObjectAlignment, empty_class.instance_size());
   Instance& instance = Instance::Handle(Instance::New(empty_class));
@@ -176,7 +185,7 @@
 
   class_name = Symbols::New("OneFieldClass");
   const Class& one_field_class =
-      Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex));
+      Class::Handle(CreateDummyClass(class_name, script));
 
   // No functions and no super class for the OneFieldClass.
   const Array& one_fields = Array::Handle(Array::New(1));
@@ -185,6 +194,7 @@
        Field::New(field_name, false, false, false, one_field_class, 0));
   one_fields.SetAt(0, field);
   one_field_class.SetFields(one_fields);
+  ClassFinalizer::FinalizeTypesInClass(one_field_class);
   one_field_class.Finalize();
   intptr_t header_size = sizeof(RawObject);
   EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment),
@@ -2173,8 +2183,7 @@
   // Allocate the class first.
   const String& class_name = String::Handle(Symbols::New("MyClass"));
   const Script& script = Script::Handle();
-  const Class& cls =
-      Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex));
+  const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
   const Array& functions = Array::Handle(Array::New(1));
 
   const Context& context = Context::Handle(Context::New(0));
@@ -2248,7 +2257,7 @@
   const String& class_name = String::Handle(Symbols::New("ownerClass"));
   const Script& script = Script::Handle();
   const Class& owner_class =
-      Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex));
+      Class::Handle(CreateDummyClass(class_name, script));
   const String& function_name = String::ZoneHandle(Symbols::New(name));
   Function& function = Function::ZoneHandle(
       Function::New(function_name, RawFunction::kRegularFunction,
@@ -2420,7 +2429,7 @@
 static RawClass* CreateTestClass(const char* name) {
   const String& class_name = String::Handle(Symbols::New(name));
   const Class& cls = Class::Handle(
-      Class::New(class_name, Script::Handle(), Scanner::kDummyTokenIndex));
+      CreateDummyClass(class_name, Script::Handle()));
   return cls.raw();
 }
 
@@ -2460,7 +2469,7 @@
 static RawFunction* GetDummyTarget(const char* name) {
   const String& function_name = String::Handle(Symbols::New(name));
   const Class& cls = Class::Handle(
-       Class::New(function_name, Script::Handle(), Scanner::kDummyTokenIndex));
+       CreateDummyClass(function_name, Script::Handle()));
   const bool is_static = false;
   const bool is_const = false;
   const bool is_abstract = false;
@@ -2533,7 +2542,7 @@
   String& class_name = String::Handle(Symbols::New("EmptyClass"));
   Script& script = Script::Handle();
   const Class& empty_class =
-      Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex));
+      Class::Handle(CreateDummyClass(class_name, script));
   SubtypeTestCache& cache = SubtypeTestCache::Handle(SubtypeTestCache::New());
   ASSERT(!cache.IsNull());
   EXPECT_EQ(0, cache.NumberOfChecks());
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 2628ce3..f396f3b 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -261,9 +261,9 @@
 
 
 // For parsing a compilation unit.
-Parser::Parser(const Script& script, const Library& library)
+Parser::Parser(const Script& script, const Library& library, intptr_t token_pos)
     : script_(Script::Handle(script.raw())),
-      tokens_iterator_(TokenStream::Handle(script.tokens()), 0),
+      tokens_iterator_(TokenStream::Handle(script.tokens()), token_pos),
       token_kind_(Token::kILLEGAL),
       current_block_(NULL),
       is_top_level_(false),
@@ -352,7 +352,7 @@
                                   const Script& script) {
   ASSERT(Isolate::Current()->long_jump_base()->IsSafeToJump());
   TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
-  Parser parser(script, library);
+  Parser parser(script, library, 0);
   parser.ParseTopLevel();
 }
 
@@ -737,6 +737,19 @@
 }
 
 
+void Parser::ParseClass(const Class& cls) {
+  if (!cls.is_synthesized_class()) {
+    TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
+    Isolate* isolate = Isolate::Current();
+    ASSERT(isolate->long_jump_base()->IsSafeToJump());
+    const Script& script = Script::Handle(isolate, cls.script());
+    const Library& lib = Library::Handle(isolate, cls.library());
+    Parser parser(script, lib, cls.token_pos());
+    parser.ParseClassDefinition(cls);
+  }
+}
+
+
 void Parser::ParseFunction(ParsedFunction* parsed_function) {
   TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
   Isolate* isolate = Isolate::Current();
@@ -3201,8 +3214,8 @@
 }
 
 
-void Parser::ParseClassDefinition(const GrowableObjectArray& pending_classes) {
-  TRACE_PARSER("ParseClassDefinition");
+void Parser::ParseClassDeclaration(const GrowableObjectArray& pending_classes) {
+  TRACE_PARSER("ParseClassDeclaration");
   bool is_patch = false;
   bool is_abstract = false;
   if (is_patch_source() &&
@@ -3214,7 +3227,6 @@
     is_abstract = true;
     ConsumeToken();
   }
-  const intptr_t class_pos = TokenPos();
   ExpectToken(Token::kCLASS);
   const intptr_t classname_pos = TokenPos();
   String& class_name = *ExpectUserDefinedTypeIdentifier("class name expected");
@@ -3257,6 +3269,7 @@
       }
       // Pre-registered classes need their scripts connected at this time.
       cls.set_script(script_);
+      cls.set_token_pos(classname_pos);
     }
   }
   ASSERT(!cls.IsNull());
@@ -3328,24 +3341,50 @@
     ParseInterfaceList(cls);
   }
 
-  ExpectToken(Token::kLBRACE);
+  if (is_abstract) {
+    cls.set_is_abstract();
+  }
+  if (is_patch) {
+    // Apply the changes to the patched class looked up above.
+    ASSERT(obj.raw() == library_.LookupLocalObject(class_name));
+    // The patched class must not be finalized yet.
+    const Class& orig_class = Class::Cast(obj);
+    ASSERT(!orig_class.is_finalized());
+    orig_class.set_patch_class(cls);
+    cls.set_is_patch();
+  }
+  pending_classes.Add(cls, Heap::kOld);
+
+  if (CurrentToken() != Token::kLBRACE) {
+    ErrorMsg("{ expected");
+  }
+  SkipBlock();
+}
+
+
+void Parser::ParseClassDefinition(const Class& cls) {
+  TRACE_PARSER("ParseClassDefinition");
+  set_current_class(cls);
+  is_top_level_ = true;
+  String& class_name = String::Handle(cls.Name());
+  const intptr_t class_pos = TokenPos();
   ClassDesc members(cls, class_name, false, class_pos);
+  while (CurrentToken() != Token::kLBRACE) {
+    ConsumeToken();
+  }
+  ExpectToken(Token::kLBRACE);
   while (CurrentToken() != Token::kRBRACE) {
     SkipMetadata();
     ParseClassMemberDefinition(&members);
   }
   ExpectToken(Token::kRBRACE);
 
-  if (is_abstract) {
-    cls.set_is_abstract();
-  }
-
   CheckConstructors(&members);
 
   // Need to compute this here since MakeArray() will clear the
   // functions array in members.
   const bool need_implicit_constructor =
-      !members.has_constructor() && !is_patch;
+      !members.has_constructor() && !cls.is_patch();
 
   Array& array = Array::Handle();
   array = Array::MakeArray(members.fields());
@@ -3361,16 +3400,15 @@
     AddImplicitConstructor(cls);
   }
 
-  if (!is_patch) {
-    pending_classes.Add(cls, Heap::kOld);
-  } else {
+  if (cls.is_patch()) {
     // Apply the changes to the patched class looked up above.
-    ASSERT(obj.raw() == library_.LookupLocalObject(class_name));
+    Object& obj = Object::Handle(library_.LookupLocalObject(class_name));
     // The patched class must not be finalized yet.
-    ASSERT(!Class::Cast(obj).is_finalized());
-    const char* err_msg = Class::Cast(obj).ApplyPatch(cls);
+    const Class& orig_class = Class::Cast(obj);
+    ASSERT(!orig_class.is_finalized());
+    const char* err_msg = orig_class.ApplyPatch(cls);
     if (err_msg != NULL) {
-      ErrorMsg(classname_pos, "applying patch failed with '%s'", err_msg);
+      ErrorMsg(class_pos, "applying patch failed with '%s'", err_msg);
     }
   }
 }
@@ -3495,6 +3533,7 @@
   // TODO(hausner): treat the mixin application as an alias, not as a base
   // class whose super class is the mixin application!
   mixin_application.set_super_type(type);
+  mixin_application.set_is_synthesized_class();
 
   AddImplicitConstructor(mixin_application);
   if (CurrentToken() == Token::kIMPLEMENTS) {
@@ -3903,6 +3942,7 @@
     mixin_application.set_super_type(mixin_super_type);
     mixin_application.set_mixin(Type::Cast(mixin_type));
     mixin_application.set_library(library_);
+    mixin_application.set_is_synthesized_class();
     AddImplicitConstructor(mixin_application);
     // Add the mixin type to the interfaces that the mixin application
     // class implements. This is necessary so that type tests work.
@@ -4487,17 +4527,17 @@
     set_current_class(Class::Handle());  // No current class.
     SkipMetadata();
     if (CurrentToken() == Token::kCLASS) {
-      ParseClassDefinition(pending_classes);
+      ParseClassDeclaration(pending_classes);
     } else if ((CurrentToken() == Token::kTYPEDEF) &&
                (LookaheadToken(1) != Token::kLPAREN)) {
       set_current_class(toplevel_class);
       ParseTypedef(pending_classes);
     } else if ((CurrentToken() == Token::kABSTRACT) &&
         (LookaheadToken(1) == Token::kCLASS)) {
-      ParseClassDefinition(pending_classes);
+      ParseClassDeclaration(pending_classes);
     } else if (is_patch_source() && IsLiteral("patch") &&
                (LookaheadToken(1) == Token::kCLASS)) {
-      ParseClassDefinition(pending_classes);
+      ParseClassDeclaration(pending_classes);
     } else {
       set_current_class(toplevel_class);
       if (IsVariableDeclaration()) {
@@ -8023,7 +8063,7 @@
   }
   Type& type = Type::ZoneHandle(
       Type::New(current_class(), type_arguments, type_pos));
-  if (!is_top_level_) {
+  if (!is_top_level_ || current_class().is_type_finalized()) {
     type ^= ClassFinalizer::FinalizeType(
         current_class(), type, ClassFinalizer::kCanonicalizeWellFormed);
   }
@@ -8347,15 +8387,13 @@
     Namespace& import = Namespace::Handle();
     intptr_t num_imports = library_.num_imports();
     Object& imported_obj = Object::Handle();
+    Library& lib = Library::Handle();
     for (int i = 0; i < num_imports; i++) {
       import = library_.ImportAt(i);
       imported_obj = LookupNameInImport(import, name);
       if (!imported_obj.IsNull()) {
-        const Library& lib = Library::Handle(import.library());
-        // TODO(8474): Remove the "Expect" special casing.
-        if (!first_lib_url.IsNull()
-            && (strcmp(name.ToCString(), "Expect") != 0)
-            && (strcmp(name.ToCString(), "ExpectException") != 0)) {
+        lib ^= import.library();
+        if (!first_lib_url.IsNull()) {
           // Found duplicate definition.
           Error& ambiguous_ref_error = Error::Handle();
           if (first_lib_url.raw() == lib.url()) {
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 732cb8c..b7310eb 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -143,14 +143,14 @@
 
 class Parser : public ValueObject {
  public:
-  Parser(const Script& script, const Library& library);
-  Parser(const Script& script, ParsedFunction* function, intptr_t token_pos);
-
   // Parse the top level of a whole script file and register declared classes
   // in the given library.
   static void ParseCompilationUnit(const Library& library,
                                    const Script& script);
 
+  // Parse top level of a class and register all functions/fields.
+  static void ParseClass(const Class& cls);
+
   static void ParseFunction(ParsedFunction* parsed_function);
 
   // Format and print a message with source location.
@@ -185,6 +185,9 @@
   struct Block;
   class TryBlocks;
 
+  Parser(const Script& script, const Library& library, intptr_t token_pos);
+  Parser(const Script& script, ParsedFunction* function, intptr_t token_pos);
+
   // The function for which we will generate code.
   const Function& current_function() const;
 
@@ -332,7 +335,8 @@
 
   // Support for parsing of scripts.
   void ParseTopLevel();
-  void ParseClassDefinition(const GrowableObjectArray& pending_classes);
+  void ParseClassDeclaration(const GrowableObjectArray& pending_classes);
+  void ParseClassDefinition(const Class& cls);
   void ParseMixinTypedef(const GrowableObjectArray& pending_classes);
   void ParseTypedef(const GrowableObjectArray& pending_classes);
   void ParseTopLevelVariable(TopLevel* top_level);
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 6f8db77..9d76bca 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -456,9 +456,9 @@
 class RawClass : public RawObject {
  public:
   enum ClassState {
-    kAllocated,     // Initial state.
+    kAllocated = 0,  // Initial state.
     kPreFinalized,  // VM classes: size precomputed, but no checks done.
-    kFinalized,     // All checks completed, class ready for use.
+    kFinalized,     // Class parsed, finalized and ready for use.
   };
 
  private:
@@ -476,6 +476,7 @@
   RawTypeArguments* type_parameters_;  // Array of TypeParameter.
   RawAbstractType* super_type_;
   RawType* mixin_;
+  RawClass* patch_class_;
   RawFunction* signature_function_;  // Associated function for signature class.
   RawArray* constants_;  // Canonicalized values of this class.
   RawArray* canonical_types_;  // Canonicalized types of this class.
@@ -491,7 +492,7 @@
   intptr_t next_field_offset_in_words_;  // Offset of the next instance field.
   intptr_t num_native_fields_;  // Number of native fields in class.
   intptr_t token_pos_;
-  uint8_t state_bits_;  // state, is_const, is_implemented.
+  uint16_t state_bits_;  // state, is_[const|implemented|synthesized|abstract].
 
   friend class Instance;
   friend class Object;
@@ -604,6 +605,7 @@
   RawArray* parameter_names_;
   RawCode* code_;  // Compiled code for the function.
   RawCode* unoptimized_code_;  // Unoptimized code, keep it after optimization.
+  RawArray* deopt_history_;  // Deopt Ids of past deoptimizations.
   RawObject* data_;  // Additional data specific to the function kind.
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->data_);
@@ -614,7 +616,7 @@
   intptr_t usage_counter_;  // Incremented while function is running.
   int16_t num_fixed_parameters_;
   int16_t num_optional_parameters_;  // > 0: positional; < 0: named.
-  uint16_t deoptimization_counter_;
+  int16_t deoptimization_counter_;
   uint16_t kind_tag_;
   uint16_t optimized_instruction_count_;
   uint16_t optimized_call_site_count_;
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 30df9e1..cd4e0e5 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -65,7 +65,7 @@
     cls.set_next_field_offset_in_words(reader->ReadIntptrValue());
     cls.set_num_native_fields(reader->ReadIntptrValue());
     cls.set_token_pos(reader->ReadIntptrValue());
-    cls.set_state_bits(reader->Read<uint8_t>());
+    cls.set_state_bits(reader->Read<uint16_t>());
 
     // Set all the object fields.
     // TODO(5411462): Need to assert No GC can happen here, even though
@@ -104,7 +104,7 @@
     writer->WriteIntptrValue(ptr()->next_field_offset_in_words_);
     writer->WriteIntptrValue(ptr()->num_native_fields_);
     writer->WriteIntptrValue(ptr()->token_pos_);
-    writer->Write<uint8_t>(ptr()->state_bits_);
+    writer->Write<uint16_t>(ptr()->state_bits_);
 
     // Write out all the object pointer fields.
     SnapshotWriterVisitor visitor(writer);
@@ -573,8 +573,9 @@
                                     intptr_t tags,
                                     Snapshot::Kind kind) {
   ASSERT(reader != NULL);
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(tags));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(tags)) ||
+         (kind == Snapshot::kFull));
 
   // Allocate function object.
   PatchClass& cls = PatchClass::ZoneHandle(reader->isolate(),
@@ -600,8 +601,9 @@
                             intptr_t object_id,
                             Snapshot::Kind kind) {
   ASSERT(writer != NULL);
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this)));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
+         (kind == Snapshot::kFull));
 
   // Write out the serialization header value for this object.
   writer->WriteInlinedObjectHeader(object_id);
@@ -620,8 +622,9 @@
                                       intptr_t tags,
                                       Snapshot::Kind kind) {
   ASSERT(reader != NULL);
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(tags));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(tags)) ||
+         (kind == Snapshot::kFull));
 
   // Allocate closure data object.
   ClosureData& data = ClosureData::ZoneHandle(
@@ -647,8 +650,9 @@
                              intptr_t object_id,
                              Snapshot::Kind kind) {
   ASSERT(writer != NULL);
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this)));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
+         (kind == Snapshot::kFull));
 
   // Write out the serialization header value for this object.
   writer->WriteInlinedObjectHeader(object_id);
@@ -678,8 +682,9 @@
                                               intptr_t tags,
                                               Snapshot::Kind kind) {
   ASSERT(reader != NULL);
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(tags));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(tags)) ||
+         (kind == Snapshot::kFull));
 
   // Allocate redirection data object.
   RedirectionData& data = RedirectionData::ZoneHandle(
@@ -705,8 +710,9 @@
                                  intptr_t object_id,
                                  Snapshot::Kind kind) {
   ASSERT(writer != NULL);
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this)));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
+         (kind == Snapshot::kFull));
 
   // Write out the serialization header value for this object.
   writer->WriteInlinedObjectHeader(object_id);
@@ -726,8 +732,9 @@
                                 intptr_t tags,
                                 Snapshot::Kind kind) {
   ASSERT(reader != NULL);
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(tags));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(tags)) ||
+         (kind == Snapshot::kFull));
 
   // Allocate function object.
   Function& func = Function::ZoneHandle(
@@ -764,8 +771,9 @@
                           intptr_t object_id,
                           Snapshot::Kind kind) {
   ASSERT(writer != NULL);
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this)));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
+         (kind == Snapshot::kFull));
 
   // Write out the serialization header value for this object.
   writer->WriteInlinedObjectHeader(object_id);
@@ -796,8 +804,9 @@
                           intptr_t tags,
                           Snapshot::Kind kind) {
   ASSERT(reader != NULL);
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(tags));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(tags)) ||
+         (kind == Snapshot::kFull));
 
   // Allocate field object.
   Field& field = Field::ZoneHandle(reader->isolate(), NEW_OBJECT(Field));
@@ -828,8 +837,9 @@
                        intptr_t object_id,
                        Snapshot::Kind kind) {
   ASSERT(writer != NULL);
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this)));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
+         (kind == Snapshot::kFull));
 
   // Write out the serialization header value for this object.
   writer->WriteInlinedObjectHeader(object_id);
@@ -904,8 +914,9 @@
                                       intptr_t tags,
                                       Snapshot::Kind kind) {
   ASSERT(reader != NULL);
-  ASSERT((kind != Snapshot::kMessage)
-          && !RawObject::IsCreatedFromSnapshot(tags));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(tags)) ||
+         (kind == Snapshot::kFull));
 
   // Read the length so that we can determine number of tokens to read.
   intptr_t len = reader->ReadSmiValue();
@@ -941,8 +952,9 @@
                              intptr_t object_id,
                              Snapshot::Kind kind) {
   ASSERT(writer != NULL);
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this)));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
+         (kind == Snapshot::kFull));
 
   // Write out the serialization header value for this object.
   writer->WriteInlinedObjectHeader(object_id);
@@ -969,8 +981,9 @@
                             intptr_t tags,
                             Snapshot::Kind kind) {
   ASSERT(reader != NULL);
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(tags));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(tags)) ||
+         (kind == Snapshot::kFull));
 
   // Allocate script object.
   Script& script = Script::ZoneHandle(reader->isolate(), NEW_OBJECT(Script));
@@ -1003,8 +1016,9 @@
                         Snapshot::Kind kind) {
   ASSERT(writer != NULL);
   ASSERT(tokens_ != TokenStream::null());
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this)));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
+         (kind == Snapshot::kFull));
 
   // Write out the serialization header value for this object.
   writer->WriteInlinedObjectHeader(object_id);
@@ -1033,7 +1047,7 @@
   Library& library = Library::ZoneHandle(reader->isolate(), Library::null());
   reader->AddBackRef(object_id, &library, kIsDeserialized);
 
-  if (RawObject::IsCreatedFromSnapshot(tags)) {
+  if ((kind == Snapshot::kScript) && RawObject::IsCreatedFromSnapshot(tags)) {
     ASSERT(kind != Snapshot::kFull);
     // Lookup the object as it should already exist in the heap.
     *reader->StringHandle() ^= reader->ReadObjectImpl();
@@ -1088,7 +1102,8 @@
   writer->WriteVMIsolateObject(kLibraryCid);
   writer->WriteIntptrValue(writer->GetObjectTags(this));
 
-  if (RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) {
+  if ((kind == Snapshot::kScript) &&
+      RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) {
     ASSERT(kind != Snapshot::kFull);
     // Write out library URL so that it can be looked up when reading.
     writer->WriteObjectImpl(ptr()->url_);
@@ -1119,8 +1134,9 @@
                                           intptr_t tags,
                                           Snapshot::Kind kind) {
   ASSERT(reader != NULL);
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(tags));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(tags)) ||
+         (kind == Snapshot::kFull));
 
   // Allocate library prefix object.
   LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(
@@ -1149,8 +1165,9 @@
                                intptr_t object_id,
                                Snapshot::Kind kind) {
   ASSERT(writer != NULL);
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this)));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
+         (kind == Snapshot::kFull));
 
   // Write out the serialization header value for this object.
   writer->WriteInlinedObjectHeader(object_id);
@@ -1173,8 +1190,9 @@
                                   intptr_t tags,
                                   Snapshot::Kind kind) {
   ASSERT(reader != NULL);
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(tags));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(tags)) ||
+         (kind == Snapshot::kFull));
 
   // Allocate Namespace object.
   Namespace& ns = Namespace::ZoneHandle(
@@ -1200,8 +1218,9 @@
                            intptr_t object_id,
                            Snapshot::Kind kind) {
   ASSERT(writer != NULL);
-  ASSERT((kind != Snapshot::kMessage) &&
-         !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this)));
+  ASSERT(((kind == Snapshot::kScript) &&
+          !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
+         (kind == Snapshot::kFull));
 
   // Write out the serialization header value for this object.
   writer->WriteInlinedObjectHeader(object_id);
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 1dab88f..c94965d 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -209,6 +209,7 @@
     ASSERT(!library_.IsNull());
     str_ ^= ReadObjectImpl();
     cls = library_.LookupClass(str_);
+    cls.EnsureIsFinalized(isolate());
   }
   ASSERT(!cls.IsNull());
   return cls.raw();
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 4e0b075..1f12ba7 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -96,7 +96,10 @@
 
 
 RawCode* StubCode::GetAllocationStubForClass(const Class& cls) {
-  Code& stub = Code::Handle(cls.allocation_stub());
+  Isolate* isolate = Isolate::Current();
+  const Error& error = Error::Handle(isolate, cls.EnsureIsFinalized(isolate));
+  ASSERT(error.IsNull());
+  Code& stub = Code::Handle(isolate, cls.allocation_stub());
   if (stub.IsNull()) {
     Assembler assembler;
     const char* name = cls.ToCString();
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index 520855c..1a3b791 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -31,7 +31,7 @@
   V(FixCallersTarget)                                                          \
   V(Deoptimize)                                                                \
   V(DeoptimizeLazy)                                                            \
-  V(BreakpointClosure)                                                         \
+  V(BreakpointRuntime)                                                         \
   V(BreakpointStatic)                                                          \
   V(BreakpointReturn)                                                          \
   V(Subtype1TestCache)                                                         \
@@ -64,7 +64,6 @@
   V(OptimizeFunction)                                                          \
   V(BreakpointDynamic)                                                         \
   V(EqualityWithNullArg)                                                       \
-  V(BreakpointEqNull)                                                          \
 
 // class StubEntry is used to describe stub methods generated in dart to
 // abstract out common code executed from generated dart code.
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index c8b023a..0b8a041 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -291,18 +291,8 @@
   // R2: Smi-tagged arguments array length.
   PushArgumentsArray(assembler);
 
-  // Stack:
-  // TOS + 0: argument array.
-  // TOS + 1: arguments descriptor array.
-  // TOS + 2: IC data object.
-  // TOS + 3: Receiver.
-  // TOS + 4: place for result from the call.
-  // TOS + 5: saved FP of previous frame.
-  // TOS + 6: dart code return address
-  // TOS + 7: pc marker (0 for stub).
-  // TOS + 8: last argument of caller.
-  // ....
   __ CallRuntime(kInstanceFunctionLookupRuntimeEntry);
+
   // Remove arguments.
   __ Drop(4);
   __ Pop(R0);  // Get result into R0.
@@ -346,7 +336,9 @@
                                            bool preserve_result) {
   // DeoptimizeCopyFrame expects a Dart frame, i.e. EnterDartFrame(0), but there
   // is no need to set the correct PC marker or load PP, since they get patched.
-  __ EnterFrame((1 << PP) | (1 << FP) | (1 << LR) | (1 << PC), 0);
+  __ mov(IP, ShifterOperand(LR));
+  __ mov(LR, ShifterOperand(0));
+  __ EnterFrame((1 << PP) | (1 << FP) | (1 << IP) | (1 << LR), 0);
   // The code in this frame may not cause GC. kDeoptimizeCopyFrameRuntimeEntry
   // and kDeoptimizeFillFrameRuntimeEntry are leaf runtime calls.
   const intptr_t saved_result_slot_from_fp =
@@ -377,7 +369,9 @@
 
   // DeoptimizeFillFrame expects a Dart frame, i.e. EnterDartFrame(0), but there
   // is no need to set the correct PC marker or load PP, since they get patched.
-  __ EnterFrame((1 << PP) | (1 << FP) | (1 << LR) | (1 << PC), 0);
+  __ mov(IP, ShifterOperand(LR));
+  __ mov(LR, ShifterOperand(0));
+  __ EnterFrame((1 << PP) | (1 << FP) | (1 << IP) | (1 << LR), 0);
   __ mov(R0, ShifterOperand(FP));  // Get last FP address.
   if (preserve_result) {
     __ Push(R1);  // Preserve result as first local.
@@ -427,7 +421,40 @@
 
 
 void StubCode::GenerateMegamorphicMissStub(Assembler* assembler) {
-  __ Unimplemented("MegamorphicMiss stub");
+  __ EnterStubFrame();
+
+  // Load the receiver.
+  __ ldr(R2, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
+  __ add(IP, FP, ShifterOperand(R2, LSL, 1));  // R2 is Smi.
+  __ ldr(R6, Address(IP, kParamEndSlotFromFp * kWordSize));
+
+  // Preserve IC data and arguments descriptor.
+  __ PushList((1 << R4) | (1 << R5));
+
+  // Push space for the return value.
+  // Push the receiver.
+  // Push IC data object.
+  // Push arguments descriptor array.
+  __ LoadImmediate(IP, reinterpret_cast<intptr_t>(Object::null()));
+  __ PushList((1 << R4) | (1 << R5) | (1 << R6) | (1 << IP));
+
+  // R2: Smi-tagged arguments array length.
+  PushArgumentsArray(assembler);
+
+  __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry);
+  // Remove arguments.
+  __ Drop(4);
+  __ Pop(R0);  // Get result into R0.
+
+  // Restore IC data and arguments descriptor.
+  __ PopList((1 << R4) | (1 << R5));
+
+  __ LeaveStubFrame();
+
+  __ CompareImmediate(R0, reinterpret_cast<intptr_t>(Object::null()));
+  __ Branch(&StubCode::InstanceFunctionLookupLabel(), EQ);
+  __ AddImmediate(R0, Instructions::HeaderSize() - kHeapObjectTag);
+  __ bx(R0);
 }
 
 
@@ -645,15 +672,6 @@
   __ ldr(R2, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
   PushArgumentsArray(assembler);
 
-  // Stack:
-  // TOS + 0: argument array.
-  // TOS + 1: arguments descriptor array.
-  // TOS + 2: place for result from the call.
-  // TOS + 3: saved FP of previous frame.
-  // TOS + 4: dart code return address
-  // TOS + 5: pc marker (0 for stub).
-  // TOS + 6: last argument of caller.
-  // ....
   __ CallRuntime(kInvokeNonClosureRuntimeEntry);
   // Remove arguments.
   __ Drop(2);
@@ -1267,8 +1285,34 @@
 }
 
 
+// The target function was not found, so invoke method
+// "dynamic noSuchMethod(Invocation invocation)".
+//  R5: inline cache data object.
+//  R4: arguments descriptor array.
 void StubCode::GenerateCallNoSuchMethodFunctionStub(Assembler* assembler) {
-  __ Unimplemented("CallNoSuchMethodFunction stub");
+  __ EnterStubFrame();
+
+  // Load the receiver.
+  __ ldr(R2, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
+  __ add(IP, FP, ShifterOperand(R2, LSL, 1));  // R2 is Smi.
+  __ ldr(R6, Address(IP, kParamEndSlotFromFp * kWordSize));
+
+  // Push space for the return value.
+  // Push the receiver.
+  // Push IC data object.
+  // Push arguments descriptor array.
+  __ LoadImmediate(IP, reinterpret_cast<intptr_t>(Object::null()));
+  __ PushList((1 << R4) | (1 << R5) | (1 << R6) | (1 << IP));
+
+  // R2: Smi-tagged arguments array length.
+  PushArgumentsArray(assembler);
+
+  __ CallRuntime(kInvokeNoSuchMethodFunctionRuntimeEntry);
+  // Remove arguments.
+  __ Drop(4);
+  __ Pop(R0);  // Get result into R0.
+  __ LeaveStubFrame();
+  __ Ret();
 }
 
 
@@ -1552,15 +1596,8 @@
 }
 
 
-void StubCode::GenerateBreakpointEqNullStub(Assembler* assembler) {
-  // TODO(hausner): implement this stub.
-  __ Branch(&StubCode::EqualityWithNullArgLabel());
-}
-
-
-void StubCode::GenerateBreakpointClosureStub(Assembler* assembler) {
-  // TODO(hausner): implement this stub.
-  __ Branch(&StubCode::CallClosureFunctionLabel());
+void StubCode::GenerateBreakpointRuntimeStub(Assembler* assembler) {
+  __ Unimplemented("BreakpointRuntime stub");
 }
 
 
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 9cf56c4..0657984 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -1708,25 +1708,23 @@
 }
 
 
-// ECX: ICData
-void StubCode::GenerateBreakpointEqNullStub(Assembler* assembler) {
+// EDX, EXC: May contain arguments to runtime stub.
+void StubCode::GenerateBreakpointRuntimeStub(Assembler* assembler) {
   __ EnterStubFrame();
+  // Save runtime args.
   __ pushl(ECX);
-  __ CallRuntime(kBreakpointEqualNullHandlerRuntimeEntry);
+  __ pushl(EDX);
+  // Room for result. Debugger stub returns address of the
+  // unpatched runtime stub.
+  const Immediate& raw_null =
+      Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  __ pushl(raw_null);  // Room for result.
+  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry);
+  __ popl(EAX);  // Address of original stub.
+  __ popl(EDX);  // Restore arguments.
   __ popl(ECX);
   __ LeaveFrame();
-  __ jmp(&StubCode::EqualityWithNullArgLabel());
-}
-
-
-// EDX: Arguments descriptor array.
-void StubCode::GenerateBreakpointClosureStub(Assembler* assembler) {
-  __ EnterStubFrame();
-  __ pushl(EDX);  // Push arguments descriptor.
-  __ CallRuntime(kBreakpointClosureHandlerRuntimeEntry);
-  __ popl(EDX);  // Restore arguments descriptor.
-  __ LeaveFrame();
-  __ jmp(&StubCode::CallClosureFunctionLabel());
+  __ jmp(EAX);   // Jump to original stub.
 }
 
 
@@ -1747,6 +1745,9 @@
 
   // Now call the static function. The breakpoint handler function
   // ensures that the call target is compiled.
+  // Note that we can't just jump to the CallStatic function stub
+  // here since that stub would patch the call site with the
+  // static function address.
   __ movl(ECX, FieldAddress(EAX, Code::instructions_offset()));
   __ addl(ECX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ jmp(ECX);
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 5ff35e0..5881403 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -1702,14 +1702,9 @@
   GenerateNArgsCheckInlineCacheStub(assembler, 1);
 }
 
-void StubCode::GenerateBreakpointEqNullStub(Assembler* assembler) {
-  // TODO(hausner): implement this stub.
-  __ Branch(&StubCode::EqualityWithNullArgLabel());
-}
 
-void StubCode::GenerateBreakpointClosureStub(Assembler* assembler) {
-  // TODO(hausner): implement this stub.
-  __ Branch(&StubCode::CallClosureFunctionLabel());
+void StubCode::GenerateBreakpointRuntimeStub(Assembler* assembler) {
+  __ Unimplemented("BreakpointRuntime stub");
 }
 
 
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 4905f2b..21ed7c9 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -1685,27 +1685,24 @@
 }
 
 
-//  RBX: ICData.
+//  RBX, R10: May contain arguments to runtime stub.
 //  TOS(0): return address (Dart code).
-void StubCode::GenerateBreakpointEqNullStub(Assembler* assembler) {
+void StubCode::GenerateBreakpointRuntimeStub(Assembler* assembler) {
   __ EnterStubFrame();
-  __ pushq(RBX);  // Preserve ICData.
-  __ CallRuntime(kBreakpointClosureHandlerRuntimeEntry);
-  __ popq(RBX);  // Restore arguments descriptor.
+  // Preserve runtime args.
+  __ pushq(RBX);
+  __ pushq(R10);
+  // Room for result. Debugger stub returns address of the
+  // unpatched runtime stub.
+  const Immediate& raw_null =
+      Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  __ pushq(raw_null);  // Room for result.
+  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry);
+  __ popq(RAX);  // Address of original.
+  __ popq(R10);  // Restore arguments.
+  __ popq(RBX);
   __ LeaveFrame();
-  __ jmp(&StubCode::EqualityWithNullArgLabel());
-}
-
-
-//  R10: Arguments descriptor array.
-//  TOS(0): return address (Dart code).
-void StubCode::GenerateBreakpointClosureStub(Assembler* assembler) {
-  __ EnterStubFrame();
-  __ pushq(R10);       // Preserve arguments descriptor.
-  __ CallRuntime(kBreakpointClosureHandlerRuntimeEntry);
-  __ popq(R10);  // Restore arguments descriptor.
-  __ LeaveFrame();
-  __ jmp(&StubCode::CallClosureFunctionLabel());
+  __ jmp(RAX);   // Jump to original stub.
 }
 
 
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index efe97a0..8a4b2c9 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -239,6 +239,8 @@
   V(TwoSpaces, "  ")                                                           \
   V(_instanceOf, "_instanceOf")                                                \
   V(_as, "_as")                                                                \
+  V(GetterPrefix, "get:")                                                      \
+  V(SetterPrefix, "set:")                                                      \
   V(PrivateGetterPrefix, "get:_")                                              \
   V(PrivateSetterPrefix, "set:_")                                              \
   V(_New, "_new")                                                              \
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 2749149..8f674c7 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -188,6 +188,13 @@
 class VirtualMemory;
 
 
+// snapshot_buffer points to a snapshot if we link in a snapshot otherwise
+// it is initialized to NULL.
+namespace bin {
+extern const uint8_t* snapshot_buffer;
+}
+
+
 class TestCaseBase {
  public:
   explicit TestCaseBase(const char* name);
@@ -225,7 +232,7 @@
     return CreateIsolate(buffer);
   }
   static Dart_Isolate CreateTestIsolate() {
-    return CreateIsolate(NULL);
+    return CreateIsolate(bin::snapshot_buffer);
   }
   static Dart_Handle library_handler(Dart_LibraryTag tag,
                                      Dart_Handle library,
@@ -234,7 +241,7 @@
   virtual void Run();
 
  private:
-  static Dart_Isolate CreateIsolate(uint8_t* buffer) {
+  static Dart_Isolate CreateIsolate(const uint8_t* buffer) {
     char* err;
     Dart_Isolate isolate = Dart_CreateIsolate(NULL, NULL, buffer, NULL, &err);
     if (isolate == NULL) {
diff --git a/sdk/lib/_collection_dev/iterable.dart b/sdk/lib/_collection_dev/iterable.dart
index c82fa03..a6a65b2 100644
--- a/sdk/lib/_collection_dev/iterable.dart
+++ b/sdk/lib/_collection_dev/iterable.dart
@@ -283,10 +283,11 @@
   E get current => _current;
 
   bool moveNext() {
-    if (_length != _iterable.length) {
+    int length = _iterable.length;
+    if (_length != length) {
       throw new ConcurrentModificationError(_iterable);
     }
-    if (_index == _length) {
+    if (_index >= length) {
       _current = null;
       return false;
     }
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index d8f90d4..5762744 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -622,11 +622,6 @@
   void addImport(Element element, DiagnosticListener listener) {
     Element existing = importScope[element.name];
     if (existing != null) {
-      // TODO(8474): Remove the "Expect" special casing.
-      if (element.name == const SourceString("Expect") ||
-          element.name == const SourceString("ExpectException")) {
-        return;
-      }
       // TODO(johnniwinther): Provide access to the import tags from which
       // the elements came.
       importScope[element.name] = new AmbiguousElementX(
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index b4bfbdb..d2584bc 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -321,7 +321,7 @@
     registerFieldType(fieldConstructorTypeMap, field, type);
   }
 
-  void registerFieldSetter(FunctionElement element, Element field, HType type) {
+  void registerFieldSetter(Element element, Element field, HType type) {
     HType initializerType = fieldInitializerTypeMap[field];
     HType constructorType = fieldConstructorTypeMap[field];
     HType setterType = fieldTypeMap[field];
@@ -382,7 +382,7 @@
     return result;
   }
 
-  void registerOptimizedFunction(FunctionElement element,
+  void registerOptimizedFunction(Element element,
                                  Element field,
                                  HType type) {
     assert(field.isField());
@@ -1165,6 +1165,10 @@
     if (jsIndexingBehaviorInterface != null) {
       world.registerIsCheck(jsIndexingBehaviorInterface.computeType(compiler),
                             elements);
+      world.registerStaticUse(
+          compiler.findHelper(const SourceString('isJsIndexable')));
+      world.registerStaticUse(
+          compiler.findInterceptor(const SourceString('dispatchPropertyName')));
     }
 
     if (compiler.enableTypeAssertions) {
@@ -1506,7 +1510,7 @@
         element, parameterTypes, defaultValueTypes);
   }
 
-  registerFieldTypesOptimization(FunctionElement element,
+  registerFieldTypesOptimization(Element element,
                                  Element field,
                                  HType type) {
     fieldTypes.registerOptimizedFunction(element, field, type);
@@ -1569,7 +1573,7 @@
     fieldTypes.registerFieldConstructor(field, type);
   }
 
-  void registerFieldSetter(FunctionElement element, Element field, HType type) {
+  void registerFieldSetter(Element element, Element field, HType type) {
     fieldTypes.registerFieldSetter(element, field, type);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index e269d41..54ded9c 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -1565,10 +1565,12 @@
     }
     emitIsTests(classElement, builder);
 
-    jsAst.Expression init =
-        js('$classesCollector.$className = #', builder.toObjectInitializer());
-    buffer.write(jsAst.prettyPrint(init, compiler));
-    buffer.write('$N$n');
+    // TODO(ahe): This method (generateClass) should return a jsAst.Expression.
+    if (!buffer.isEmpty) {
+      buffer.write(',$n$n');
+    }
+    buffer.write('$className:$_');
+    buffer.write(jsAst.prettyPrint(builder.toObjectInitializer(), compiler));
   }
 
   bool get getterAndSetterCanBeImplementedByFieldSpec => true;
@@ -1781,10 +1783,13 @@
   void emitStaticFunction(CodeBuffer buffer,
                           String name,
                           jsAst.Expression functionExpression) {
-    jsAst.Expression assignment =
-        js('$isolateProperties.$name = #', functionExpression);
-    buffer.write(jsAst.prettyPrint(assignment, compiler));
-    buffer.write('$N$n');
+    // TODO(ahe): This method (emitStaticFunction) should return a
+    // jsAst.Expression.
+    if (!buffer.isEmpty) {
+      buffer.write(',$n$n');
+    }
+    buffer.write('$name:$_');
+    buffer.write(jsAst.prettyPrint(functionExpression, compiler));
   }
 
   void emitStaticFunctions(CodeBuffer eagerBuffer) {
@@ -1798,15 +1803,8 @@
             .where(isStaticFunction)
             .toSet();
 
-    LibraryElement previousLibrary = null;
     for (Element element in Elements.sortedByPosition(elements)) {
       CodeBuffer buffer = bufferForElement(element, eagerBuffer);
-      LibraryElement library = element.getLibrary();
-      if (library != previousLibrary) {
-        previousLibrary = library;
-        addComment(
-            'Library: ${library.getLibraryOrScriptName()}', buffer);
-      }
       jsAst.Expression code = backend.generatedCode[element];
       emitStaticFunction(buffer, namer.getName(element), code);
       jsAst.Expression bailoutCode = backend.generatedBailoutCode[element];
@@ -1834,7 +1832,9 @@
     for (FunctionElement element in
              Elements.sortedByPosition(staticGetters.keys)) {
       Element closure = staticGetters[element];
-      CodeBuffer buffer = bufferForElement(element, eagerBuffer);
+      // TODO(ahe): This should be emitted as a constant.  Currently,
+      // this breaks deferred loading.
+      CodeBuffer buffer = eagerBuffer;
       String closureClass = namer.isolateAccess(closure);
       String name = namer.getStaticClosureName(element);
       String staticName = namer.getName(element);
@@ -2973,16 +2973,8 @@
 
       // Might create boundClosures.
       if (!regularClasses.isEmpty) {
-        addComment('Classes', mainBuffer);
-        LibraryElement previousLibrary = null;
         for (ClassElement element in regularClasses) {
-          LibraryElement library =  element.getLibrary();
-          if (library != previousLibrary) {
-            previousLibrary = library;
-            addComment(
-                'Library: ${library.getLibraryOrScriptName()}', mainBuffer);
-          }
-          generateClass(element, mainBuffer);
+          generateClass(element, bufferForElement(element, mainBuffer));
         }
       }
 
@@ -2999,18 +2991,9 @@
 
       // Might create boundClosures.
       if (!deferredClasses.isEmpty) {
-        emitDeferredPreambleWhenEmpty(deferredBuffer);
-        deferredBuffer.add('\$\$$_=$_{}$N');
-
         for (ClassElement element in deferredClasses) {
-          generateClass(element, deferredBuffer);
+          generateClass(element, bufferForElement(element, mainBuffer));
         }
-
-        deferredBuffer.add('$finishClassesName(\$\$,'
-                           '$_${namer.CURRENT_ISOLATE},'
-                           '$_$isolatePropertiesName)$N');
-        // Reset the map.
-        deferredBuffer.add("\$\$$_=${_}null$N$n");
       }
 
       emitStaticFunctionClosures();
@@ -3025,13 +3008,61 @@
         mainBuffer.add("$N$n");
       }
 
-      emitFinishClassesInvocationIfNecessary(mainBuffer);
-
       // After this assignment we will produce invalid JavaScript code if we use
       // the classesCollector variable.
       classesCollector = 'classesCollector should not be used from now on';
 
       emitStaticFunctions(mainBuffer);
+
+      if (!libraryBuffers.isEmpty) {
+        var oldClassesCollector = classesCollector;
+        classesCollector = r"$$";
+        if (compiler.enableMinification) {
+          mainBuffer.write(';');
+        }
+        mainBuffer
+            ..write(REFLECTION_DATA_PARSER)
+            ..write('([$n');
+        emitDeferredPreambleWhenEmpty(deferredBuffer);
+        deferredBuffer.add('\$\$$_=$_{};$n');
+
+        deferredBuffer
+            ..write(REFLECTION_DATA_PARSER)
+            ..write('([$n');
+        var sortedLibraries = Elements.sortedByPosition(libraryBuffers.keys);
+        for (LibraryElement library in sortedLibraries) {
+          List<CodeBuffer> buffers = libraryBuffers[library];
+          var buffer = buffers[0];
+          if (buffer != null) {
+            mainBuffer
+                ..write('["${library.getLibraryOrScriptName()}",$_{$n')
+                ..addBuffer(buffer)
+                ..write('}],$n');
+          }
+          buffer = buffers[1];
+          if (buffer != null) {
+            deferredBuffer
+                ..write('["${library.getLibraryOrScriptName()}",$_{$n')
+                ..addBuffer(buffer)
+                ..write('}],$n');
+          }
+          libraryBuffers[library] = const [];
+        }
+        mainBuffer.write('])$N');
+
+        deferredBuffer.write('])$N');
+        if (!deferredClasses.isEmpty) {
+          deferredBuffer.add('$finishClassesName(\$\$,'
+                             '$_${namer.CURRENT_ISOLATE},'
+                             '$_$isolatePropertiesName)$N');
+        }
+
+        // Reset the map.
+        deferredBuffer.add("\$\$$_=${_}null$N$n");
+        emitFinishClassesInvocationIfNecessary(mainBuffer);
+        classesCollector = oldClassesCollector;
+      }
+
       emitStaticFunctionGetters(mainBuffer);
 
       emitRuntimeTypeSupport(mainBuffer);
@@ -3067,10 +3098,20 @@
     return compiler.assembledCode;
   }
 
+  final Map<LibraryElement, List<CodeBuffer>> libraryBuffers =
+      new Map<LibraryElement, List<CodeBuffer>>();
+
   CodeBuffer bufferForElement(Element element, CodeBuffer eagerBuffer) {
-    if (!isDeferred(element)) return eagerBuffer;
-    emitDeferredPreambleWhenEmpty(deferredBuffer);
-    return deferredBuffer;
+    LibraryElement library = element.getLibrary();
+    List<CodeBuffer> buffers = libraryBuffers.putIfAbsent(
+        library, () => <CodeBuffer>[null, null]);
+    bool deferred = isDeferred(element);
+    int index = deferred ? 1 : 0;
+    CodeBuffer buffer = buffers[index];
+    if (buffer == null) {
+      buffer = buffers[index] = new CodeBuffer();
+    }
+    return buffer;
   }
 
   bool firstDeferredConstant = true;
@@ -3164,6 +3205,7 @@
 const String GENERATED_BY = """
 // Generated by dart2js, the Dart to JavaScript compiler.
 """;
+
 const String HOOKS_API_USAGE = """
 // The code supports the following hooks:
 // dartPrint(message)   - if this function is defined it is called
@@ -3173,3 +3215,34 @@
 //                        Instead, a closure that will invoke [main] is
 //                        passed to [dartMainRunner].
 """;
+
+// TODO(ahe): This code should be integrated in finishClasses.
+// TODO(ahe): The uri field below is fake.
+const String REFLECTION_DATA_PARSER = r'''
+(function (reflectionData) {
+  if (!init.libraries) init.libraries = [];
+  var libraries = init.libraries;
+  var hasOwnProperty = Object.prototype.hasOwnProperty;
+  var length = reflectionData.length;
+  for (var i = 0; i < length; i++) {
+    var data = reflectionData[i];
+    var name = data[0];
+    var descriptor = data[1];
+    var classes = [];
+    var functions = [];
+    for (var property in descriptor) {
+      if (!hasOwnProperty.call(descriptor, property)) continue;
+      var element = descriptor[property];
+      if (typeof element === "function") {
+        $[property] = element;
+        functions.push(property);
+      } else {
+        $$[property] = element;
+        classes.push(property);
+        classes.push(element[""]);
+      }
+    }
+    var uri = ".../library" + i + ".dart";
+    libraries.push([name, uri, classes, functions]);
+  }
+})''';
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
index 21f07e2..c162f55 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
@@ -70,13 +70,17 @@
     // If there are no classes that use their variables in checks, there is
     // nothing to do.
     if (classesUsingChecks.isEmpty) return;
+    Set<DartType> instantiatedTypes = universe.instantiatedTypes;
     if (universe.usingFactoryWithTypeArguments) {
-      for (DartType type in universe.instantiatedTypes) {
+      for (DartType type in instantiatedTypes) {
         if (type.kind != TypeKind.INTERFACE) continue;
         InterfaceType interface = type;
-        for (DartType argument in interface.typeArguments) {
-          universe.isChecks.add(argument);
-        }
+        do {
+          for (DartType argument in interface.typeArguments) {
+            universe.isChecks.add(argument);
+          }
+          interface = interface.element.supertype;
+        } while (interface != null && !instantiatedTypes.contains(interface));
       }
     } else {
       // Find all instantiated types that are a subtype of a class that uses
@@ -84,19 +88,22 @@
       // set of is-checks.
       // TODO(karlklose): replace this with code that uses a subtype lookup
       // datastructure in the world.
-      for (DartType type in universe.instantiatedTypes) {
+      for (DartType type in instantiatedTypes) {
         if (type.kind != TypeKind.INTERFACE) continue;
         InterfaceType classType = type;
         for (ClassElement cls in classesUsingChecks) {
-          // We need the type as instance of its superclass anyway, so we just
-          // try to compute the substitution; if the result is [:null:], the
-          // classes are not related.
-          InterfaceType instance = classType.asInstanceOf(cls);
-          if (instance == null) continue;
-          Link<DartType> typeArguments = instance.typeArguments;
-          for (DartType argument in typeArguments) {
-            universe.isChecks.add(argument);
-          }
+          InterfaceType current = classType;
+          do {
+            // We need the type as instance of its superclass anyway, so we just
+            // try to compute the substitution; if the result is [:null:], the
+            // classes are not related.
+            InterfaceType instance = current.asInstanceOf(cls);
+            if (instance == null) break;
+            for (DartType argument in instance.typeArguments) {
+              universe.isChecks.add(argument);
+            }
+            current = current.element.supertype;
+          } while (current != null && !instantiatedTypes.contains(current));
         }
       }
     }
diff --git a/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart b/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart
index 35de8a8..67e6a0c 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart
@@ -98,6 +98,9 @@
   //
   // [extension] is used for irregular cases.
   //
+  // [indexability] is used to cache whether or not the object
+  // implements JavaScriptIndexingBehavior.
+  //
   //     proto  interceptor extension action
   //     -----  ----------- --------- ------
   //     false  I                     use interceptor I
@@ -105,13 +108,22 @@
   //     P      I                     if object's prototype is P, use I
   //     F      -           P         if object's prototype is P, call F
 
-  return JS('', '{i: #, p: #, e: #}', interceptor, proto, extension);
+  // TODO(kasperl): Remove this hack. It is needed to avoid inlining
+  // this method because inlining gives us multiple allocation points
+  // for records which is bad because it leads to polymorphic access.
+  if (false) return null;
+  return JS('', '{i: #, p: #, e: #, x: null}', interceptor, proto, extension);
 }
 
 dispatchRecordInterceptor(record) => JS('', '#.i', record);
 dispatchRecordProto(record) => JS('', '#.p', record);
 dispatchRecordExtension(record) => JS('', '#.e', record);
 
+dispatchRecordIndexability(record) => JS('bool|Null', '#.x', record);
+setDispatchRecordIndexability(record, bool value) {
+  JS('void', '#.x = #', record, value);
+}
+
 /**
  * Returns the interceptor for a native class instance. Used by
  * [getInterceptor].
diff --git a/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
index 61120ea..feb7009 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
@@ -186,15 +186,23 @@
 }
 
 patch class Process {
-  patch static Future<Process> start(String executable,
-                                     List<String> arguments,
-                                     [ProcessOptions options]) {
+  patch static Future<Process> start(
+      String executable,
+      List<String> arguments,
+      {String workingDirectory,
+       Map<String, String> environment,
+       bool runInShell: false}) {
     throw new UnsupportedError("Process.start");
   }
 
-  patch static Future<ProcessResult> run(String executable,
-                                         List<String> arguments,
-                                         [ProcessOptions options]) {
+  patch static Future<ProcessResult> run(
+      String executable,
+      List<String> arguments,
+      {String workingDirectory,
+       Map<String, String> environment,
+       bool runInShell: false,
+       Encoding stdoutEncoding: Encoding.SYSTEM,
+       Encoding stderrEncoding: Encoding.SYSTEM}) {
     throw new UnsupportedError("Process.run");
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
index 56e7221..3b5371c 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
@@ -15,9 +15,10 @@
                                    RAW_DART_FUNCTION_REF;
 import 'dart:_interceptors' show getInterceptor,
                                  interceptedNames,
-                                 dispatchPropertyName,
                                  makeDispatchRecord,
-                                 setDispatchProperty,
+                                 getDispatchProperty,
+                                 dispatchRecordIndexability,
+                                 setDispatchRecordIndexability,
                                  Interceptor,
                                  JSMutableIndexable,
                                  JSUnknown;
@@ -33,6 +34,27 @@
   return value != null && JS('bool', r'(#.constructor === Array)', value);
 }
 
+bool isJsIndexable(var object, var record) {
+  if (record != null) {
+    var result = dispatchRecordIndexability(record);
+    if (result != null) return result;
+  }
+  return isJsIndexableSlow(object);
+}
+
+// We keep the slow path of the indexability check in a separate method
+// to get better code generated for the fast path and to increase the
+// chance of having it inlined.
+bool isJsIndexableSlow(var object) {
+  bool result = object is JavaScriptIndexingBehavior;
+  var record = getDispatchProperty(object);
+  if (record == null) return result;
+  // This is intentionally written to have two return points, so we
+  // will not inline the slow path function into the fast one.
+  setDispatchRecordIndexability(record, result);
+  return result;
+}
+
 checkMutable(list, reason) {
   if (JS('bool', r'!!(#.immutable$list)', list)) {
     throw new UnsupportedError(reason);
@@ -275,18 +297,22 @@
     if (handleError == null) handleError = _throwFormatException;
     // Notice that JS parseFloat accepts garbage at the end of the string.
     // Accept only:
-    // - NaN
+    // - [+/-]NaN
     // - [+/-]Infinity
     // - a Dart double literal
-    // We do not allow leading or trailing whitespace.
+    // We do allow leading or trailing whitespace.
     if (!JS('bool',
-            r'/^\s*(?:NaN|[+-]?(?:Infinity|'
-                r'(?:\.\d+|\d+(?:\.\d+)?)(?:[eE][+-]?\d+)?))\s*$/.test(#)',
+            r'/^\s*[+-]?(?:Infinity|NaN|'
+                r'(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(#)',
             source)) {
       return handleError(source);
     }
     var result = JS('num', r'parseFloat(#)', source);
-    if (result.isNaN && source != 'NaN') {
+    if (result.isNaN) {
+      var trimmed = source.trim();
+      if (trimmed == 'NaN' || trimmed == '+NaN' || trimmed == '-NaN') {
+        return result;
+      }
       return handleError(source);
     }
     return result;
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_string.dart b/sdk/lib/_internal/compiler/implementation/lib/js_string.dart
index 56a494da..04cfa7d 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_string.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_string.dart
@@ -97,8 +97,99 @@
     return JS('String', r'#.toUpperCase()', this);
   }
 
+  // Characters with Whitespace property (Unicode 6.2).
+  // 0009..000D    ; White_Space # Cc       <control-0009>..<control-000D>
+  // 0020          ; White_Space # Zs       SPACE
+  // 0085          ; White_Space # Cc       <control-0085>
+  // 00A0          ; White_Space # Zs       NO-BREAK SPACE
+  // 1680          ; White_Space # Zs       OGHAM SPACE MARK
+  // 180E          ; White_Space # Zs       MONGOLIAN VOWEL SEPARATOR
+  // 2000..200A    ; White_Space # Zs       EN QUAD..HAIR SPACE
+  // 2028          ; White_Space # Zl       LINE SEPARATOR
+  // 2029          ; White_Space # Zp       PARAGRAPH SEPARATOR
+  // 202F          ; White_Space # Zs       NARROW NO-BREAK SPACE
+  // 205F          ; White_Space # Zs       MEDIUM MATHEMATICAL SPACE
+  // 3000          ; White_Space # Zs       IDEOGRAPHIC SPACE
+  //
+  // BOM: 0xFEFF
+  static bool _isWhitespace(int codeUnit) {
+    // Most codeUnits should be less than 256. Special case with a smaller
+    // switch.
+    if (codeUnit < 256) {
+      switch (codeUnit) {
+        case 0x09:
+        case 0x0A:
+        case 0x0B:
+        case 0x0C:
+        case 0x0D:
+        case 0x20:
+        case 0x85:
+        case 0xA0:
+          return true;
+        default:
+          return false;
+      }
+    }
+    switch (codeUnit) {
+      case 0x1680:
+      case 0x180E:
+      case 0x2000:
+      case 0x2001:
+      case 0x2002:
+      case 0x2003:
+      case 0x2004:
+      case 0x2005:
+      case 0x2006:
+      case 0x2007:
+      case 0x2008:
+      case 0x2009:
+      case 0x200A:
+      case 0x2028:
+      case 0x2029:
+      case 0x202F:
+      case 0x205F:
+      case 0x3000:
+      case 0xFEFF:
+        return true;
+      default:
+        return false;
+    }
+  }
+
+  // Dart2js can't use JavaScript trim, because JavaScript does not trim
+  // the NEXT LINE character (0x85) and BOMs (0xFEFF).
   String trim() {
-    return JS('String', r'#.trim()', this);
+    const int CARRIAGE_RETURN = 0x0D;
+    const int SPACE = 0x20;
+
+    int startIndex = 0;
+    while (startIndex < this.length) {
+      int codeUnit = this.codeUnitAt(startIndex);
+      if (codeUnit == SPACE ||
+          codeUnit == CARRIAGE_RETURN ||
+          _isWhitespace(codeUnit)) {
+        startIndex++;
+      } else {
+        break;
+      }
+    }
+    if (startIndex == this.length) return "";
+
+    int endIndex = this.length;
+    // We know that there is at least one character that is non-whitespace.
+    // Therefore we don't need to verify that endIndex > startIndex.
+    while (true) {
+      int codeUnit = this.codeUnitAt(endIndex - 1);
+      if (codeUnit == SPACE ||
+          codeUnit == CARRIAGE_RETURN ||
+          _isWhitespace(codeUnit)) {
+        endIndex--;
+      } else {
+        break;
+      }
+    }
+    if (startIndex == 0 && endIndex == this.length) return this;
+    return JS('String', r'#.substring(#, #)', this, startIndex, endIndex);
   }
 
   List<int> get codeUnits => new _CodeUnits(this);
diff --git a/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart
index 85b9ee5..88e9bba 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart
@@ -14,10 +14,77 @@
 }
 
 class _MirrorSystem implements MirrorSystem {
+  TypeMirror get dynamicType => _dynamicType;
+  TypeMirror get voidType => _voidType;
+
+  final static TypeMirror _dynamicType =
+      new _TypeMirror(const Symbol('dynamic'));
+  final static TypeMirror _voidType = new _TypeMirror(const Symbol('void'));
+
+  static final Map<String, List<LibraryMirror>> librariesByName =
+      computeLibrariesByName();
+
+  Iterable<LibraryMirror> findLibrary(Symbol libraryName) {
+    return new List<LibraryMirror>.from(librariesByName[_n(libraryName)]);
+  }
+
+  static Map<String, List<LibraryMirror>> computeLibrariesByName() {
+    var result = new Map<String, List<LibraryMirror>>();
+    var jsLibraries = JS('=List|Null', 'init.libraries');
+    if (jsLibraries == null) return result;
+    for (List data in jsLibraries) {
+      String name = data[0];
+      Uri uri = Uri.parse(data[1]);
+      List<String> classes = data[2];
+      List<String> functions = data[3];
+      var libraries = result.putIfAbsent(name, () => <LibraryMirror>[]);
+      libraries.add(new _LibraryMirror(name, uri, classes, functions));
+    }
+    return result;
+  }
+}
+
+class _TypeMirror implements TypeMirror {
+  final Symbol simpleName;
+  _TypeMirror(this.simpleName);
+}
+
+class _LibraryMirror extends _ObjectMirror implements LibraryMirror {
+  final String _name;
+  final Uri uri;
+  final List<String> _classes;
+  final List<String> _functions;
+
+  _LibraryMirror(this._name, this.uri, this._classes, this._functions);
+
+  Map<Symbol, ClassMirror> get classes {
+    var result = new Map<Symbol, ClassMirror>();
+    for (int i = 0; i < _classes.length; i += 2) {
+      Symbol symbol = _s(_classes[i]);
+      result[symbol] = _reflectClass(symbol, _classes[i + 1]);
+    }
+    return result;
+  }
+
+  InstanceMirror setField(Symbol fieldName, Object arg) {
+    // TODO(ahe): This is extremely dangerous!!!
+    JS('void', r'$[#] = #', _n(fieldName), arg);
+    return _reflect(arg);
+  }
+
+  InstanceMirror getField(Symbol fieldName) {
+    // TODO(ahe): This is extremely dangerous!!!
+    return _reflect(JS('', r'$[#]', _n(fieldName)));
+  }
 }
 
 String _n(Symbol symbol) => _symbol_dev.Symbol.getName(symbol);
 
+Symbol _s(String name) {
+  if (name == null) return null;
+  return new _symbol_dev.Symbol.unvalidated(name);
+}
+
 patch MirrorSystem currentMirrorSystem() => _currentMirrorSystem;
 
 final _MirrorSystem _currentMirrorSystem = new _MirrorSystem();
@@ -26,17 +93,26 @@
   throw new UnsupportedError("MirrorSystem not implemented");
 }
 
-patch InstanceMirror reflect(Object reflectee) {
-  return new _InstanceMirror(reflectee);
+// TODO(ahe): This is a workaround for http://dartbug.com/10543
+patch InstanceMirror reflect(Object reflectee) => _reflect(reflectee);
+
+InstanceMirror _reflect(Object reflectee) {
+  if (reflectee is Closure) {
+    return new _ClosureMirror(reflectee);
+  } else {
+    return new _InstanceMirror(reflectee);
+  }
 }
 
 final Expando<ClassMirror> _classMirrors = new Expando<ClassMirror>();
 
-patch ClassMirror reflectClass(Type key) => _reflectClass(key);
+patch ClassMirror reflectClass(Type key) => __reflectClass(key);
 
 // TODO(ahe): This is a workaround for http://dartbug.com/10543
-ClassMirror _reflectClass(Type key) {
-  String className = '$key';
+ClassMirror __reflectClass(Type key) => _reflectClass(_s('$key'), null);
+
+ClassMirror _reflectClass(Symbol symbol, String fields) {
+  String className = _n(symbol);
   var constructor = Primitives.getConstructor(className);
   if (constructor == null) {
     // Probably an intercepted class.
@@ -45,21 +121,30 @@
   }
   var mirror = _classMirrors[constructor];
   if (mirror == null) {
-    mirror = new _ClassMirror(className, constructor);
+    mirror = new _ClassMirror(symbol, constructor, fields);
     _classMirrors[constructor] = mirror;
   }
   return mirror;
 }
 
-class _InstanceMirror extends InstanceMirror {
+abstract class _ObjectMirror implements ObjectMirror {
+  Future<InstanceMirror> setFieldAsync(Symbol fieldName, Object value) {
+    return new Future<InstanceMirror>(() => this.setField(fieldName, value));
+  }
 
+  Future<InstanceMirror> getFieldAsync(Symbol fieldName) {
+    return new Future<InstanceMirror>(() => this.getField(fieldName));
+  }
+}
+
+class _InstanceMirror extends _ObjectMirror implements InstanceMirror {
   final reflectee;
 
   _InstanceMirror(this.reflectee);
 
   bool get hasReflectee => true;
 
-  ClassMirror get type => _reflectClass(reflectee.runtimeType);
+  ClassMirror get type => __reflectClass(reflectee.runtimeType);
 
   Future<InstanceMirror> invokeAsync(Symbol memberName,
                                      List<Object> positionalArguments,
@@ -95,17 +180,13 @@
     Invocation invocation = createInvocationMirror(
         _n(name), mangledName, type, arguments, argumentNames);
 
-    return new _InstanceMirror(delegate(invocation));
-  }
-
-  Future<InstanceMirror> setFieldAsync(Symbol fieldName, Object value) {
-    return new Future<InstanceMirror>(() => setField(fieldName, value));
+    return _reflect(delegate(invocation));
   }
 
   InstanceMirror setField(Symbol fieldName, Object arg) {
     _invoke(
         fieldName, JSInvocationMirror.SETTER, 'set\$${_n(fieldName)}', [arg]);
-    return new _InstanceMirror(arg);
+    return _reflect(arg);
   }
 
   InstanceMirror getField(Symbol fieldName) {
@@ -113,10 +194,6 @@
         fieldName, JSInvocationMirror.GETTER, 'get\$${_n(fieldName)}', []);
   }
 
-  Future<InstanceMirror> getFieldAsync(Symbol fieldName) {
-    return new Future<InstanceMirror>(() => getField(fieldName));
-  }
-
   delegate(Invocation invocation) {
     return JSInvocationMirror.invokeFromMirror(invocation, reflectee);
   }
@@ -124,12 +201,143 @@
   String toString() => 'InstanceMirror($reflectee)';
 }
 
-class _ClassMirror extends ClassMirror {
-  final String _name;
+class _ClassMirror extends _ObjectMirror implements ClassMirror {
+  final Symbol simpleName;
   final _jsConstructor;
+  final String _fields;
 
-  _ClassMirror(this._name, this._jsConstructor) {
+  _ClassMirror(this.simpleName, this._jsConstructor, this._fields);
+
+  Map<Symbol, Mirror> get members {
+    var result = new Map<Symbol, Mirror>();
+    var s = _fields.split(";");
+    var fields = s[1] == "" ? [] : s[1].split(",");
+    for (String field in fields) {
+      _VariableMirror mirror = new _VariableMirror.from(field);
+      result[mirror.simpleName] = mirror;
+    }
+    return result;
   }
 
-  String toString() => 'ClassMirror($_name)';
+  InstanceMirror setField(Symbol fieldName, Object arg) {
+    // TODO(ahe): This is extremely dangerous!!!
+    JS('void', r'$[#] = #', '${_n(simpleName)}_${_n(fieldName)}', arg);
+    return _reflect(arg);
+  }
+
+  InstanceMirror getField(Symbol fieldName) {
+    // TODO(ahe): This is extremely dangerous!!!
+    return _reflect(
+        JS('', r'$[#]', '${_n(simpleName)}_${_n(fieldName)}'));
+  }
+
+  InstanceMirror newInstance(Symbol constructorName,
+                             List positionalArguments,
+                             [Map<Symbol,dynamic> namedArguments]) {
+    if (namedArguments != null && !namedArguments.isEmpty) {
+      throw new UnsupportedError('Named arguments are not implemented');
+    }
+    String constructorName = '${_n(simpleName)}\$${_n(constructorName)}';
+    return _reflect(JS('', r'$[#].apply($, #)', constructorName,
+                       new List.from(positionalArguments)));
+  }
+
+  Future<InstanceMirror> newInstanceAsync(
+      Symbol constructorName,
+      List positionalArguments,
+      [Map<Symbol, dynamic> namedArguments]) {
+    if (namedArguments != null && !namedArguments.isEmpty) {
+      throw new UnsupportedError('Named arguments are not implemented');
+    }
+    return new Future<InstanceMirror>(
+        () => newInstance(
+            constructorName, positionalArguments, namedArguments));
+  }
+
+
+  String toString() => 'ClassMirror(${_n(simpleName)})';
+}
+
+class _VariableMirror implements VariableMirror {
+  // TODO(ahe): The values in these fields are virtually untested.
+  final Symbol simpleName;
+  final String _jsName;
+  final bool _readOnly;
+
+  _VariableMirror(this.simpleName, this._jsName, this._readOnly);
+
+  factory _VariableMirror.from(String descriptor) {
+    int length = descriptor.length;
+    var code = fieldCode(descriptor.codeUnitAt(length - 1));
+    if (code == 0) {
+      throw new RuntimeError('Bad field descriptor: $descriptor');
+    }
+    bool hasGetter = (code & 3) != 0;
+    bool hasSetter = (code >> 2) != 0;
+    String jsName;
+    String accessorName = jsName = descriptor.substring(0, length - 1);
+    int divider = descriptor.indexOf(":");
+    if (divider > 0) {
+      accessorName = accessorName.substring(0, divider);
+      jsName = accessorName.substring(divider + 1);
+    }
+    bool readOnly = !hasSetter;
+    return new _VariableMirror(_s(accessorName), jsName, readOnly);
+  }
+
+  TypeMirror get type => _MirrorSystem._dynamicType;
+
+  static int fieldCode(int code) {
+    if (code >= 60 && code <= 64) return code - 59;
+    if (code >= 123 && code <= 126) return code - 117;
+    if (code >= 37 && code <= 43) return code - 27;
+    return 0;
+  }
+}
+
+class _ClosureMirror extends _InstanceMirror implements ClosureMirror {
+  _ClosureMirror(reflectee) : super(reflectee);
+
+  MethodMirror get function {
+    // TODO(ahe): What about optional parameters (named or not).
+    var extractCallName = JS('', r'''
+function(reflectee) {
+  for (var property in reflectee) {
+    if ("call$" == property.substring(0, 5)) return property;
+  }
+  return null;
+}
+''');
+    String callName = JS('String|Null', '#(#)', extractCallName, reflectee);
+    if (callName == null) {
+      throw new RuntimeError('Cannot find callName on "$reflectee"');
+    }
+    var jsFunction = JS('', '#[#]', reflectee, callName);
+    int parameterCount = int.parse(callName.split(r'$')[1]);
+    return new _MethodMirror(jsFunction, parameterCount);
+  }
+
+  InstanceMirror apply(List positionalArguments,
+                       [Map<Symbol, dynamic> namedArguments]) {
+    return _reflect(
+        Function.apply(reflectee, positionalArguments, namedArguments));
+  }
+
+  Future<InstanceMirror> applyAsync(List positionalArguments,
+                                    [Map<Symbol, dynamic> namedArguments]) {
+    return new Future<InstanceMirror>(
+        () => apply(positionalArguments, namedArguments));
+  }
+}
+
+class _MethodMirror implements MethodMirror {
+  final _jsFunction;
+  final int _parameterCount;
+
+  _MethodMirror(this._jsFunction, this._parameterCount);
+
+  List<ParameterMirror> get parameters {
+    // TODO(ahe): Fill the list with parameter mirrors.
+    return new List<ParameterMirror>(_parameterCount);
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index ae43bed..cb5b362 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -1129,7 +1129,7 @@
    *
    * Invariant: [function] must be an implementation element.
    */
-  InliningState enterInlinedMethod(PartialFunctionElement function,
+  InliningState enterInlinedMethod(FunctionElement function,
                                    Selector selector,
                                    Link<Node> argumentsNodes,
                                    List<HInstruction> providedArguments,
@@ -1139,7 +1139,7 @@
     List<HInstruction> compiledArguments;
     bool isInstanceMember = function.isInstanceMember();
 
-    if (isInstanceMember) {
+    if (isInstanceMember && !function.isGenerativeConstructorBody()) {
       assert(providedArguments != null);
       compiledArguments = new List<HInstruction>();
       compiledArguments.add(providedArguments[0]);
@@ -1186,36 +1186,22 @@
                                    compiledArguments[argumentIndex++]);
     }
 
-    if (function.isConstructor()) {
-      ClassElement enclosing = function.getEnclosingClass();
-      if (backend.needsRti(enclosing)) {
-        assert(currentNode is NewExpression);
-        InterfaceType type = elements.getType(currentNode);
-        Link<DartType> typeVariable = enclosing.typeVariables;
-        type.typeArguments.forEach((DartType argument) {
-          HInstruction instruction =
-              analyzeTypeArgument(argument, currentNode);
-          newLocalsHandler.updateLocal(typeVariable.head.element, instruction);
-          typeVariable = typeVariable.tail;
-        });
-        while (!typeVariable.isEmpty) {
-          newLocalsHandler.updateLocal(typeVariable.head.element,
-                                       graph.addConstantNull(constantSystem));
-          typeVariable = typeVariable.tail;
-        }
-      }
-    }
-
-    // Check the type of the arguments.  This must be done after setting up the
-    // type variables in the [localsHandler] because the checked types may
-    // contain type variables.
     FunctionSignature signature = function.computeSignature(compiler);
     signature.orderedForEachParameter((Element parameter) {
       HInstruction argument = compiledArguments[argumentIndex++];
       newLocalsHandler.updateLocal(parameter, argument);
-      potentiallyCheckType(argument, parameter.computeType(compiler));
     });
 
+    ClassElement enclosing = function.getEnclosingClass();
+    if ((function.isConstructor() || function.isGenerativeConstructorBody())
+        && backend.needsRti(enclosing)) {
+      enclosing.typeVariables.forEach((TypeVariableType typeVariable) {
+        HInstruction argument = compiledArguments[argumentIndex++];
+        newLocalsHandler.updateLocal(typeVariable.element, argument);
+      });
+    }
+    assert(argumentIndex == compiledArguments.length);
+
     // TODO(kasperl): Bad smell. We shouldn't be constructing elements here.
     returnElement = new ElementX(const SourceString("result"),
                                  ElementKind.VARIABLE,
@@ -1262,14 +1248,13 @@
     if (compiler.disableInlining) return false;
     // Ensure that [element] is an implementation element.
     element = element.implementation;
-    // TODO(floitsch): we should be able to inline inside lazy initializers.
-    if (!currentElement.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.
-    if (element is !PartialFunctionElement) return false;
-    // TODO(ngeoffray): try to inline generative constructors. They
-    // don't have any body, which make it more difficult.
+    if (element is !PartialFunctionElement
+        && !element.isGenerativeConstructorBody()) {
+      return false;
+    }
     if (inliningStack.length > MAX_INLINING_DEPTH) return false;
     // Don't inline recursive calls. We use the same elements for the inlined
     // functions and would thus clobber our local variables.
@@ -1279,10 +1264,12 @@
       if (inliningStack[i].function == element) return false;
     }
 
-    PartialFunctionElement function = element;
+    FunctionElement function = element;
     bool canBeInlined = backend.canBeInlined[function];
     if (canBeInlined == false) return false;
-    assert(selector != null || Elements.isStaticOrTopLevel(element));
+    assert(selector != null
+           || Elements.isStaticOrTopLevel(element)
+           || element.isGenerativeConstructorBody());
     if (selector != null && !selector.applies(function, compiler)) return false;
 
     // Don't inline operator== methods if the parameter can be null.
@@ -1306,31 +1293,31 @@
       if (!canBeInlined) return false;
     }
 
-    // We cannot inline methods with type variables in the signature in checked
-    // mode, because we currently do not have access to the type variables
-    // through the locals.
-    // TODO(karlklose): remove this and enable inlining of these methods.
-    if (compiler.enableTypeAssertions &&
-        element.computeType(compiler).containsTypeVariables) {
-      return false;
-    }
-
     assert(canBeInlined);
     // Add an explicit null check on the receiver before doing the
     // inlining. We use [element] to get the same name in the NoSuchMethodError
     // message as if we had called it.
     if (element.isInstanceMember()
+        && !element.isGenerativeConstructorBody()
         && (selector.mask == null || selector.mask.isNullable)) {
       addWithPosition(
           new HFieldGet(element, providedArguments[0]), currentNode);
     }
     InliningState state = enterInlinedMethod(
         function, selector, argumentsNodes, providedArguments, currentNode);
+
     inlinedFrom(element, () {
+      FunctionElement function = element;
+      FunctionSignature signature = function.computeSignature(compiler);
+      signature.orderedForEachParameter((Element parameter) {
+        HInstruction argument = localsHandler.readLocal(parameter);
+        potentiallyCheckType(argument, parameter.computeType(compiler));
+      });
       element.isGenerativeConstructor()
           ? buildFactory(element)
           : functionExpression.body.accept(this);
     });
+
     leaveInlinedMethod(state);
     return true;
   }
@@ -1686,10 +1673,15 @@
         bodyCallInputs.add(localsHandler.readLocal(scopeData.boxElement));
       }
 
-      HInvokeConstructorBody invoke =
-          new HInvokeConstructorBody(body, bodyCallInputs);
-      invoke.sideEffects = compiler.world.getSideEffectsOfElement(constructor);
-      add(invoke);
+      if (tryInlineMethod(body, null, null, bodyCallInputs, function)) {
+        pop();
+      } else {
+        HInvokeConstructorBody invoke =
+            new HInvokeConstructorBody(body, bodyCallInputs);
+        invoke.sideEffects =
+            compiler.world.getSideEffectsOfElement(constructor);
+        add(invoke);
+      }
     }
     if (inliningStack.isEmpty) {
       closeAndGotoExit(new HReturn(newObject));
@@ -3514,7 +3506,7 @@
                        HType.STRING);
       pushInvokeStatic(node,
                        backend.getCreateRuntimeType(),
-                       [pop(), value]);
+                       [pop()]);
     } else {
       internalError('unexpected element kind $element', node: node);
     }
@@ -5145,7 +5137,7 @@
    *
    * Invariant: [function] must be an implementation element.
    */
-  final PartialFunctionElement function;
+  final FunctionElement function;
   final Element oldReturnElement;
   final DartType oldReturnType;
   final TreeElements oldElements;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index d420f27..76b6bff 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -2204,6 +2204,32 @@
     push(new js.Binary('!=', pop(), new js.LiteralNull()));
   }
 
+  void checkIndexingBehavior(HInstruction input, {bool negative: false}) {
+    use(input);
+    js.Expression object = pop();
+
+    Element dispatchProperty =
+        compiler.findInterceptor(const SourceString('dispatchPropertyName'));
+    String dispatchPropertyName =
+        backend.namer.isolateAccess(dispatchProperty);
+    world.registerStaticUse(dispatchProperty);
+
+    // We pass the dispatch property record to the isJsIndexable
+    // helper rather than reading it inside the helper to increase the
+    // chance of making the dispatch record access monomorphic.
+    use(input);
+    js.PropertyAccess record = new js.PropertyAccess(
+        pop(), new js.VariableUse(dispatchPropertyName));
+
+    List<js.Expression> arguments = <js.Expression>[object, record];
+    FunctionElement helper =
+        compiler.findHelper(const SourceString('isJsIndexable'));
+    world.registerStaticUse(helper);
+    String helperName = backend.namer.isolateAccess(helper);
+    push(new js.Call(new js.VariableUse(helperName), arguments));
+    if (negative) push(new js.Prefix('!', pop()));
+  }
+
   void checkType(HInstruction input, DartType type, {bool negative: false}) {
     assert(invariant(input, !type.isMalformed,
                      message: 'Attempt to check malformed type $type'));
@@ -2396,8 +2422,6 @@
 
   js.Expression generateTest(HCheck node) {
     HInstruction input = node.checkedInput;
-    DartType indexingBehavior =
-        backend.jsIndexingBehaviorInterface.computeType(compiler);
     js.Expression test;
     if (node.isInteger()) {
       // input is !int
@@ -2434,7 +2458,7 @@
       js.Expression arrayTest = pop();
       checkImmutableArray(input);
       js.Binary notArrayOrImmutable = new js.Binary('||', arrayTest, pop());
-      checkType(input, indexingBehavior, negative: true);
+      checkIndexingBehavior(input, negative: true);
       js.Binary notIndexing = new js.Binary('&&', notArrayOrImmutable, pop());
       test = new js.Binary('||', objectTest, notIndexing);
     } else if (node.isReadableArray()) {
@@ -2444,7 +2468,7 @@
       js.Expression objectTest = pop();
       checkArray(input, '!==');
       js.Expression arrayTest = pop();
-      checkType(input, indexingBehavior, negative: true);
+      checkIndexingBehavior(input, negative: true);
       js.Expression notIndexing = new js.Binary('&&', arrayTest, pop());
       test = new js.Binary('||', objectTest, notIndexing);
     } else if (node.isIndexablePrimitive()) {
@@ -2457,7 +2481,7 @@
       js.Expression objectTest = pop();
       checkArray(input, '!==');
       js.Expression arrayTest = pop();
-      checkType(input, indexingBehavior, negative: true);
+      checkIndexingBehavior(input, negative: true);
       js.Binary notIndexingTest = new js.Binary('&&', arrayTest, pop());
       js.Binary notObjectOrIndexingTest =
           new js.Binary('||', objectTest, notIndexingTest);
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 501beed..6ad589e 100644
--- a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
@@ -353,7 +353,7 @@
         new Map<Element, ConcreteType>.from(environment);
     other.environment.forEach((element, type) {
       ConcreteType currentType = newMap[element];
-      if (element == null) {
+      if (currentType == null) {
         newMap[element] = type;
       } else {
         newMap[element] = currentType.union(type);
@@ -622,6 +622,9 @@
   /** The empty concrete type */
   ConcreteType emptyConcreteType;
 
+  /** The null concrete type */
+  ConcreteType nullConcreteType;
+
   /** Creates a singleton concrete type containing [baseType]. */
   ConcreteType singletonConcreteType(BaseType baseType) {
     return new ConcreteType.singleton(compiler.maxConcreteTypeSize, baseTypes,
@@ -983,7 +986,7 @@
       // 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());
+      result[parameter] = nullConcreteType;
     }
 
     final Iterator<ConcreteType> remainingPositionalArguments =
@@ -1074,7 +1077,7 @@
     List typesReturned = nativeBehavior.typesReturned;
     if (typesReturned.isEmpty) return unknownConcreteType;
 
-    ConcreteType result = singletonConcreteType(const NullBaseType());
+    ConcreteType result = nullConcreteType;
     for (final type in typesReturned) {
       var concreteType;
 
@@ -1258,7 +1261,7 @@
 
     // set uninitialized fields to null
     for (VariableElement field in uninitializedFields) {
-      augmentFieldType(field, singletonConcreteType(const NullBaseType()));
+      augmentFieldType(field, nullConcreteType);
     }
 
     // if no call to super or redirect has been found, call the default
@@ -1294,7 +1297,7 @@
           listConstructor.functionSignature.optionalParameters;
       ConcreteType lengthType = environment.lookupType(parameters.head);
       if (lengthType.baseTypes.contains(baseTypes.intBaseType)) {
-        augmentListElementType(singletonConcreteType(const NullBaseType()));
+        augmentListElementType(nullConcreteType);
       }
       return singletonConcreteType(baseTypes.listBaseType);
     }
@@ -1317,6 +1320,7 @@
                                   compiler.numClass]);
     emptyConcreteType = new ConcreteType.empty(compiler.maxConcreteTypeSize,
                                                baseTypes);
+    nullConcreteType = singletonConcreteType(const NullBaseType());
     listElementType = emptyConcreteType;
   }
 
@@ -1527,7 +1531,10 @@
       }
       return result;
     }
-    inferrer.fail(node, 'not yet implemented');
+    Element element = elements[node];
+    assert(element != null);
+    environment = environment.put(element, inferrer.nullConcreteType);
+    return inferrer.nullConcreteType;
   }
 
   ConcreteType visitIf(If node) {
@@ -1707,7 +1714,7 @@
   }
 
   ConcreteType visitLiteralNull(LiteralNull node) {
-    return inferrer.singletonConcreteType(const NullBaseType());
+    return inferrer.nullConcreteType;
   }
 
   ConcreteType visitNewExpression(NewExpression node) {
@@ -1748,7 +1755,7 @@
   ConcreteType visitReturn(Return node) {
     final expression = node.expression;
     return (expression == null)
-        ? inferrer.singletonConcreteType(const NullBaseType())
+        ? inferrer.nullConcreteType
         : analyze(expression);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart b/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
index 8f3cda3..0f0ee58 100644
--- a/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
@@ -366,15 +366,13 @@
     return new TypeMask(null, EMPTY, isNullable && other.isNullable);
   }
 
-  Set<ClassElement> containedClasses(Compiler compiler) {
-    ClassElement element = base.element;
+  Iterable<ClassElement> containedClasses(Compiler compiler) {
+    Iterable<ClassElement> self = [ base.element ];
     if (isExact) {
-      return new Set<ClassElement>()..add(element);
-    } else if (isSubclass) {
-      return compiler.world.subclassesOf(element);
+      return self;
     } else {
-      assert(isSubtype);
-      return compiler.world.subtypesOf(element);
+      Set<ClassElement> subset = containedSubset(this, compiler);
+      return (subset == null) ? self : [ self, subset ].expand((x) => x);
     }
   }
 
@@ -545,9 +543,9 @@
   static Set<ClassElement> commonContainedClasses(FlatTypeMask x,
                                                   FlatTypeMask y,
                                                   Compiler compiler) {
-    Set<ClassElement> xSubset = x.containedClasses(compiler);
+    Set<ClassElement> xSubset = containedSubset(x, compiler);
     if (xSubset == null) return null;
-    Set<ClassElement> ySubset = y.containedClasses(compiler);
+    Set<ClassElement> ySubset = containedSubset(y, compiler);
     if (ySubset == null) return null;
     Set<ClassElement> smallSet, largeSet;
     if (xSubset.length <= ySubset.length) {
@@ -560,4 +558,16 @@
     var result = smallSet.where((ClassElement each) => largeSet.contains(each));
     return result.toSet();
   }
+
+  static Set<ClassElement> containedSubset(FlatTypeMask x, Compiler compiler) {
+    ClassElement element = x.base.element;
+    if (x.isExact) {
+      return null;
+    } else if (x.isSubclass) {
+      return compiler.world.subclassesOf(element);
+    } else {
+      assert(x.isSubtype);
+      return compiler.world.subtypesOf(element);
+    }
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
index 587e404..c6c2e26 100644
--- a/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
@@ -1061,25 +1061,6 @@
     return null;
   }
 
-  bool isTargetFor(TypeMask receiverType, Selector selector, Element element) {
-    bool isReceiverDynamic = isDynamicType(receiverType);
-    assert(selector.mask == receiverType
-           || (selector.mask == null && isReceiverDynamic));
-    // TODO(ngeoffray) : The following noSuchMethod handling is a bit
-    // convoluted, we should make it easier to know what we are sure
-    // we cannot hit.
-    if (element.name != selector.name) {
-      assert(element.name == Compiler.NO_SUCH_METHOD);
-      return isReceiverDynamic
-          || (!receiverType.willHit(selector, compiler)
-              && receiverType.canHit(
-                    element, compiler.noSuchMethodSelector, compiler));
-    } else {
-      return isReceiverDynamic
-          || receiverType.canHit(element, selector, compiler);
-    }
-  }
-
   /**
    * Registers that [caller] calls an element matching [selector]
    * with the given [arguments].
@@ -1093,9 +1074,15 @@
                                   SideEffects sideEffects,
                                   bool inLoop) {
     TypeMask result;
-    iterateOverElements(selector.asUntyped, (Element element) {
-      assert(element.isImplementation);
-      if (isTargetFor(receiverType, selector, element)) {
+    Iterable<Element> untypedTargets =
+        compiler.world.allFunctions.filter(selector.asUntyped);
+    Iterable<Element> typedTargets =
+        compiler.world.allFunctions.filter(selector);
+    for (Element element in untypedTargets) {
+      element = element.implementation;
+      if (!typedTargets.contains(element.declaration)) {
+        unregisterCalledElement(node, selector, caller, element);
+      } else {
         registerCalledElement(
             node, selector, caller, element, arguments,
             constraint, sideEffects, inLoop);
@@ -1105,11 +1092,8 @@
           if (type == null) type = typeOfElementWithSelector(element, selector);
           result = computeLUB(result, type);
         }
-      } else {
-        unregisterCalledElement(node, selector, caller, element);
       }
-      return true;
-    });
+    }
 
     if (result == null) {
       result = dynamicType;
@@ -1501,6 +1485,8 @@
   bool visitingInitializers = false;
   bool isConstructorRedirect = false;
   bool accumulateIsChecks = false;
+  bool conditionIsSimple = false;
+
   List<Send> isChecks;
   int loopLevel = 0;
   SideEffects sideEffects = new SideEffects.empty();
@@ -2120,6 +2106,7 @@
     if (const SourceString("[]") == op.source) {
       return visitDynamicSend(node);
     } else if (const SourceString("&&") == op.source) {
+      conditionIsSimple = false;
       bool oldAccumulateIsChecks = accumulateIsChecks;
       accumulateIsChecks = true;
       if (isChecks == null) isChecks = <Send>[];
@@ -2132,6 +2119,7 @@
       locals.merge(saved);
       return inferrer.boolType;
     } else if (const SourceString("||") == op.source) {
+      conditionIsSimple = false;
       visit(node.receiver);
       LocalsHandler saved = new LocalsHandler.from(locals);
       updateIsChecks(isChecks, usePositive: false);
@@ -2323,13 +2311,14 @@
   }
 
   TypeMask visitConditional(Conditional node) {
-    List<Send> tests = handleCondition(node.condition);
+    List<Send> tests = <Send>[];
+    bool simpleCondition = handleCondition(node.condition, tests);
     LocalsHandler saved = new LocalsHandler.from(locals);
     updateIsChecks(tests, usePositive: true);
     TypeMask firstType = visit(node.thenExpression);
     LocalsHandler thenLocals = locals;
     locals = saved;
-    updateIsChecks(tests, usePositive: false);
+    if (simpleCondition) updateIsChecks(tests, usePositive: false);
     TypeMask secondType = visit(node.elseExpression);
     locals.merge(thenLocals);
     TypeMask type = inferrer.computeLUB(firstType, secondType);
@@ -2351,26 +2340,30 @@
     return inferrer.dynamicType;
   }
 
-  List<Send> handleCondition(Node node) {
+  bool handleCondition(Node node, List<Send> tests) {
+    bool oldConditionIsSimple = conditionIsSimple;
     bool oldAccumulateIsChecks = accumulateIsChecks;
     List<Send> oldIsChecks = isChecks;
-    List<Send> tests = <Send>[];
     accumulateIsChecks = true;
+    conditionIsSimple = true;
     isChecks = tests;
     visit(node);
+    bool simpleCondition = conditionIsSimple;
     accumulateIsChecks = oldAccumulateIsChecks;
     isChecks = oldIsChecks;
-    return tests;
+    conditionIsSimple = oldConditionIsSimple;
+    return simpleCondition;
   }
 
   TypeMask visitIf(If node) {
-    List<Send> tests = handleCondition(node.condition);
+    List<Send> tests = <Send>[];
+    bool simpleCondition = handleCondition(node.condition, tests);
     LocalsHandler saved = new LocalsHandler.from(locals);
     updateIsChecks(tests, usePositive: true);
     visit(node.thenPart);
     LocalsHandler thenLocals = locals;
     locals = saved;
-    updateIsChecks(tests, usePositive: false);
+    if (simpleCondition) updateIsChecks(tests, usePositive: false);
     visit(node.elsePart);
     locals.merge(thenLocals);
     return inferrer.dynamicType;
@@ -2425,7 +2418,8 @@
 
   TypeMask visitWhile(While node) {
     return handleLoop(node, () {
-      List<Send> tests = handleCondition(node.condition);
+      List<Send> tests = <Send>[];
+      handleCondition(node.condition, tests);
       updateIsChecks(tests, usePositive: true);
       visit(node.body);
     });
@@ -2434,7 +2428,8 @@
   TypeMask visitDoWhile(DoWhile node) {
     return handleLoop(node, () {
       visit(node.body);
-      List<Send> tests = handleCondition(node.condition);
+      List<Send> tests = <Send>[];
+      handleCondition(node.condition, tests);
       updateIsChecks(tests, usePositive: true);
     });
   }
@@ -2442,7 +2437,8 @@
   TypeMask visitFor(For node) {
     visit(node.initializer);
     return handleLoop(node, () {
-      List<Send> tests = handleCondition(node.condition);
+      List<Send> tests = <Send>[];
+      handleCondition(node.condition, tests);
       updateIsChecks(tests, usePositive: true);
       visit(node.body);
       visit(node.update);
@@ -2621,6 +2617,15 @@
       locals = result;
     }
     clearBreaksAndContinues(elements[node]);
+    // In case there is a default in the switch we discard the
+    // incoming localsHandler, because the types it holds do not need
+    // to be merged after the switch statement. This means that, if all
+    // cases, including the default, break or continue, the [result]
+    // handler may think it just aborts the current block. Therefore
+    // we set the current locals to not have any break or continue, so
+    // that the [visitBlock] method does not assume the code after the
+    // switch is dead code.
+    locals.seenBreakOrContinue = false;
     return inferrer.dynamicType;
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/types/type_mask.dart b/sdk/lib/_internal/compiler/implementation/types/type_mask.dart
index 905021c..c00b4bd 100644
--- a/sdk/lib/_internal/compiler/implementation/types/type_mask.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/type_mask.dart
@@ -79,9 +79,9 @@
   ClassElement singleClass(Compiler compiler);
 
   /**
-   * Returns the set of classes this type mask can be.
+   * Returns the classes this type mask can be.
    */
-  Set<ClassElement> containedClasses(Compiler compiler);
+  Iterable<ClassElement> containedClasses(Compiler compiler);
 
   /**
    * Returns a type mask representing the union of [this] and [other].
diff --git a/sdk/lib/_internal/compiler/implementation/types/union_type_mask.dart b/sdk/lib/_internal/compiler/implementation/types/union_type_mask.dart
index 82865d5..0eb33f6 100644
--- a/sdk/lib/_internal/compiler/implementation/types/union_type_mask.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/union_type_mask.dart
@@ -160,7 +160,7 @@
     for (TypeMask current in disjointMasks) {
       if (other.isUnion) {
         for (FlatTypeMask flatOther in other.disjointMasks) {
-          intersections.add(current.intersection(flatOther, compiler)); 
+          intersections.add(current.intersection(flatOther, compiler));
         }
       } else {
         intersections.add(current.intersection(other, compiler));
@@ -215,10 +215,9 @@
 
   ClassElement singleClass(Compiler compiler) => null;
 
-  Set<ClassElement> containedClasses(Compiler compiler) {
-    Set<ClassElement> set = new Set<ClassElement>();
-    disjointMasks.forEach((e) => set.addAll(e.containedClasses(compiler)));
-    return set;
+  Iterable<ClassElement> containedClasses(Compiler compiler) {
+    return disjointMasks.expand(
+        (TypeMask mask) => mask.containedClasses(compiler));
   }
 
   /**
diff --git a/sdk/lib/_internal/compiler/implementation/universe/full_function_set.dart b/sdk/lib/_internal/compiler/implementation/universe/full_function_set.dart
deleted file mode 100644
index 268fce6..0000000
--- a/sdk/lib/_internal/compiler/implementation/universe/full_function_set.dart
+++ /dev/null
@@ -1,73 +0,0 @@
-// 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 universe;
-
-class FullFunctionSet extends FunctionSet {
-  FullFunctionSet(Compiler compiler) : super(compiler);
-
-  FunctionSetNode newNode(SourceString name)
-      => new FullFunctionSetNode(name);
-}
-
-class FullFunctionSetNode extends FunctionSetNode {
-  // To cut down on the time we spend on computing type information
-  // about the function holders, we limit the number of classes and
-  // the number of steps it takes to compute them.
-  static const int MAX_CLASSES = 4;
-  static const int MAX_CLASSES_STEPS = 32;
-
-  FullFunctionSetNode(SourceString name) : super(name);
-
-  FunctionSetQuery newQuery(List<Element> functions,
-                            Selector selector,
-                            Compiler compiler) {
-    List<ClassElement> classes = computeClasses(functions, compiler);
-    bool isExact = selector.hasExactMask || isExactClass(classes, compiler);
-    return new FullFunctionSetQuery(functions, classes, isExact);
-  }
-
-  static List<ClassElement> computeClasses(List<Element> functions,
-                                           Compiler compiler) {
-    // TODO(kasperl): Check if any of the found classes may have a
-    // non-throwing noSuchMethod implementation in a subclass instead
-    // of always disabling the class list computation.
-    if (compiler.enabledNoSuchMethod) return null;
-    List<ClassElement> classes = <ClassElement>[];
-    int budget = MAX_CLASSES_STEPS;
-    L: for (Element element in functions) {
-      ClassElement enclosing = element.getEnclosingClass();
-      for (int i = 0; i < classes.length; i++) {
-        if (--budget <= 0) {
-          return null;
-        } else if (enclosing.isSubclassOf(classes[i])) {
-          continue L;
-        } else if (classes[i].isSubclassOf(enclosing)) {
-          classes[i] = enclosing;
-          continue L;
-        }
-      }
-      if (classes.length >= MAX_CLASSES) return null;
-      classes.add(enclosing);
-    }
-    return classes;
-  }
-
-  static bool isExactClass(List<ClassElement> classes, Compiler compiler) {
-    if (classes == null || classes.length != 1) return false;
-    ClassElement single = classes[0];
-    // Return true if the single class in our list does not have a
-    // single instantiated subclass.
-    Set<ClassElement> subtypes = compiler.world.subtypesOf(single);
-    return subtypes == null
-        || subtypes.every((ClassElement each) => !each.isSubclassOf(single));
-  }
-}
-
-class FullFunctionSetQuery extends FunctionSetQuery {
-  final List<ClassElement> classes;
-  final bool isExact;
-  FullFunctionSetQuery(List<Element> functions, this.classes, this.isExact)
-      : super(functions);
-}
diff --git a/sdk/lib/_internal/compiler/implementation/universe/function_set.dart b/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
index 2472d07..6d3f4b7 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
@@ -147,14 +147,14 @@
     assert(selector.name == name);
     FunctionSetQuery result = cache[selector];
     if (result != null) return result;
-    List<Element> functions;
+    Set<Element> functions;
     for (Element element in elements) {
       if (selector.appliesUnnamed(element, compiler)) {
         if (functions == null) {
-          // Defer the allocation of the functions list until we are
+          // Defer the allocation of the functions set until we are
           // sure we need it. This allows us to return immutable empty
           // lists when the filtering produced no results.
-          functions = <Element>[];
+          functions = new Set<Element>();
         }
         functions.add(element);
       }
@@ -171,7 +171,7 @@
           null);
       if (!noSuchMethodQuery.functions.isEmpty) {
         if (functions == null) {
-          functions = new List<Element>.from(noSuchMethodQuery.functions);
+          functions = new Set<Element>.from(noSuchMethodQuery.functions);
         } else {
           functions.addAll(noSuchMethodQuery.functions);
         }
@@ -183,7 +183,7 @@
     return result;
   }
 
-  FunctionSetQuery newQuery(List<Element> functions,
+  FunctionSetQuery newQuery(Iterable<Element> functions,
                             Selector selector,
                             Compiler compiler) {
     return new FunctionSetQuery(functions);
@@ -191,6 +191,6 @@
 }
 
 class FunctionSetQuery {
-  final List<Element> functions;
+  final Iterable<Element> functions;
   const FunctionSetQuery(this.functions);
 }
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index ecead0f..764a4d4 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -14,7 +14,6 @@
 import '../js/js.dart' as js;
 
 part 'function_set.dart';
-part 'full_function_set.dart';
 part 'selector_map.dart';
 part 'side_effects.dart';
 
diff --git a/sdk/lib/_internal/compiler/implementation/world.dart b/sdk/lib/_internal/compiler/implementation/world.dart
index 122bd9e..65a9957 100644
--- a/sdk/lib/_internal/compiler/implementation/world.dart
+++ b/sdk/lib/_internal/compiler/implementation/world.dart
@@ -6,7 +6,7 @@
 
 class World {
   final Compiler compiler;
-  final FullFunctionSet allFunctions;
+  final FunctionSet allFunctions;
   final Set<Element> functionsCalledInLoop = new Set<Element>();
   final Map<Element, SideEffects> sideEffects = new Map<Element, SideEffects>();
 
@@ -44,11 +44,11 @@
   }
 
   Set<ClassElement> typesImplementedBySubclassesOf(ClassElement cls) {
-    return _typesImplementedBySubclasses[cls];
+    return _typesImplementedBySubclasses[cls.declaration];
   }
 
   World(Compiler compiler)
-      : allFunctions = new FullFunctionSet(compiler),
+      : allFunctions = new FunctionSet(compiler),
         this.compiler = compiler;
 
   void populate() {
diff --git a/sdk/lib/_internal/pub/bin/pub.dart b/sdk/lib/_internal/pub/bin/pub.dart
index d8e26ed..5c893e1 100644
--- a/sdk/lib/_internal/pub/bin/pub.dart
+++ b/sdk/lib/_internal/pub/bin/pub.dart
@@ -17,62 +17,53 @@
 import '../lib/src/system_cache.dart';
 import '../lib/src/utils.dart';
 
-/// The parser for arguments that are global to Pub rather than specific to a
-/// single command.
-ArgParser get pubArgParser {
-  var parser = new ArgParser();
-  parser.addFlag('help', abbr: 'h', negatable: false,
-      help: 'Print this usage information.');
-  parser.addFlag('version', negatable: false,
-      help: 'Print pub version.');
-  parser.addFlag('trace',
-       help: 'Print debugging information when an error occurs.');
-  parser.addOption('verbosity',
-      help: 'Control output verbosity.',
-      allowed: ['normal', 'io', 'solver', 'all'],
-      allowedHelp: {
-        'normal': 'Show errors, warnings, and user messages.',
-        'io':     'Also show IO operations.',
-        'solver': 'Show steps during version resolution.',
-        'all':    'Show all output including internal tracing messages.'
-      });
-  parser.addFlag('verbose', abbr: 'v', negatable: false,
-      help: 'Shortcut for "--verbosity=all".');
-  return parser;
-}
+final pubArgParser = initArgParser();
 
 void main() {
-  var globalOptions;
+  ArgResults options;
+
   try {
-    globalOptions = pubArgParser.parse(new Options().arguments);
+    options = pubArgParser.parse(new Options().arguments);
   } on FormatException catch (e) {
     log.error(e.message);
     log.error('Run "pub help" to see available options.');
     exit(exit_codes.USAGE);
   }
 
-  if (globalOptions['version']) {
+  if (options['version']) {
     log.message('Pub ${sdk.version}');
     return;
   }
 
-  if (globalOptions['help'] || globalOptions.rest.isEmpty) {
+  if (options['help']) {
     printUsage();
     return;
   }
 
-  if (globalOptions['trace']) {
+  if (options.command == null) {
+    if (options.rest.isEmpty) {
+      // No command was chosen.
+      printUsage();
+    } else {
+      log.error('Could not find a command named "${options.rest[0]}".');
+      log.error('Run "pub help" to see available commands.');
+      exit(exit_codes.USAGE);
+    }
+    return;
+  }
+
+  if (options['trace']) {
     log.recordTranscript();
   }
 
-  switch (globalOptions['verbosity']) {
+  switch (options['verbosity']) {
     case 'normal': log.showNormal(); break;
-    case 'io': log.showIO(); break;
+    case 'io':     log.showIO(); break;
     case 'solver': log.showSolver(); break;
-    case 'all': log.showAll(); break;
+    case 'all':    log.showAll(); break;
     default:
       // No specific verbosity given, so check for the shortcut.
-      if (globalOptions['verbose']) {
+      if (options['verbose']) {
         log.showAll();
       } else {
         log.showNormal();
@@ -93,20 +84,40 @@
   }
 
   validatePlatform().then((_) {
-    // Select the command.
-    var command = PubCommand.commands[globalOptions.rest[0]];
-    if (command == null) {
-      log.error('Could not find a command named "${globalOptions.rest[0]}".');
-      log.error('Run "pub help" to see available commands.');
-      exit(exit_codes.USAGE);
-      return;
-    }
-
-    var commandArgs = globalOptions.rest.sublist(1);
-    command.run(cacheDir, globalOptions, commandArgs);
+    PubCommand.commands[options.command.name].run(cacheDir, options);
   });
 }
 
+ArgParser initArgParser() {
+  var argParser = new ArgParser();
+
+  // Add the global options.
+  argParser.addFlag('help', abbr: 'h', negatable: false,
+      help: 'Print this usage information.');
+  argParser.addFlag('version', negatable: false,
+      help: 'Print pub version.');
+  argParser.addFlag('trace',
+       help: 'Print debugging information when an error occurs.');
+  argParser.addOption('verbosity',
+      help: 'Control output verbosity.',
+      allowed: ['normal', 'io', 'solver', 'all'],
+      allowedHelp: {
+        'normal': 'Show errors, warnings, and user messages.',
+        'io':     'Also show IO operations.',
+        'solver': 'Show steps during version resolution.',
+        'all':    'Show all output including internal tracing messages.'
+      });
+  argParser.addFlag('verbose', abbr: 'v', negatable: false,
+      help: 'Shortcut for "--verbosity=all".');
+
+  // Register the commands.
+  PubCommand.commands.forEach((name, command) {
+    argParser.addCommand(name, command.commandParser);
+  });
+
+  return argParser;
+}
+
 /// Checks that pub is running on a supported platform. If it isn't, it prints
 /// an error message and exits. Completes when the validation is done.
 Future validatePlatform() {
diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
index 68bbf32..d1f8516 100644
--- a/sdk/lib/_internal/pub/lib/src/command.dart
+++ b/sdk/lib/_internal/pub/lib/src/command.dart
@@ -27,27 +27,11 @@
 /// The base class for commands for the pub executable.
 abstract class PubCommand {
   /// The commands that Pub understands.
-  static Map<String, PubCommand> get commands {
-    var commands = {
-      'cache': new CacheCommand(),
-      'deploy': new DeployCommand(),
-      'help': new HelpCommand(),
-      'install': new InstallCommand(),
-      'publish': new LishCommand(),
-      'update': new UpdateCommand(),
-      'uploader': new UploaderCommand(),
-      'version': new VersionCommand()
-     };
-    for (var command in commands.values.toList()) {
-      for (var alias in command.aliases) {
-        commands[alias] = command;
-      }
-    }
-    return commands;
-  }
+  static final Map<String, PubCommand> commands = _initCommands();
 
   SystemCache cache;
-  ArgResults globalOptions;
+
+  /// The parsed options for this command.
   ArgResults commandOptions;
 
   Entrypoint entrypoint;
@@ -67,25 +51,26 @@
   /// documentation, but they will work when invoked on the command line.
   final aliases = const <String>[];
 
-  /// Override this to define command-specific options. The results will be made
-  /// available in [commandOptions].
-  ArgParser get commandParser => new ArgParser();
+  /// The [ArgParser] for this command.
+  final commandParser = new ArgParser();
 
   /// Override this to use offline-only sources instead of hitting the network.
   /// This will only be called before the [SystemCache] is created. After that,
   /// it has no effect.
   bool get isOffline => false;
 
-  void run(String cacheDir, ArgResults globalOptions_,
-      List<String> commandArgs) {
-    globalOptions = globalOptions_;
+  PubCommand() {
+    // Allow "--help" after a command to get command help.
+    commandParser.addFlag('help', abbr: 'h', negatable: false,
+        help: 'Print usage information for this command.');
+  }
 
-    try {
-      commandOptions = commandParser.parse(commandArgs);
-    } on FormatException catch (e) {
-      log.error(e.message);
-      log.error('Use "pub help" for more information.');
-      exit(exit_codes.USAGE);
+  void run(String cacheDir, ArgResults options) {
+    commandOptions = options.command;
+
+    if (commandOptions['help']) {
+      this.printUsage();
+      return;
     }
 
     cache = new SystemCache.withSources(cacheDir, isOffline: isOffline);
@@ -113,14 +98,14 @@
       log.error(message);
 
       if (trace != null) {
-        if (globalOptions['trace'] || !isUserFacingException(error)) {
+        if (options['trace'] || !isUserFacingException(error)) {
           log.error(trace);
         } else {
           log.fine(trace);
         }
       }
 
-      if (globalOptions['trace']) {
+      if (options['trace']) {
         log.dumpTranscript();
       } else if (!isUserFacingException(error)) {
         log.error("""
@@ -198,3 +183,24 @@
     }
   }
 }
+
+_initCommands() {
+  var commands = {
+    'cache': new CacheCommand(),
+    'deploy': new DeployCommand(),
+    'help': new HelpCommand(),
+    'install': new InstallCommand(),
+    'publish': new LishCommand(),
+    'update': new UpdateCommand(),
+    'uploader': new UploaderCommand(),
+    'version': new VersionCommand()
+  };
+
+  for (var command in commands.values.toList()) {
+    for (var alias in command.aliases) {
+      commands[alias] = command;
+    }
+  }
+
+  return commands;
+}
diff --git a/sdk/lib/_internal/pub/lib/src/command_deploy.dart b/sdk/lib/_internal/pub/lib/src/command_deploy.dart
index 94decb6..7261b12 100644
--- a/sdk/lib/_internal/pub/lib/src/command_deploy.dart
+++ b/sdk/lib/_internal/pub/lib/src/command_deploy.dart
@@ -49,8 +49,8 @@
       _computeLogSize();
 
       cleanDir(target);
-      _logAction("Copying", "${path.relative(source)}/",
-          "${path.relative(target)}/");
+      _logAction("Copying", "${path.relative(source)}${path.separator}",
+          "${path.relative(target)}${path.separator}");
       copyFiles(files.where((file) => path.extension(file) != '.dart'),
           source, target);
 
@@ -105,7 +105,7 @@
         .map((verb) => verb.length).reduce(math.max);
     var sourceLengths = new List.from(
             _entrypoints.map((file) => path.relative(file).length))
-        ..add("${path.relative(source)}/".length);
+        ..add("${path.relative(source)}${path.separator}".length);
     if (_shouldAddDartJs) sourceLengths.add("package:browser/dart.js".length);
     _maxSourceLength = sourceLengths.reduce(math.max);
   }
@@ -136,6 +136,6 @@
   bool get _shouldAddDartJs {
     return !_entrypoints.isEmpty &&
         entrypoint.root.dependencies.any((dep) =>
-            dep.name == 'browser' && dep.source.name == 'hosted');
+            dep.name == 'browser' && dep.source == 'hosted');
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command_install.dart b/sdk/lib/_internal/pub/lib/src/command_install.dart
index a57886f..afc9d2f 100644
--- a/sdk/lib/_internal/pub/lib/src/command_install.dart
+++ b/sdk/lib/_internal/pub/lib/src/command_install.dart
@@ -17,14 +17,13 @@
   String get description => "Install the current package's dependencies.";
   String get usage => "pub install";
 
-  ArgParser get commandParser {
-    return new ArgParser()
-        ..addFlag('offline',
-            help: 'Use cached packages instead of accessing the network.');
-  }
-
   bool get isOffline => commandOptions['offline'];
 
+  InstallCommand() {
+    commandParser.addFlag('offline',
+        help: 'Use cached packages instead of accessing the network.');
+  }
+
   Future onRun() {
     return entrypoint.installDependencies()
         .then((_) => log.message("Dependencies installed!"));
diff --git a/sdk/lib/_internal/pub/lib/src/command_lish.dart b/sdk/lib/_internal/pub/lib/src/command_lish.dart
index 4d97b52..9fc723c 100644
--- a/sdk/lib/_internal/pub/lib/src/command_lish.dart
+++ b/sdk/lib/_internal/pub/lib/src/command_lish.dart
@@ -17,6 +17,7 @@
 import 'directory_tree.dart';
 import 'exit_codes.dart' as exit_codes;
 import 'git.dart' as git;
+import 'hosted_source.dart';
 import 'http.dart';
 import 'io.dart';
 import 'log.dart' as log;
@@ -30,19 +31,6 @@
   final usage = "pub publish [options]";
   final aliases = const ["lish", "lush"];
 
-  ArgParser get commandParser {
-    var parser = new ArgParser();
-    // TODO(nweiz): Use HostedSource.defaultUrl as the default value once we use
-    // dart:io for HTTPS requests.
-    parser.addFlag('dry-run', abbr: 'n', negatable: false,
-        help: 'Validate but do not publish the package.');
-    parser.addFlag('force', abbr: 'f', negatable: false,
-        help: 'Publish without confirmation if there are no errors.');
-    parser.addOption('server', defaultsTo: 'https://pub.dartlang.org',
-        help: 'The package server to which to upload this package.');
-    return parser;
-  }
-
   /// The URL of the server to which to upload the package.
   Uri get server => Uri.parse(commandOptions['server']);
 
@@ -52,6 +40,15 @@
   /// Whether the publish requires confirmation.
   bool get force => commandOptions['force'];
 
+  LishCommand() {
+    commandParser.addFlag('dry-run', abbr: 'n', negatable: false,
+        help: 'Validate but do not publish the package.');
+    commandParser.addFlag('force', abbr: 'f', negatable: false,
+        help: 'Publish without confirmation if there are no errors.');
+    commandParser.addOption('server', defaultsTo: HostedSource.DEFAULT_URL,
+        help: 'The package server to which to upload this package.');
+  }
+
   Future _publish(packageBytes) {
     var cloudStorageUrl;
     return oauth2.withClient(cache, (client) {
diff --git a/sdk/lib/_internal/pub/lib/src/command_update.dart b/sdk/lib/_internal/pub/lib/src/command_update.dart
index 707ac6f..3db7ba8 100644
--- a/sdk/lib/_internal/pub/lib/src/command_update.dart
+++ b/sdk/lib/_internal/pub/lib/src/command_update.dart
@@ -19,14 +19,13 @@
 
   String get usage => 'pub update [dependencies...]';
 
-  ArgParser get commandParser {
-    return new ArgParser()
-        ..addFlag('offline',
-            help: 'Use cached packages instead of accessing the network.');
-  }
-
   bool get isOffline => commandOptions['offline'];
 
+  UpdateCommand() {
+    commandParser.addFlag('offline',
+        help: 'Use cached packages instead of accessing the network.');
+  }
+
   Future onRun() {
     var future;
     if (commandOptions.rest.isEmpty) {
diff --git a/sdk/lib/_internal/pub/lib/src/command_uploader.dart b/sdk/lib/_internal/pub/lib/src/command_uploader.dart
index 4097fbd..2f4208d 100644
--- a/sdk/lib/_internal/pub/lib/src/command_uploader.dart
+++ b/sdk/lib/_internal/pub/lib/src/command_uploader.dart
@@ -15,6 +15,7 @@
 import 'entrypoint.dart';
 import 'exit_codes.dart' as exit_codes;
 import 'http.dart';
+import 'hosted_source.dart';
 import 'io.dart';
 import 'log.dart' as log;
 import 'oauth2.dart' as oauth2;
@@ -26,21 +27,17 @@
   final usage = "pub uploader [options] {add/remove} <email>";
   final requiresEntrypoint = false;
 
-  ArgParser get commandParser {
-    var parser = new ArgParser();
-    // TODO(nweiz): Use HostedSource.defaultUrl as the default value once we use
-    // dart:io for HTTPS requests.
-    parser.addOption('server', defaultsTo: 'https://pub.dartlang.org',
-        help: 'The package server on which the package is hosted.');
-    parser.addOption('package', help: 'The package whose uploaders will be '
-        'modified.\n'
-        '(defaults to the current package)');
-    return parser;
-  }
-
   /// The URL of the package hosting server.
   Uri get server => Uri.parse(commandOptions['server']);
 
+  UploaderCommand() {
+    commandParser.addOption('server', defaultsTo: HostedSource.DEFAULT_URL,
+        help: 'The package server on which the package is hosted.');
+    commandParser.addOption('package',
+        help: 'The package whose uploaders will be modified.\n'
+              '(defaults to the current package)');
+  }
+
   Future onRun() {
     if (commandOptions.rest.isEmpty) {
       log.error('No uploader command given.');
diff --git a/sdk/lib/_internal/pub/lib/src/hosted_source.dart b/sdk/lib/_internal/pub/lib/src/hosted_source.dart
index 62503fe..a793f65 100644
--- a/sdk/lib/_internal/pub/lib/src/hosted_source.dart
+++ b/sdk/lib/_internal/pub/lib/src/hosted_source.dart
@@ -25,6 +25,9 @@
 /// A package source that installs packages from a package hosting site that
 /// uses the same API as pub.dartlang.org.
 class HostedSource extends Source {
+  /// The URL of the default package repository.
+  static const DEFAULT_URL = "https://pub.dartlang.org";
+
   final name = "hosted";
   final shouldCache = true;
 
@@ -121,7 +124,7 @@
   }
 
   List<Package> getCachedPackages([String url]) {
-    if (url == null) url = _defaultUrl;
+    if (url == null) url = DEFAULT_URL;
 
     var cacheDir = path.join(systemCacheRoot,
                              _getSourceDirectory(url));
@@ -199,9 +202,6 @@
   }
 }
 
-/// The URL of the default package repository.
-final _defaultUrl = "https://pub.dartlang.org";
-
 String _getSourceDirectory(String url) {
   url = url.replaceAll(new RegExp(r"^https?://"), "");
   return replace(url, new RegExp(r'[<>:"\\/|?*%]'),
@@ -236,7 +236,7 @@
 /// this throws a descriptive FormatException.
 Pair<String, String> _parseDescription(description) {
   if (description is String) {
-    return new Pair<String, String>(description, _defaultUrl);
+    return new Pair<String, String>(description, HostedSource.DEFAULT_URL);
   }
 
   if (description is! Map) {
@@ -254,6 +254,8 @@
     throw new FormatException("The 'name' key must have a string value.");
   }
 
-  var url = description.containsKey("url") ? description["url"] : _defaultUrl;
+  var url = description["url"];
+  if (url == null) url = HostedSource.DEFAULT_URL;
+
   return new Pair<String, String>(name, url);
 }
diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
index 122bcf0..659661f 100644
--- a/sdk/lib/_internal/pub/lib/src/io.dart
+++ b/sdk/lib/_internal/pub/lib/src/io.dart
@@ -592,19 +592,19 @@
     executable = "cmd";
   }
 
-  final options = new ProcessOptions();
-  if (workingDir != null) {
-    options.workingDirectory = workingDir;
+  var env = null;
+  if (environment != null) {
+    env = new Map.from(Platform.environment);
+    environment.forEach((key, value) => env[key] = value);
   }
 
-  if (environment != null) {
-    options.environment = new Map.from(Platform.environment);
-    environment.forEach((key, value) => options.environment[key] = value);
-  }
 
   log.process(executable, args);
 
-  return fn(executable, args, options);
+  return fn(executable,
+            args,
+            workingDirectory: workingDir,
+            environment: env);
 }
 
 /// Wraps [input] to provide a timeout. If [input] completes before
diff --git a/sdk/lib/_internal/pub/lib/src/lock_file.dart b/sdk/lib/_internal/pub/lib/src/lock_file.dart
index 316e8b5..7f69ca1 100644
--- a/sdk/lib/_internal/pub/lib/src/lock_file.dart
+++ b/sdk/lib/_internal/pub/lib/src/lock_file.dart
@@ -4,12 +4,12 @@
 
 library lock_file;
 
-import 'dart:json' as json;
 import 'dart:collection';
 
 import 'package:yaml/yaml.dart';
 
 import 'io.dart';
+import 'log.dart' as log;
 import 'package.dart';
 import 'source_registry.dart';
 import 'utils.dart';
@@ -88,25 +88,20 @@
 
   /// Returns the serialized YAML text of the lock file.
   String serialize() {
-    var packagesObj = new LinkedHashMap<String, Map>();
-
-    // Sort the packages by name.
-    var sortedKeys = packages.keys.toList();
-    sortedKeys.sort();
-    sortedKeys.forEach((name) {
-      packagesObj[name] = {
+    // Convert the dependencies to a simple object.
+    var data = {};
+    packages.forEach((name, package) {
+      data[name] = {
         'version': packages[name].version.toString(),
         'source': packages[name].source,
         'description': packages[name].description
       };
     });
 
-    // TODO(nweiz): Serialize using the YAML library once it supports
-    // serialization. For now, we use JSON, since it's a subset of YAML anyway.
-    return
-        '# Generated by pub\n'
-        '# See http://pub.dartlang.org/doc/glossary.html#lockfile\n'
-        '\n'
-        '${json.stringify({'packages': packagesObj})}\n';
+    return """
+# Generated by pub
+# See http://pub.dartlang.org/doc/glossary.html#lockfile
+${yamlToString({'packages': data})}
+""";
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
index 1338b63..00a6ba2 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
@@ -518,7 +518,7 @@
     // See if it's possible for a package to match that constraint.
     if (constraint.isEmpty) {
       _solver.logSolve('disjoint constraints on ${dep.name}');
-      throw new DisjointConstraintException(dep.name, dependencies);
+      throw new DisjointConstraintException(depender, dependencies);
     }
 
     return constraint;
diff --git a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
index 1ae8d3e..7b6713b 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
@@ -221,7 +221,9 @@
   }
 
   /// A message describing the specific kind of solve failure.
-  String get _message;
+  String get _message {
+    throw new UnimplementedError("Must override _message or toString().");
+  }
 
   /// Describes a dependencie's reference in the output message. Override this
   /// to highlight which aspect of [dep] led to the failure.
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index 08b0fb4..0311c9d 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -9,6 +9,7 @@
 import 'dart:crypto';
 import 'dart:io';
 import 'dart:isolate';
+import 'dart:json' as json;
 import 'dart:mirrors';
 import 'dart:uri';
 
@@ -457,6 +458,68 @@
   return completer.future;
 }
 
+/// The subset of strings that don't need quoting in YAML. This pattern does
+/// not strictly follow the plain scalar grammar of YAML, which means some
+/// strings may be unnecessarily quoted, but it's much simpler.
+final _unquotableYamlString = new RegExp(r"^[a-zA-Z_-][a-zA-Z_0-9-]*$");
+
+/// Converts [data], which is a parsed YAML object, to a pretty-printed string,
+/// using indentation for maps.
+String yamlToString(data) {
+  var buffer = new StringBuffer();
+
+  _stringify(bool isMapValue, String indent, data) {
+    // TODO(nweiz): Serialize using the YAML library once it supports
+    // serialization.
+
+    // Use indentation for maps.
+    if (data is Map) {
+      if (isMapValue) {
+        buffer.writeln();
+        indent += '  ';
+      }
+
+      // Sort the keys. This minimizes deltas in diffs.
+      var keys = data.keys.toList();
+      keys.sort((a, b) => a.toString().compareTo(b.toString()));
+
+      var first = true;
+      for (var key in keys) {
+        if (!first) buffer.writeln();
+        first = false;
+
+        var keyString = key;
+        if (key is! String || !_unquotableYamlString.hasMatch(key)) {
+          keyString = json.stringify(key);
+        }
+
+        buffer.write('$indent$keyString:');
+        _stringify(true, indent, data[key]);
+      }
+
+      return;
+    }
+
+    // Everything else we just stringify using JSON to handle escapes in
+    // strings and number formatting.
+    var string = data;
+
+    // Don't quote plain strings if not needed.
+    if (data is! String || !_unquotableYamlString.hasMatch(data)) {
+      string = json.stringify(data);
+    }
+
+    if (isMapValue) {
+      buffer.write(' $string');
+    } else {
+      buffer.write('$indent$string');
+    }
+  }
+
+  _stringify(false, '', data);
+  return buffer.toString();
+}
+
 /// An exception class for exceptions that are intended to be seen by the user.
 /// These exceptions won't have any debugging information printed when they're
 /// thrown.
diff --git a/sdk/lib/_internal/pub/test/deploy/compiles_dart_entrypoints_to_dart_and_js.dart b/sdk/lib/_internal/pub/test/deploy/compiles_dart_entrypoints_to_dart_and_js_test.dart
similarity index 68%
rename from sdk/lib/_internal/pub/test/deploy/compiles_dart_entrypoints_to_dart_and_js.dart
rename to sdk/lib/_internal/pub/test/deploy/compiles_dart_entrypoints_to_dart_and_js_test.dart
index 46a9593..0f8bfeb 100644
--- a/sdk/lib/_internal/pub/test/deploy/compiles_dart_entrypoints_to_dart_and_js.dart
+++ b/sdk/lib/_internal/pub/test/deploy/compiles_dart_entrypoints_to_dart_and_js_test.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.
 
+import 'package:pathos/path.dart' as path;
 import 'package:scheduled_test/scheduled_test.dart';
 
 import '../descriptor.dart' as d;
@@ -11,6 +12,10 @@
   initConfig();
 
   integration("compiles Dart entrypoints to Dart and JS", () {
+    // Dart2js can take a long time to compile dart code, so we increase the
+    // timeout to cope with that.
+    currentSchedule.timeout *= 3;
+
     d.dir(appPath, [
       d.appPubspec([]),
       d.dir('web', [
@@ -24,12 +29,12 @@
     schedulePub(args: ["deploy"],
         output: '''
 Finding entrypoints...
-Copying   web/                    => deploy/
-Compiling web/file.dart           => deploy/file.dart.js
-Compiling web/file.dart           => deploy/file.dart
-Compiling web/subdir/subfile.dart => deploy/subdir/subfile.dart.js
-Compiling web/subdir/subfile.dart => deploy/subdir/subfile.dart
-''',
+Copying   web|                    => deploy|
+Compiling web|file.dart           => deploy|file.dart.js
+Compiling web|file.dart           => deploy|file.dart
+Compiling web|subdir|subfile.dart => deploy|subdir|subfile.dart.js
+Compiling web|subdir|subfile.dart => deploy|subdir|subfile.dart
+'''.replaceAll('|', path.separator),
         exitCode: 0);
 
     d.dir(appPath, [
diff --git a/sdk/lib/_internal/pub/test/deploy/copies_dart_js_next_to_entrypoints.dart b/sdk/lib/_internal/pub/test/deploy/copies_dart_js_next_to_entrypoints_test.dart
similarity index 75%
rename from sdk/lib/_internal/pub/test/deploy/copies_dart_js_next_to_entrypoints.dart
rename to sdk/lib/_internal/pub/test/deploy/copies_dart_js_next_to_entrypoints_test.dart
index 8d9248e..d95b3d9 100644
--- a/sdk/lib/_internal/pub/test/deploy/copies_dart_js_next_to_entrypoints.dart
+++ b/sdk/lib/_internal/pub/test/deploy/copies_dart_js_next_to_entrypoints_test.dart
@@ -4,6 +4,7 @@
 
 import 'dart:json' as json;
 
+import 'package:pathos/path.dart' as path;
 import 'package:scheduled_test/scheduled_test.dart';
 
 import '../descriptor.dart' as d;
@@ -13,6 +14,10 @@
   initConfig();
 
   integration("compiles dart.js next to entrypoints", () {
+    // Dart2js can take a long time to compile dart code, so we increase the
+    // timeout to cope with that.
+    currentSchedule.timeout *= 3;
+
     serve([
       d.dir('packages', [
         d.file('browser.json', json.stringify({'versions': ['1.0.0']})),
@@ -46,14 +51,14 @@
     schedulePub(args: ["deploy"],
         output: '''
 Finding entrypoints...
-Copying   web/                    => deploy/
-Compiling web/file.dart           => deploy/file.dart.js
-Compiling web/file.dart           => deploy/file.dart
-Copying   package:browser/dart.js => deploy/packages/browser/dart.js
-Compiling web/subdir/subfile.dart => deploy/subdir/subfile.dart.js
-Compiling web/subdir/subfile.dart => deploy/subdir/subfile.dart
-Copying   package:browser/dart.js => deploy/subdir/packages/browser/dart.js
-''',
+Copying   web|                    => deploy|
+Compiling web|file.dart           => deploy|file.dart.js
+Compiling web|file.dart           => deploy|file.dart
+Copying   package:browser/dart.js => deploy|packages|browser|dart.js
+Compiling web|subdir|subfile.dart => deploy|subdir|subfile.dart.js
+Compiling web|subdir|subfile.dart => deploy|subdir|subfile.dart
+Copying   package:browser/dart.js => deploy|subdir|packages|browser|dart.js
+'''.replaceAll('|', path.separator),
         exitCode: 0);
 
     d.dir(appPath, [
diff --git a/sdk/lib/_internal/pub/test/deploy/copies_non_dart_files_to_deploy.dart b/sdk/lib/_internal/pub/test/deploy/copies_non_dart_files_to_deploy_test.dart
similarity index 90%
rename from sdk/lib/_internal/pub/test/deploy/copies_non_dart_files_to_deploy.dart
rename to sdk/lib/_internal/pub/test/deploy/copies_non_dart_files_to_deploy_test.dart
index 2602b2b..e252f94 100644
--- a/sdk/lib/_internal/pub/test/deploy/copies_non_dart_files_to_deploy.dart
+++ b/sdk/lib/_internal/pub/test/deploy/copies_non_dart_files_to_deploy_test.dart
@@ -2,6 +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.
 
+import 'package:pathos/path.dart' as path;
+
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 
@@ -26,8 +28,8 @@
     schedulePub(args: ["deploy"],
         output: '''
 Finding entrypoints...
-Copying   web/ => deploy/
-''',
+Copying   web| => deploy|
+'''.replaceAll('|', path.separator),
         exitCode: 0);
 
     d.dir(appPath, [
diff --git a/sdk/lib/_internal/pub/test/deploy/ignores_non_entrypoint_dart_files.dart b/sdk/lib/_internal/pub/test/deploy/ignores_non_entrypoint_dart_files_test.dart
similarity index 89%
rename from sdk/lib/_internal/pub/test/deploy/ignores_non_entrypoint_dart_files.dart
rename to sdk/lib/_internal/pub/test/deploy/ignores_non_entrypoint_dart_files_test.dart
index 249d561..f435377 100644
--- a/sdk/lib/_internal/pub/test/deploy/ignores_non_entrypoint_dart_files.dart
+++ b/sdk/lib/_internal/pub/test/deploy/ignores_non_entrypoint_dart_files_test.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.
 
+import 'package:pathos/path.dart' as path;
 import 'package:scheduled_test/scheduled_test.dart';
 
 import '../descriptor.dart' as d;
@@ -24,8 +25,8 @@
     schedulePub(args: ["deploy"],
         output: '''
 Finding entrypoints...
-Copying   web/ => deploy/
-''',
+Copying   web| => deploy|
+'''.replaceAll('|', path.separator),
         exitCode: 0);
 
     d.dir(appPath, [
@@ -35,7 +36,7 @@
         d.nothing('file2.dart.js'),
         d.nothing('file2.dart'),
         d.nothing('file3.dart.js'),
-        d.nothing('file3.dart')
+        d.nothing('file3.dart'),
         d.nothing('file4.dart.js'),
         d.nothing('file4.dart')
       ])
diff --git a/sdk/lib/_internal/pub/test/deploy/reports_dart_parse_errors.dart b/sdk/lib/_internal/pub/test/deploy/reports_dart_parse_errors_test.dart
similarity index 81%
rename from sdk/lib/_internal/pub/test/deploy/reports_dart_parse_errors.dart
rename to sdk/lib/_internal/pub/test/deploy/reports_dart_parse_errors_test.dart
index 6875a43e..95ff7d88 100644
--- a/sdk/lib/_internal/pub/test/deploy/reports_dart_parse_errors.dart
+++ b/sdk/lib/_internal/pub/test/deploy/reports_dart_parse_errors_test.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.
 
+import 'package:pathos/path.dart' as path;
 import 'package:scheduled_test/scheduled_test.dart';
 
 import '../descriptor.dart' as d;
@@ -11,6 +12,10 @@
   initConfig();
 
   integration("reports Dart parse errors", () {
+    // Dart2js can take a long time to compile dart code, so we increase the
+    // timeout to cope with that.
+    currentSchedule.timeout *= 3;
+
     d.dir(appPath, [
       d.appPubspec([]),
       d.dir('web', [
@@ -29,8 +34,8 @@
             multiLine: true),
         output: '''
 Finding entrypoints...
-Copying   web/ => deploy/
-''',
+Copying   web| => deploy|
+'''.replaceAll('|', path.separator),
         exitCode: 0);
 
     d.dir(appPath, [
diff --git a/sdk/lib/_internal/pub/test/deploy/with_no_web_directory.dart b/sdk/lib/_internal/pub/test/deploy/with_no_web_directory_test.dart
similarity index 100%
rename from sdk/lib/_internal/pub/test/deploy/with_no_web_directory.dart
rename to sdk/lib/_internal/pub/test/deploy/with_no_web_directory_test.dart
diff --git a/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart b/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart
new file mode 100644
index 0000000..675e52e
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart
@@ -0,0 +1,25 @@
+// 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 pub_tests;
+
+import 'dart:io';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+
+  forBothPubInstallAndUpdate((command) {
+    integration('fails gracefully if the package does not exist', () {
+      servePackages([]);
+
+      d.appDir([dependencyMap("foo", "1.2.3")]).create();
+
+      pubCommand(command, error:
+          new RegExp('Could not find package "foo" at http://localhost:'));
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_url_resolve_test.dart b/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_url_resolve_test.dart
new file mode 100644
index 0000000..49742d3
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_url_resolve_test.dart
@@ -0,0 +1,35 @@
+// 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 pub_tests;
+
+import 'dart:io';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+
+  forBothPubInstallAndUpdate((command) {
+    integration('fails gracefully if the url does not resolve', () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "dependencies": {
+            "foo": {
+              "hosted": {
+                "name": "foo",
+                "url": "http://pub.invalid"
+              }
+            }
+           }
+        })
+      ]).create();
+
+      pubCommand(command, error:
+        new RegExp('Could not resolve URL "http://pub.invalid".'));
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/hosted/offline_test.dart b/sdk/lib/_internal/pub/test/hosted/offline_test.dart
new file mode 100644
index 0000000..eaca7f2
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/hosted/offline_test.dart
@@ -0,0 +1,72 @@
+// 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 pub_tests;
+
+import 'dart:io';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+
+  forBothPubInstallAndUpdate((command) {
+    integration('updates a package using the cache', () {
+      // Run the server so that we know what URL to use in the system cache.
+      servePackages([]);
+
+      d.cacheDir({
+        "foo": ["1.2.2", "1.2.3"],
+        "bar": ["1.2.3"]
+      }, includePubspecs: true).create();
+
+      d.appDir([
+        dependencyMap("foo", "any"),
+        dependencyMap("bar", "any")
+      ]).create();
+
+      var warning = null;
+      if (command == RunCommand.update) {
+        warning = "Warning: Updating when offline may not update you "
+                  "to the latest versions of your dependencies.";
+      }
+
+      pubCommand(command, args: ['--offline'], warning: warning);
+
+      d.packagesDir({
+        "foo": "1.2.3",
+        "bar": "1.2.3"
+      }).validate();
+    });
+
+    integration('fails gracefully if a dependency is not cached', () {
+      // Run the server so that we know what URL to use in the system cache.
+      servePackages([]);
+
+      d.appDir([
+        dependencyMap("foo", "any")
+      ]).create();
+
+      pubCommand(command, args: ['--offline'],
+          error: new RegExp('Could not find package "foo" in cache'));
+    });
+
+    integration('fails gracefully no cached versions match', () {
+      // Run the server so that we know what URL to use in the system cache.
+      servePackages([]);
+
+      d.cacheDir({
+        "foo": ["1.2.2", "1.2.3"]
+      }, includePubspecs: true).create();
+
+      d.appDir([
+        dependencyMap("foo", ">2.0.0")
+      ]).create();
+
+      pubCommand(command, args: ['--offline'],
+          error: new RegExp("Package 'foo' has no versions that match >2.0.0"));
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/hosted/remove_removed_dependency_test.dart b/sdk/lib/_internal/pub/test/hosted/remove_removed_dependency_test.dart
new file mode 100644
index 0000000..0c37d87
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/hosted/remove_removed_dependency_test.dart
@@ -0,0 +1,41 @@
+// 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 pub_tests;
+
+import 'dart:io';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+
+  forBothPubInstallAndUpdate((command) {
+    integration("removes a dependency that's removed from the pubspec", () {
+      servePackages([
+        packageMap("foo", "1.0.0"),
+        packageMap("bar", "1.0.0")
+      ]);
+
+      d.appDir([dependencyMap("foo"), dependencyMap("bar")]).create();
+
+      pubCommand(command);
+
+      d.packagesDir({
+        "foo": "1.0.0",
+        "bar": "1.0.0"
+      }).validate();
+
+      d.appDir([dependencyMap("foo")]).create();
+
+      pubCommand(command);
+
+      d.packagesDir({
+        "foo": "1.0.0",
+        "bar": null
+      }).validate();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/hosted/remove_removed_transitive_dependency_test.dart b/sdk/lib/_internal/pub/test/hosted/remove_removed_transitive_dependency_test.dart
new file mode 100644
index 0000000..f6a45ae
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/hosted/remove_removed_transitive_dependency_test.dart
@@ -0,0 +1,51 @@
+// 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 pub_tests;
+
+import 'dart:io';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+
+  forBothPubInstallAndUpdate((command) {
+    integration("removes a transitive dependency that's no longer depended "
+        "on", () {
+      servePackages([
+        packageMap("foo", "1.0.0", [dependencyMap("shared-dep")]),
+        packageMap("bar", "1.0.0", [
+          dependencyMap("shared-dep"),
+          dependencyMap("bar-dep")
+        ]),
+        packageMap("shared-dep", "1.0.0"),
+        packageMap("bar-dep", "1.0.0")
+      ]);
+
+      d.appDir([dependencyMap("foo"), dependencyMap("bar")]).create();
+
+      pubCommand(command);
+
+      d.packagesDir({
+        "foo": "1.0.0",
+        "bar": "1.0.0",
+        "shared-dep": "1.0.0",
+        "bar-dep": "1.0.0",
+      }).validate();
+
+      d.appDir([dependencyMap("foo")]).create();
+
+      pubCommand(command);
+
+      d.packagesDir({
+        "foo": "1.0.0",
+        "bar": null,
+        "shared-dep": "1.0.0",
+        "bar-dep": null,
+      }).validate();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/install/hosted/fail_gracefully_on_missing_package_test.dart b/sdk/lib/_internal/pub/test/install/hosted/fail_gracefully_on_missing_package_test.dart
deleted file mode 100644
index 5833599..0000000
--- a/sdk/lib/_internal/pub/test/install/hosted/fail_gracefully_on_missing_package_test.dart
+++ /dev/null
@@ -1,24 +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 pub_tests;
-
-import 'dart:io';
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-
-main() {
-  initConfig();
-  integration('fails gracefully if the package does not exist', () {
-    servePackages([]);
-
-    d.appDir([dependencyMap("foo", "1.2.3")]).create();
-
-    schedulePub(args: ['install'],
-        error: new RegExp('Could not find package "foo" at '
-                            'http://localhost:'),
-        exitCode: 1);
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/install/hosted/fail_gracefully_on_url_resolve_test.dart b/sdk/lib/_internal/pub/test/install/hosted/fail_gracefully_on_url_resolve_test.dart
deleted file mode 100644
index 2fef340..0000000
--- a/sdk/lib/_internal/pub/test/install/hosted/fail_gracefully_on_url_resolve_test.dart
+++ /dev/null
@@ -1,33 +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 pub_tests;
-
-import 'dart:io';
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-
-main() {
-  initConfig();
-  integration('fails gracefully if the url does not resolve', () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "dependencies": {
-          "foo": {
-            "hosted": {
-              "name": "foo",
-              "url": "http://pub.invalid"
-            }
-          }
-         }
-      })
-    ]).create();
-
-    schedulePub(args: ['install'],
-        error: new RegExp('Could not resolve URL "http://pub.invalid".'),
-        exitCode: 1);
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/install/hosted/offline_test.dart b/sdk/lib/_internal/pub/test/install/hosted/offline_test.dart
deleted file mode 100644
index a39ed74..0000000
--- a/sdk/lib/_internal/pub/test/install/hosted/offline_test.dart
+++ /dev/null
@@ -1,66 +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 pub_tests;
-
-import 'dart:io';
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-
-main() {
-  initConfig();
-  integration('installs a package using the cache', () {
-    // Run the server so that we know what URL to use in the system cache.
-    servePackages([]);
-
-    d.cacheDir({
-      "foo": ["1.2.2", "1.2.3"],
-      "bar": ["1.2.3"]
-    }, includePubspecs: true).create();
-
-    d.appDir([
-      dependencyMap("foo", "any"),
-      dependencyMap("bar", "any")
-    ]).create();
-
-    schedulePub(args: ['install', '--offline'],
-        output: new RegExp("Dependencies installed!\$"));
-
-    d.packagesDir({
-      "foo": "1.2.3",
-      "bar": "1.2.3"
-    }).validate();
-  });
-
-  integration('fails gracefully if a dependency is not cached', () {
-    // Run the server so that we know what URL to use in the system cache.
-    servePackages([]);
-
-    d.appDir([
-      dependencyMap("foo", "any")
-    ]).create();
-
-    schedulePub(args: ['install', '--offline'],
-        error: new RegExp('Could not find package "foo" in cache'),
-        exitCode: 1);
-  });
-
-  integration('fails gracefully no cached versions match', () {
-    // Run the server so that we know what URL to use in the system cache.
-    servePackages([]);
-
-    d.cacheDir({
-      "foo": ["1.2.2", "1.2.3"]
-    }, includePubspecs: true).create();
-
-    d.appDir([
-      dependencyMap("foo", ">2.0.0")
-    ]).create();
-
-    schedulePub(args: ['install', '--offline'],
-        error: new RegExp("Package 'foo' has no versions that match >2.0.0"),
-        exitCode: 1);
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/install/hosted/remove_removed_dependency_test.dart b/sdk/lib/_internal/pub/test/install/hosted/remove_removed_dependency_test.dart
deleted file mode 100644
index 44d4be1..0000000
--- a/sdk/lib/_internal/pub/test/install/hosted/remove_removed_dependency_test.dart
+++ /dev/null
@@ -1,40 +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 pub_tests;
-
-import 'dart:io';
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-
-main() {
-  initConfig();
-  integration("removes a dependency that's been removed from the pubspec", () {
-    servePackages([
-      packageMap("foo", "1.0.0"),
-      packageMap("bar", "1.0.0")
-    ]);
-
-    d.appDir([dependencyMap("foo"), dependencyMap("bar")]).create();
-
-    schedulePub(args: ['install'],
-        output: new RegExp(r"Dependencies installed!$"));
-
-    d.packagesDir({
-      "foo": "1.0.0",
-      "bar": "1.0.0"
-    }).validate();
-
-    d.appDir([dependencyMap("foo")]).create();
-
-    schedulePub(args: ['install'],
-        output: new RegExp(r"Dependencies installed!$"));
-
-    d.packagesDir({
-      "foo": "1.0.0",
-      "bar": null
-    }).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/install/hosted/remove_removed_transitive_dependency_test.dart b/sdk/lib/_internal/pub/test/install/hosted/remove_removed_transitive_dependency_test.dart
deleted file mode 100644
index 35aa564..0000000
--- a/sdk/lib/_internal/pub/test/install/hosted/remove_removed_transitive_dependency_test.dart
+++ /dev/null
@@ -1,50 +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 pub_tests;
-
-import 'dart:io';
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-
-main() {
-  initConfig();
-  integration("removes a transitive dependency that's no longer depended"
-      " on", () {
-    servePackages([
-      packageMap("foo", "1.0.0", [dependencyMap("shared-dep")]),
-      packageMap("bar", "1.0.0", [
-        dependencyMap("shared-dep"),
-        dependencyMap("bar-dep")
-      ]),
-      packageMap("shared-dep", "1.0.0"),
-      packageMap("bar-dep", "1.0.0")
-    ]);
-
-    d.appDir([dependencyMap("foo"), dependencyMap("bar")]).create();
-
-    schedulePub(args: ['install'],
-        output: new RegExp(r"Dependencies installed!$"));
-
-    d.packagesDir({
-      "foo": "1.0.0",
-      "bar": "1.0.0",
-      "shared-dep": "1.0.0",
-      "bar-dep": "1.0.0",
-    }).validate();
-
-    d.appDir([dependencyMap("foo")]).create();
-
-    schedulePub(args: ['install'],
-        output: new RegExp(r"Dependencies installed!$"));
-
-    d.packagesDir({
-      "foo": "1.0.0",
-      "bar": null,
-      "shared-dep": "1.0.0",
-      "bar-dep": null,
-    }).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/install/pub_install_test.dart b/sdk/lib/_internal/pub/test/install/pub_install_test.dart
deleted file mode 100644
index 866376b..0000000
--- a/sdk/lib/_internal/pub/test/install/pub_install_test.dart
+++ /dev/null
@@ -1,227 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS d.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 d.file.
-
-library pub_tests;
-
-import 'dart:io';
-
-import 'package:pathos/path.dart' as path;
-import 'package:scheduled_test/scheduled_test.dart';
-
-import '../../lib/src/io.dart';
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-  group('requires', () {
-    integration('a pubspec', () {
-      d.dir(appPath, []).create();
-
-      schedulePub(args: ['install'],
-          error: new RegExp(r'^Could not find a file named "pubspec\.yaml"'),
-          exitCode: 1);
-    });
-
-    integration('a pubspec with a "name" key', () {
-      d.dir(appPath, [
-        d.pubspec({"dependencies": {"foo": null}})
-      ]).create();
-
-      schedulePub(args: ['install'],
-          error: new RegExp(r'^pubspec.yaml is missing the required "name" '
-              r'field \(e\.g\. "name: myapp"\)\.'),
-          exitCode: 1);
-    });
-  });
-
-  integration('adds itself to the packages', () {
-    // The symlink should use the name in the pubspec, not the name of the
-    // directory.
-    d.dir(appPath, [
-      d.pubspec({"name": "myapp_name"}),
-      d.libDir('foo'),
-    ]).create();
-
-    schedulePub(args: ['install'],
-        output: new RegExp(r"Dependencies installed!$"));
-
-    d.dir(packagesPath, [
-      d.dir("myapp_name", [
-        d.file('foo.dart', 'main() => "foo";')
-      ])
-    ]).validate();
-  });
-
-  integration('does not add 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.
-    d.dir(appPath, [
-      d.pubspec({"name": "myapp_name"}),
-    ]).create();
-
-    schedulePub(args: ['install'],
-        output: new RegExp(r"Dependencies installed!$"));
-
-    d.dir(packagesPath, [
-      d.nothing("myapp_name")
-    ]).validate();
-  });
-
-  integration('does not add a package if it does not have a "lib" directory', () {
-    // Using a path source, but this should be true of all sources.
-    d.dir('foo', [
-      d.libPubspec('foo', '0.0.0-not.used')
-    ]).create();
-
-    d.dir(appPath, [
-      d.pubspec({"name": "myapp", "dependencies": {"foo": {"path": "../foo"}}})
-    ]).create();
-
-    schedulePub(args: ['install'],
-        error: new RegExp(r'Warning: Package "foo" does not have a "lib" '
-            'directory so you will not be able to import any libraries from '
-            'it.'),
-        output: new RegExp(r"Dependencies installed!$"));
-  });
-
-  integration('reports a solver failure', () {
-    // myapp depends on foo and bar which both depend on baz with mismatched
-    // descriptions.
-    d.dir('deps', [
-      d.dir('foo', [
-        d.pubspec({"name": "foo", "dependencies": {
-          "baz": {"path": "../baz1"}
-        }})
-      ]),
-      d.dir('bar', [
-        d.pubspec({"name": "bar", "dependencies": {
-          "baz": {"path": "../baz2"}
-        }})
-      ]),
-      d.dir('baz1', [
-        d.libPubspec('baz', '0.0.0')
-      ]),
-      d.dir('baz2', [
-        d.libPubspec('baz', '0.0.0')
-      ])
-    ]).create();
-
-    d.dir(appPath, [
-      d.pubspec({"name": "myapp", "dependencies": {
-        "foo": {"path": "../deps/foo"},
-        "bar": {"path": "../deps/bar"}
-      }})
-    ]).create();
-
-    schedulePub(args: ['install'],
-        error: new RegExp(r"^Incompatible dependencies on 'baz':"),
-        exitCode: 1);
-  });
-
-  integration('does not warn if the root package lacks a "lib" directory', () {
-    d.dir(appPath, [
-      d.appPubspec([])
-    ]).create();
-
-    schedulePub(args: ['install'],
-        error: new RegExp(r'^\s*$'),
-        output: new RegExp(r"Dependencies installed!$"));
-  });
-
-  integration('overwrites the existing packages directory', () {
-    d.dir(appPath, [
-      d.appPubspec([]),
-      d.dir('packages', [
-        d.dir('foo'),
-        d.dir('myapp'),
-      ]),
-      d.libDir('myapp')
-    ]).create();
-
-    schedulePub(args: ['install'],
-        output: new RegExp(r"Dependencies installed!$"));
-
-    d.dir(packagesPath, [
-      d.nothing('foo'),
-      d.dir('myapp', [d.file('myapp.dart', 'main() => "myapp";')])
-    ]).validate();
-  });
-
-  integration('overwrites a broken packages directory symlink', () {
-    d.dir(appPath, [
-      d.appPubspec([]),
-      d.dir('packages'),
-      d.libDir('myapp'),
-      d.dir('bin')
-    ]).create();
-
-    scheduleSymlink(
-        path.join(appPath, 'packages'),
-        path.join(appPath, 'bin', 'packages'));
-
-    schedule(() => deleteEntry(path.join(sandboxDir, appPath, 'packages')));
-
-    schedulePub(args: ['install'],
-        output: new RegExp(r"Dependencies installed!$"));
-
-    d.dir(packagesPath, [
-      d.nothing('foo'),
-      d.dir('myapp', [d.file('myapp.dart', 'main() => "myapp";')])
-    ]).validate();
-  });
-
-  group('creates a packages directory in', () {
-    for (var dir in ["benchmark", "example", "test", "tool", "web"]) {
-      integration('"$dir/" and its subdirectories', () {
-        d.dir(appPath, [
-          d.appPubspec([]),
-          d.libDir('foo'),
-          d.dir(dir, [d.dir("sub${dir}")])
-        ]).create();
-
-        schedulePub(args: ['install'],
-            output: new RegExp(r"Dependencies installed!$"));
-
-        d.dir(appPath, [
-          d.dir(dir, [
-            d.dir("packages", [
-              d.dir("myapp", [
-                d.file('foo.dart', 'main() => "foo";')
-              ])
-            ]),
-            d.dir("sub${dir}", [
-              d.dir("packages", [
-                d.dir("myapp", [
-                  d.file('foo.dart', 'main() => "foo";')
-                ])
-              ])
-            ])
-          ])
-        ]).validate();
-      });
-    }
-
-    integration('"bin/"', () {
-      d.dir(appPath, [
-        d.appPubspec([]),
-        d.libDir('foo'),
-        d.dir("bin")
-      ]).create();
-
-      schedulePub(args: ['install'],
-          output: new RegExp(r"Dependencies installed!$"));
-
-      d.dir(appPath, [
-        d.dir("bin", [
-          d.dir("packages", [
-            d.dir("myapp", [
-              d.file('foo.dart', 'main() => "foo";')
-            ])
-          ])
-        ])
-      ]).validate();
-    });
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/install/unknown_source_test.dart b/sdk/lib/_internal/pub/test/install/unknown_source_test.dart
deleted file mode 100644
index e8250c5..0000000
--- a/sdk/lib/_internal/pub/test/install/unknown_source_test.dart
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS d.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 d.file.
-
-library pub_tests;
-
-import 'dart:io';
-import 'dart:json' as json;
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-  integration('fails gracefully on a dependency from an unknown source', () {
-    d.appDir([{"bad": "foo"}]).create();
-
-    schedulePub(args: ['install'],
-        error: new RegExp("Package 'myapp' depends on 'foo' from unknown "
-                          "source 'bad'.\$"),
-        exitCode: 1);
-  });
-
-  integration('fails gracefully on transitive dependency from an unknown '
-              'source', () {
-    d.dir('foo', [
-      d.libDir('foo', 'foo 0.0.1'),
-      d.libPubspec('foo', '0.0.1', deps: [{"bad": "bar"}])
-    ]).create();
-
-    d.appDir([{"path": "../foo"}]).create();
-
-    schedulePub(args: ['install'],
-        error: new RegExp("Package 'foo' depends on 'bar' from unknown "
-                          "source 'bad'.\$"),
-        exitCode: 1);
-  });
-
-  integration('ignores unknown source in lockfile', () {
-    d.dir('foo', [
-      d.libDir('foo'),
-      d.libPubspec('foo', '0.0.1')
-    ]).create();
-
-    // Depend on "foo" from a valid source.
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "dependencies": {
-          "foo": {"path": "../foo"}
-        }
-      })
-    ]).create();
-
-    // But lock it to a bad one.
-    d.dir(appPath, [
-      d.file("pubspec.lock", json.stringify({
-        'packages': {
-          'foo': {
-            'version': '0.0.0',
-            'source': 'bad',
-            'description': {
-              'name': 'foo'
-            }
-          }
-        }
-      }))
-    ]).create();
-
-    schedulePub(args: ['install'],
-        output: new RegExp(r"Dependencies installed!$"));
-
-    // Should update to the new one.
-    d.dir(packagesPath, [
-      d.dir("foo", [
-        d.file("foo.dart", 'main() => "foo";')
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/lock_file_test.dart b/sdk/lib/_internal/pub/test/lock_file_test.dart
index 8b05d9d..2145bb18 100644
--- a/sdk/lib/_internal/pub/test/lock_file_test.dart
+++ b/sdk/lib/_internal/pub/test/lock_file_test.dart
@@ -188,29 +188,6 @@
           }
         }));
       });
-
-      test('lockfile is alphabetized by package name', () {
-        var testNames = ['baz', 'Qwe', 'Q', 'B', 'Bar', 'bar', 'foo'];
-        testNames.forEach((name) {
-          lockfile.packages[name] = new PackageId(name, mockSource.name,
-            new Version.parse('5.5.5'), '$name desc');
-        });
-
-        expect(lockfile.serialize(),
-          '# Generated by pub\n'
-          '# See http://pub.dartlang.org/doc/glossary.html#lockfile\n'
-          '\n'
-          '{"packages":{'
-          '"B":{"version":"5.5.5","source":"mock","description":"B desc"},'
-          '"Bar":{"version":"5.5.5","source":"mock","description":"Bar desc"},'
-          '"Q":{"version":"5.5.5","source":"mock","description":"Q desc"},'
-          '"Qwe":{"version":"5.5.5","source":"mock","description":"Qwe desc"},'
-          '"bar":{"version":"5.5.5","source":"mock","description":"bar desc"},'
-          '"baz":{"version":"5.5.5","source":"mock","description":"baz desc"},'
-          '"foo":{"version":"5.5.5","source":"mock","description":"foo desc"}}}'
-          '\n'
-        );
-      });
     });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/pub_cache_test.dart b/sdk/lib/_internal/pub/test/pub_cache_test.dart
index cb38da7..195bcd5 100644
--- a/sdk/lib/_internal/pub/test/pub_cache_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_cache_test.dart
@@ -22,6 +22,7 @@
           Inspect the system cache.
 
           Usage: pub cache list
+          -h, --help    Print usage information for this command.
           ''',
         error: 'The cache command expects one argument.',
         exitCode: 64);
@@ -33,6 +34,7 @@
           Inspect the system cache.
 
           Usage: pub cache list
+          -h, --help    Print usage information for this command.
           ''',
         error: 'Unknown cache command "foo".',
         exitCode: 64);
diff --git a/sdk/lib/_internal/pub/test/pub_install_and_update_test.dart b/sdk/lib/_internal/pub/test/pub_install_and_update_test.dart
new file mode 100644
index 0000000..1cbd5a3
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/pub_install_and_update_test.dart
@@ -0,0 +1,118 @@
+// 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 pub_tests;
+
+import 'dart:io';
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import 'descriptor.dart' as d;
+import 'test_pub.dart';
+
+main() {
+  initConfig();
+
+  forBothPubInstallAndUpdate((command) {
+    group('requires', () {
+      integration('a pubspec', () {
+        d.dir(appPath, []).create();
+
+        pubCommand(command,
+            error: new RegExp(r'^Could not find a file named "pubspec.yaml"'));
+      });
+
+      integration('a pubspec with a "name" key', () {
+        d.dir(appPath, [
+          d.pubspec({"dependencies": {"foo": null}})
+        ]).create();
+
+        pubCommand(command, error: new RegExp(
+            r'^pubspec.yaml is missing the required "name" field '
+            r'\(e\.g\. "name: myapp"\)\.'));
+      });
+    });
+
+    integration('adds itself to the packages', () {
+      // The symlink should use the name in the pubspec, not the name of the
+      // directory.
+      d.dir(appPath, [
+        d.pubspec({"name": "myapp_name"}),
+        d.libDir('myapp_name')
+      ]).create();
+
+      pubCommand(command);
+
+      d.dir(packagesPath, [
+        d.dir("myapp_name", [
+          d.file('myapp_name.dart', 'main() => "myapp_name";')
+        ])
+      ]).validate();
+    });
+
+    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.
+      d.dir(appPath, [
+        d.pubspec({"name": "myapp_name"}),
+      ]).create();
+
+      pubCommand(command);
+
+      d.dir(packagesPath, [
+        d.nothing("myapp_name")
+      ]).validate();
+    });
+
+    integration('does not add a package if it does not have a "lib" '
+        'directory', () {
+      // Using a path source, but this should be true of all sources.
+      d.dir('foo', [
+        d.libPubspec('foo', '0.0.0-not.used')
+      ]).create();
+
+      d.dir(appPath, [
+        d.pubspec({"name": "myapp", "dependencies": {"foo": {"path": "../foo"}}})
+      ]).create();
+
+      pubCommand(command);
+
+      d.packagesDir({"foo": null}).validate();
+    });
+
+    integration('reports a solver failure', () {
+      // myapp depends on foo and bar which both depend on baz with mismatched
+      // descriptions.
+      d.dir('deps', [
+        d.dir('foo', [
+          d.pubspec({"name": "foo", "dependencies": {
+            "baz": {"path": "../baz1"}
+          }})
+        ]),
+        d.dir('bar', [
+          d.pubspec({"name": "bar", "dependencies": {
+            "baz": {"path": "../baz2"}
+          }})
+        ]),
+        d.dir('baz1', [
+          d.libPubspec('baz', '0.0.0')
+        ]),
+        d.dir('baz2', [
+          d.libPubspec('baz', '0.0.0')
+        ])
+      ]).create();
+
+      d.dir(appPath, [
+        d.pubspec({"name": "myapp", "dependencies": {
+          "foo": {"path": "../deps/foo"},
+          "bar": {"path": "../deps/bar"}
+        }})
+      ]).create();
+
+      pubCommand(command,
+          error: new RegExp(r"^Incompatible dependencies on 'baz':"));
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/pub_test.dart b/sdk/lib/_internal/pub/test/pub_test.dart
index ba97da5..949f437 100644
--- a/sdk/lib/_internal/pub/test/pub_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_test.dart
@@ -61,6 +61,28 @@
     schedulePub(args: ['-h'], output: USAGE_STRING);
   });
 
+  integration('running pub with --help after command shows command usage', () {
+    schedulePub(args: ['install', '--help'],
+        output: '''
+          Install the current package's dependencies.
+
+          Usage: pub install
+          -h, --help            Print usage information for this command.
+              --[no-]offline    Use cached packages instead of accessing the network.
+    ''');
+  });
+
+  integration('running pub with -h after command shows command usage', () {
+    schedulePub(args: ['install', '-h'],
+        output: '''
+          Install the current package's dependencies.
+
+          Usage: pub install
+          -h, --help            Print usage information for this command.
+              --[no-]offline    Use cached packages instead of accessing the network.
+    ''');
+  });
+
   integration('running pub with just --version displays version', () {
     schedulePub(args: ['--version'], output: VERSION_STRING);
   });
@@ -89,7 +111,7 @@
     schedulePub(args: ['version', '--blorf'],
         error: '''
         Could not find an option named "blorf".
-        Use "pub help" for more information.
+        Run "pub help" to see available options.
         ''',
         exitCode: 64);
   });
@@ -101,7 +123,8 @@
             Install the current package's dependencies.
 
             Usage: pub install
-            --[no-]offline    Use cached packages instead of accessing the network.
+            -h, --help            Print usage information for this command.
+                --[no-]offline    Use cached packages instead of accessing the network.
             ''');
     });
 
@@ -111,6 +134,7 @@
             Publish the current package to pub.dartlang.org.
 
             Usage: pub publish [options]
+            -h, --help       Print usage information for this command.
             -n, --dry-run    Validate but do not publish the package.
             -f, --force      Publish without confirmation if there are no errors.
                 --server     The package server to which to upload this package.
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index 37bf6d0..50f6343 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -104,8 +104,6 @@
           var response = request.response;
           try {
             var path = request.uri.path.replaceFirst("/", "");
-
-            if (_requestedPaths == null) _requestedPaths = <String>[];
             _requestedPaths.add(path);
 
             response.persistentConnection = false;
@@ -237,6 +235,69 @@
 /// Set to true when the current batch of scheduled events should be aborted.
 bool _abortScheduled = false;
 
+/// Enum identifying a pub command that can be run with a well-defined success
+/// output.
+class RunCommand {
+  static final install = new RunCommand('install',
+      new RegExp("Dependencies installed!\$"));
+
+  static final update = new RunCommand('update',
+      new RegExp("Dependencies updated!\$"));
+
+  final String name;
+  final RegExp success;
+  RunCommand(this.name, this.success);
+}
+
+/// Many tests validate behavior that is the same between pub install and
+/// update have the same behavior. Instead of duplicating those tests, this
+/// takes a callback that defines install/update agnostic tests and runs them
+/// with both commands.
+void forBothPubInstallAndUpdate(void callback(RunCommand command)) {
+  group(RunCommand.install.name, () => callback(RunCommand.install));
+  group(RunCommand.update.name, () => callback(RunCommand.update));
+}
+
+/// Schedules an invocation of pub [command] and validates that it completes
+/// in an expected way.
+///
+/// By default, this validates that the command completes successfully and
+/// understands the normal output of a successful pub command. If [warning] is
+/// given, it expects the command to complete successfully *and* print
+/// [warning] to stderr. If [error] is given, it expects the command to *only*
+/// print [error] to stderr.
+// TODO(rnystrom): Clean up other tests to call this when possible.
+void pubCommand(RunCommand command, {Iterable<String> args, Pattern error,
+    Pattern warning}) {
+  if (error != null && warning != null) {
+    throw new ArgumentError("Cannot pass both 'error' and 'warning'.");
+  }
+
+  var allArgs = [command.name];
+  if (args != null) allArgs.addAll(args);
+
+  var output = command.success;
+
+  var exitCode = null;
+  if (error != null) exitCode = 1;
+
+  // No success output on an error.
+  if (error != null) output = null;
+  if (warning != null) error = warning;
+
+  schedulePub(args: allArgs, output: output, error: error, exitCode: exitCode);
+}
+
+void pubInstall({Iterable<String> args, Pattern error,
+    Pattern warning}) {
+  pubCommand(RunCommand.install, args: args, error: error, warning: warning);
+}
+
+void pubUpdate({Iterable<String> args, Pattern error,
+    Pattern warning}) {
+  pubCommand(RunCommand.update, args: args, error: error, warning: warning);
+}
+
 /// Defines an integration test. The [body] should schedule a series of
 /// operations which will be run asynchronously.
 void integration(String description, void body()) =>
@@ -371,22 +432,21 @@
   dartArgs.addAll(args);
 
   if (tokenEndpoint == null) tokenEndpoint = new Future.value();
-  var optionsFuture = tokenEndpoint.then((tokenEndpoint) {
-    var options = new ProcessOptions();
-    options.workingDirectory = pathInSandbox(appPath);
+  var environmentFuture = tokenEndpoint.then((tokenEndpoint) {
     // TODO(nweiz): remove this when issue 9294 is fixed.
-    options.environment = new Map.from(Platform.environment);
-    options.environment['_PUB_TESTING'] = 'true';
-    options.environment['PUB_CACHE'] = pathInSandbox(cachePath);
-    options.environment['DART_SDK'] = pathInSandbox(sdkPath);
+    var environment = new Map.from(Platform.environment);
+    environment['_PUB_TESTING'] = 'true';
+    environment['PUB_CACHE'] = pathInSandbox(cachePath);
+    environment['DART_SDK'] = pathInSandbox(sdkPath);
     if (tokenEndpoint != null) {
-      options.environment['_PUB_TEST_TOKEN_ENDPOINT'] =
+      environment['_PUB_TEST_TOKEN_ENDPOINT'] =
         tokenEndpoint.toString();
     }
-    return options;
+    return environment;
   });
 
-  return new PubProcess.start(dartBin, dartArgs, options: optionsFuture,
+  return new PubProcess.start(dartBin, dartArgs, environment: environmentFuture,
+      workingDirectory: pathInSandbox(appPath),
       description: args.isEmpty ? 'pub' : 'pub ${args.first}');
 }
 
@@ -399,9 +459,11 @@
   Stream<String> _stderr;
 
   PubProcess.start(executable, arguments,
-      {options, String description, Encoding encoding: Encoding.UTF_8})
+      {workingDirectory, environment, String description,
+       Encoding encoding: Encoding.UTF_8})
     : super.start(executable, arguments,
-        options: options,
+        workingDirectory: workingDirectory,
+        environment: environment,
         description: description,
         encoding: encoding);
 
diff --git a/sdk/lib/_internal/pub/test/unknown_source_test.dart b/sdk/lib/_internal/pub/test/unknown_source_test.dart
new file mode 100644
index 0000000..6b0cde0
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/unknown_source_test.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS d.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 d.file.
+
+library pub_tests;
+
+import 'dart:io';
+import 'dart:json' as json;
+
+import 'descriptor.dart' as d;
+import 'test_pub.dart';
+
+main() {
+  initConfig();
+
+  forBothPubInstallAndUpdate((command) {
+    integration('fails gracefully on a dependency from an unknown source', () {
+      d.appDir([{"bad": "foo"}]).create();
+
+      pubCommand(command, error: new RegExp(
+          "Package 'myapp' depends on 'foo' from unknown source 'bad'.\$"));
+    });
+
+    integration('fails gracefully on transitive dependency from an unknown '
+                'source', () {
+      d.dir('foo', [
+        d.libDir('foo', 'foo 0.0.1'),
+        d.libPubspec('foo', '0.0.1', deps: [{"bad": "bar"}])
+      ]).create();
+
+      d.appDir([{"path": "../foo"}]).create();
+
+      pubCommand(command, error: new RegExp(
+          "Package 'foo' depends on 'bar' from unknown source 'bad'.\$"));
+    });
+
+    integration('ignores unknown source in lockfile', () {
+      d.dir('foo', [
+        d.libDir('foo'),
+        d.libPubspec('foo', '0.0.1')
+      ]).create();
+
+      // Depend on "foo" from a valid source.
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "dependencies": {
+            "foo": {"path": "../foo"}
+          }
+        })
+      ]).create();
+
+      // But lock it to a bad one.
+      d.dir(appPath, [
+        d.file("pubspec.lock", json.stringify({
+          'packages': {
+            'foo': {
+              'version': '0.0.0',
+              'source': 'bad',
+              'description': {
+                'name': 'foo'
+              }
+            }
+          }
+        }))
+      ]).create();
+
+      pubCommand(command);
+
+      // Should update to the new one.
+      d.dir(packagesPath, [
+        d.dir("foo", [
+          d.file("foo.dart", 'main() => "foo";')
+        ])
+      ]).validate();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/update/hosted/fail_gracefully_on_missing_package_test.dart b/sdk/lib/_internal/pub/test/update/hosted/fail_gracefully_on_missing_package_test.dart
deleted file mode 100644
index a2a47e4..0000000
--- a/sdk/lib/_internal/pub/test/update/hosted/fail_gracefully_on_missing_package_test.dart
+++ /dev/null
@@ -1,24 +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 pub_tests;
-
-import 'dart:io';
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-
-main() {
-  initConfig();
-  integration('fails gracefully if the package does not exist', () {
-    servePackages([]);
-
-    d.appDir([dependencyMap("foo", "1.2.3")]).create();
-
-    schedulePub(args: ['update'],
-        error: new RegExp('Could not find package "foo" at '
-                            'http://localhost:'),
-        exitCode: 1);
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/update/hosted/fail_gracefully_on_url_resolve_test.dart b/sdk/lib/_internal/pub/test/update/hosted/fail_gracefully_on_url_resolve_test.dart
deleted file mode 100644
index db71d25..0000000
--- a/sdk/lib/_internal/pub/test/update/hosted/fail_gracefully_on_url_resolve_test.dart
+++ /dev/null
@@ -1,33 +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 pub_tests;
-
-import 'dart:io';
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-
-main() {
-  initConfig();
-  integration('fails gracefully if the url does not resolve', () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "dependencies": {
-          "foo": {
-            "hosted": {
-              "name": "foo",
-              "url": "http://pub.invalid"
-            }
-          }
-         }
-      })
-    ]).create();
-
-    schedulePub(args: ['update'],
-        error: new RegExp('Could not resolve URL "http://pub.invalid".'),
-        exitCode: 1);
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/update/hosted/offline_test.dart b/sdk/lib/_internal/pub/test/update/hosted/offline_test.dart
deleted file mode 100644
index 50686d0..0000000
--- a/sdk/lib/_internal/pub/test/update/hosted/offline_test.dart
+++ /dev/null
@@ -1,68 +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 pub_tests;
-
-import 'dart:io';
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-
-main() {
-  initConfig();
-  integration('updates a package using the cache', () {
-    // Run the server so that we know what URL to use in the system cache.
-    servePackages([]);
-
-    d.cacheDir({
-      "foo": ["1.2.2", "1.2.3"],
-      "bar": ["1.2.3"]
-    }, includePubspecs: true).create();
-
-    d.appDir([
-      dependencyMap("foo", "any"),
-      dependencyMap("bar", "any")
-    ]).create();
-
-    schedulePub(args: ['update', '--offline'],
-        output: new RegExp("Dependencies updated!\$"),
-        error: "Warning: Updating when offline may not update you "
-               "to the latest versions of your dependencies.");
-
-    d.packagesDir({
-      "foo": "1.2.3",
-      "bar": "1.2.3"
-    }).validate();
-  });
-
-  integration('fails gracefully if a dependency is not cached', () {
-    // Run the server so that we know what URL to use in the system cache.
-    servePackages([]);
-
-    d.appDir([
-      dependencyMap("foo", "any")
-    ]).create();
-
-    schedulePub(args: ['update', '--offline'],
-        error: new RegExp('Could not find package "foo" in cache'),
-        exitCode: 1);
-  });
-
-  integration('fails gracefully no cached versions match', () {
-    // Run the server so that we know what URL to use in the system cache.
-    servePackages([]);
-
-    d.cacheDir({
-      "foo": ["1.2.2", "1.2.3"]
-    }, includePubspecs: true).create();
-
-    d.appDir([
-      dependencyMap("foo", ">2.0.0")
-    ]).create();
-
-    schedulePub(args: ['update', '--offline'],
-        error: new RegExp("Package 'foo' has no versions that match >2.0.0"),
-        exitCode: 1);
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/update/hosted/remove_removed_dependency_test.dart b/sdk/lib/_internal/pub/test/update/hosted/remove_removed_dependency_test.dart
deleted file mode 100644
index 2a916a2..0000000
--- a/sdk/lib/_internal/pub/test/update/hosted/remove_removed_dependency_test.dart
+++ /dev/null
@@ -1,40 +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 pub_tests;
-
-import 'dart:io';
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-
-main() {
-  initConfig();
-  integration("removes a dependency that's been removed from the pubspec", () {
-    servePackages([
-      packageMap("foo", "1.0.0"),
-      packageMap("bar", "1.0.0")
-    ]);
-
-    d.appDir([dependencyMap("foo"), dependencyMap("bar")]).create();
-
-    schedulePub(args: ['update'],
-        output: new RegExp(r"Dependencies updated!$"));
-
-    d.packagesDir({
-      "foo": "1.0.0",
-      "bar": "1.0.0"
-    }).validate();
-
-    d.appDir([dependencyMap("foo")]).create();
-
-    schedulePub(args: ['update'],
-        output: new RegExp(r"Dependencies updated!$"));
-
-    d.packagesDir({
-      "foo": "1.0.0",
-      "bar": null
-    }).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/update/hosted/remove_removed_transitive_dependency_test.dart b/sdk/lib/_internal/pub/test/update/hosted/remove_removed_transitive_dependency_test.dart
deleted file mode 100644
index 2045050..0000000
--- a/sdk/lib/_internal/pub/test/update/hosted/remove_removed_transitive_dependency_test.dart
+++ /dev/null
@@ -1,50 +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 pub_tests;
-
-import 'dart:io';
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-
-main() {
-  initConfig();
-  integration("removes a transitive dependency that's no longer depended "
-      "on", () {
-    servePackages([
-      packageMap("foo", "1.0.0", [dependencyMap("shared-dep")]),
-      packageMap("bar", "1.0.0", [
-        dependencyMap("shared-dep"),
-        dependencyMap("bar-dep")
-      ]),
-      packageMap("shared-dep", "1.0.0"),
-      packageMap("bar-dep", "1.0.0")
-    ]);
-
-    d.appDir([dependencyMap("foo"), dependencyMap("bar")]).create();
-
-    schedulePub(args: ['update'],
-        output: new RegExp(r"Dependencies updated!$"));
-
-    d.packagesDir({
-      "foo": "1.0.0",
-      "bar": "1.0.0",
-      "shared-dep": "1.0.0",
-      "bar-dep": "1.0.0",
-    }).validate();
-
-    d.appDir([dependencyMap("foo")]).create();
-
-    schedulePub(args: ['update'],
-        output: new RegExp(r"Dependencies updated!$"));
-
-    d.packagesDir({
-      "foo": "1.0.0",
-      "bar": null,
-      "shared-dep": "1.0.0",
-      "bar-dep": null,
-    }).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/update/pub_update_test.dart b/sdk/lib/_internal/pub/test/update/pub_update_test.dart
deleted file mode 100644
index 8242d88..0000000
--- a/sdk/lib/_internal/pub/test/update/pub_update_test.dart
+++ /dev/null
@@ -1,87 +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 pub_tests;
-
-import 'dart:io';
-
-import 'package:scheduled_test/scheduled_test.dart';
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-  group('requires', () {
-    integration('a pubspec', () {
-      d.dir(appPath, []).create();
-
-      schedulePub(args: ['update'],
-          error: new RegExp(r'^Could not find a file named "pubspec.yaml"'),
-          exitCode: 1);
-    });
-
-    integration('a pubspec with a "name" key', () {
-      d.dir(appPath, [
-        d.pubspec({"dependencies": {"foo": null}})
-      ]).create();
-
-      schedulePub(args: ['update'],
-          error: new RegExp(r'^pubspec.yaml is missing the required "name" '
-              r'field \(e\.g\. "name: myapp"\)\.'),
-          exitCode: 1);
-    });
-  });
-
-  integration('adds itself to the packages', () {
-    // The symlink should use the name in the pubspec, not the name of the
-    // directory.
-    d.dir(appPath, [
-      d.pubspec({"name": "myapp_name"}),
-      d.libDir('myapp_name')
-    ]).create();
-
-    schedulePub(args: ['update'],
-        output: new RegExp(r"Dependencies updated!$"));
-
-    d.dir(packagesPath, [
-      d.dir("myapp_name", [
-        d.file('myapp_name.dart', 'main() => "myapp_name";')
-      ])
-    ]).validate();
-  });
-
-  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.
-    d.dir(appPath, [
-      d.pubspec({"name": "myapp_name"}),
-    ]).create();
-
-    schedulePub(args: ['update'],
-        output: new RegExp(r"Dependencies updated!$"));
-
-    d.dir(packagesPath, [
-      d.nothing("myapp_name")
-    ]).validate();
-  });
-
-  integration('does not add a package if it does not have a "lib" '
-      'directory', () {
-    // Using a path source, but this should be true of all sources.
-    d.dir('foo', [
-      d.libPubspec('foo', '0.0.0-not.used')
-    ]).create();
-
-    d.dir(appPath, [
-      d.pubspec({"name": "myapp", "dependencies": {"foo": {"path": "../foo"}}})
-    ]).create();
-
-    schedulePub(args: ['update'],
-        output: new RegExp(r"Dependencies updated!$"));
-
-    d.packagesDir({"foo": null}).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/update/unknown_source_test.dart b/sdk/lib/_internal/pub/test/update/unknown_source_test.dart
deleted file mode 100644
index 92dfe1f..0000000
--- a/sdk/lib/_internal/pub/test/update/unknown_source_test.dart
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS d.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 d.file.
-
-library pub_tests;
-
-import 'dart:io';
-import 'dart:json' as json;
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-  integration('fails gracefully on a dependency from an unknown source', () {
-    d.appDir([{"bad": "foo"}]).create();
-
-    schedulePub(args: ['update'],
-        error: new RegExp("Package 'myapp' depends on 'foo' from unknown "
-                          "source 'bad'.\$"),
-        exitCode: 1);
-  });
-
-  integration('fails gracefully on transitive dependency from an unknown '
-              'source', () {
-    d.dir('foo', [
-      d.libDir('foo', 'foo 0.0.1'),
-      d.libPubspec('foo', '0.0.1', deps: [{"bad": "bar"}])
-    ]).create();
-
-    d.appDir([{"path": "../foo"}]).create();
-
-    schedulePub(args: ['update'],
-        error: new RegExp("Package 'foo' depends on 'bar' from unknown "
-                          "source 'bad'.\$"),
-        exitCode: 1);
-  });
-
-  integration('ignores unknown source in lockfile', () {
-    d.dir('foo', [
-      d.libDir('foo'),
-      d.libPubspec('foo', '0.0.1')
-    ]).create();
-
-    // Depend on "foo" from a valid source.
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "dependencies": {
-          "foo": {"path": "../foo"}
-        }
-      })
-    ]).create();
-
-    // But lock it to a bad one.
-    d.dir(appPath, [
-      d.file("pubspec.lock", json.stringify({
-        'packages': {
-          'foo': {
-            'version': '0.0.0',
-            'source': 'bad',
-            'description': {
-              'name': 'foo'
-            }
-          }
-        }
-      }))
-    ]).create();
-
-    schedulePub(args: ['update'],
-        output: new RegExp(r"Dependencies updated!$"));
-
-    // Should update to the new one.
-    d.dir(packagesPath, [
-      d.dir("foo", [
-        d.file("foo.dart", 'main() => "foo";')
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/utils_test.dart b/sdk/lib/_internal/pub/test/utils_test.dart
new file mode 100644
index 0000000..c1c29a8
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/utils_test.dart
@@ -0,0 +1,84 @@
+// 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_test;
+
+import 'package:unittest/unittest.dart';
+import 'test_pub.dart';
+import '../lib/src/utils.dart';
+
+main() {
+  initConfig();
+
+  group('yamlToString()', () {
+    test('null', () {
+      expect(yamlToString(null), equals('null'));
+    });
+
+    test('numbers', () {
+      expect(yamlToString(123), equals('123'));
+      expect(yamlToString(12.34), equals('12.34'));
+    });
+
+    test('does not quote strings that do not need it', () {
+      expect(yamlToString('a'), equals('a'));
+      expect(yamlToString('some-string'), equals('some-string'));
+      expect(yamlToString('hey123CAPS'), equals('hey123CAPS'));
+      expect(yamlToString("_under_score"), equals('_under_score'));
+    });
+
+    test('quotes other strings', () {
+      expect(yamlToString(''), equals('""'));
+      expect(yamlToString('123'), equals('"123"'));
+      expect(yamlToString('white space'), equals('"white space"'));
+      expect(yamlToString('"quote"'), equals(r'"\"quote\""'));
+      expect(yamlToString("apostrophe'"), equals('"apostrophe\'"'));
+      expect(yamlToString("new\nline"), equals(r'"new\nline"'));
+      expect(yamlToString("?unctu@t!on"), equals(r'"?unctu@t!on"'));
+    });
+
+    test('lists use JSON style', () {
+      expect(yamlToString([1, 2, 3]), equals('[1,2,3]'));
+    });
+
+    test('uses indentation for maps', () {
+      expect(yamlToString({'a': {'b': 1, 'c': 2}, 'd': 3}),
+          equals("""
+a:
+  b: 1
+  c: 2
+d: 3"""));
+    });
+
+    test('sorts map keys', () {
+      expect(yamlToString({'a': 1, 'c': 2, 'b': 3, 'd': 4}),
+          equals("""
+a: 1
+b: 3
+c: 2
+d: 4"""));
+    });
+
+    test('quotes map keys as needed', () {
+      expect(yamlToString({'no': 1, 'yes!': 2, '123': 3}),
+          equals("""
+"123": 3
+no: 1
+"yes!": 2"""));
+    });
+
+    test('handles non-string map keys', () {
+      var map = new Map();
+      map[null] = "null";
+      map[123] = "num";
+      map[true] = "bool";
+
+      expect(yamlToString(map),
+          equals("""
+123: num
+null: null
+true: bool"""));
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/version_solver_test.dart b/sdk/lib/_internal/pub/test/version_solver_test.dart
index 47d7198..a0b900a 100644
--- a/sdk/lib/_internal/pub/test/version_solver_test.dart
+++ b/sdk/lib/_internal/pub/test/version_solver_test.dart
@@ -698,6 +698,31 @@
     'baz': '0.0.0'
   }, maxTries: 100);
 
+  // If there's a disjoint constraint on a package, then selecting other
+  // versions of it is a waste of time: no possible versions can match. We need
+  // to jump past it to the most recent package that affected the constraint.
+  testResolve('backjump past failed package on disjoint constraint', {
+    'myapp 0.0.0': {
+      'a': 'any',
+      'foo': '>2.0.0'
+    },
+    'a 1.0.0': {
+      'foo': 'any' // ok
+    },
+    'a 2.0.0': {
+      'foo': '<1.0.0' // disjoint with myapp's constraint on foo
+    },
+    'foo 2.0.0': {},
+    'foo 2.0.1': {},
+    'foo 2.0.2': {},
+    'foo 2.0.3': {},
+    'foo 2.0.4': {}
+  }, result: {
+    'myapp from root': '0.0.0',
+    'a': '1.0.0',
+    'foo': '2.0.4'
+  }, maxTries: 2);
+
   // TODO(rnystrom): More tests. In particular:
   // - Tests that demonstrate backtracking for every case that can cause a
   //   solution to fail (no versions, disjoint, etc.)
@@ -825,7 +850,7 @@
           // remote server.
           root = package;
         } else {
-          cache.sources[source].addPackage(name, package);
+          (cache.sources[source] as MockSource).addPackage(name, package);
         }
       });
     });
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index 95835e3..dbe3374 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -499,6 +499,20 @@
   }
 
   /**
+   * Discards all data on the stream, but signals when it's done or an error
+   * occured.
+   *
+   * When subscribing using [drain], cancelOnError will be true. This means
+   * that the future will complete with the first error on the stream and then
+   * cancel the subscription.
+   *
+   * In case of a `done` event the future completes with the given
+   * [futureValue].
+   */
+  Future drain([var futureValue]) => listen(null, cancelOnError: true)
+      .asFuture(futureValue);
+
+  /**
    * Provides at most the first [n] values of this stream.
    *
    * Forwards the first [n] data events of this stream, and all error
@@ -519,7 +533,7 @@
    * when either this stream is done, or when this stream first provides
    * a value that [test] doesn't accept.
    */
-  Stream<T> takeWhile(bool test(T value)) {
+  Stream<T> takeWhile(bool test(T element)) {
     return new _TakeWhileStream(this, test);
   }
 
@@ -538,7 +552,7 @@
    * Starting with the first data event where [test] returns true for the
    * event data, the returned stream will have the same events as this stream.
    */
-  Stream<T> skipWhile(bool test(T value)) {
+  Stream<T> skipWhile(bool test(T element)) {
     return new _SkipWhileStream(this, test);
   }
 
@@ -659,7 +673,7 @@
    * with no [defaultValue] function provided, the future will receive an
    * error.
    */
-  Future<T> firstWhere(bool test(T value), {T defaultValue()}) {
+  Future<T> firstWhere(bool test(T element), {T defaultValue()}) {
     _FutureImpl<T> future = new _FutureImpl<T>();
     StreamSubscription subscription;
     subscription = this.listen(
@@ -696,7 +710,7 @@
    * That means that the result cannot be provided before this stream
    * is done.
    */
-  Future<T> lastWhere(bool test(T value), {T defaultValue()}) {
+  Future<T> lastWhere(bool test(T element), {T defaultValue()}) {
     _FutureImpl<T> future = new _FutureImpl<T>();
     T result = null;
     bool foundResult = false;
@@ -738,7 +752,7 @@
    * Like [lastMatch], except that it is an error if more than one
    * matching element occurs in the stream.
    */
-  Future<T> singleWhere(bool test(T value)) {
+  Future<T> singleWhere(bool test(T element)) {
     _FutureImpl<T> future = new _FutureImpl<T>();
     T result = null;
     bool foundResult = false;
diff --git a/sdk/lib/async/timer.dart b/sdk/lib/async/timer.dart
index b321e41..bfa7ced 100644
--- a/sdk/lib/async/timer.dart
+++ b/sdk/lib/async/timer.dart
@@ -5,8 +5,6 @@
 part of dart.async;
 
 abstract class Timer {
-  // Internal list used to group Timer.run callbacks.
-  static List _runCallbacks = [];
 
   /**
    * Creates a new timer.
@@ -44,33 +42,11 @@
 
   /**
    * Runs the given [callback] asynchronously as soon as possible.
+   *
+   * This function is equivalent to `new Timer(Duration.ZERO, callback)`.
    */
   static void run(void callback()) {
-    // Optimizing a group of Timer.run callbacks to be executed in the
-    // same Timer callback.
-    _runCallbacks.add(callback);
-    if (_runCallbacks.length == 1) {
-      new Timer(const Duration(milliseconds: 0), () {
-        List runCallbacks = _runCallbacks;
-        // Create new list to make sure we don't call newly added callbacks in
-        // this event.
-        _runCallbacks = [];
-        for (int i = 0; i < runCallbacks.length; i++) {
-          Function callback = runCallbacks[i];
-          try {
-            callback();
-          } catch (e) {
-            List newCallbacks = _runCallbacks;
-            _runCallbacks = [];
-            i++;  // Skip the current;
-            _runCallbacks.addAll(
-                runCallbacks.sublist(i));
-            _runCallbacks.addAll(newCallbacks);
-            throw;
-          }
-        }
-      });
-    }
+    new Timer(Duration.ZERO, callback);
   }
 
   /**
diff --git a/sdk/lib/core/double.dart b/sdk/lib/core/double.dart
index 65b9c30..d07e9c2 100644
--- a/sdk/lib/core/double.dart
+++ b/sdk/lib/core/double.dart
@@ -133,16 +133,32 @@
   /**
    * Parse [source] as an double literal and return its value.
    *
-   * Accepts the same format as double literals:
-   *   [: ['+'|'-'] [digit* '.'] digit+ [('e'|'E') ['+'|'-'] digit+] :]
+   * Accepts an optional sign (`+` or `-`) followed by either the characters
+   * "Infinity", the characters "NaN" or a floating-point representation.
+   * A floating-point representation is composed of a mantissa and an optional
+   * exponent part. The mantissa is either a decimal point (`.`) followed by a
+   * sequence of (decimal) digits, or a sequence of digits
+   * optionally followed by a decimal point and optionally more digits. The
+   * (optional) exponent part consists of the character "e" or "E", an optional
+   * sign, and one or more digits.
    *
-   * Also recognizes "NaN", "Infinity" and "-Infinity" as inputs and
-   * returns the corresponding double value.
+   * The input string is trimmed (see [String.trim]) before conversion.
    *
-   * If the [soure] is not a valid double literal, the [handleError]
+   * If the [source] is not a valid double literal, the [handleError]
    * is called with the [source] as argument, and its return value is
    * used instead. If no handleError is provided, a [FormatException]
    * is thrown.
+   *
+   * Examples of accepted strings:
+   *
+   *     "3.14"
+   *     "  3.14 \xA0"
+   *     "0."
+   *     ".0"
+   *     "-1.e3"
+   *     "1234E+7"
+   *     "+.12e-9"
+   *     "-NaN"
    */
   external static double parse(String source,
                                [double handleError(String source)]);
diff --git a/sdk/lib/core/iterable.dart b/sdk/lib/core/iterable.dart
index ef6239a..b802cfd 100644
--- a/sdk/lib/core/iterable.dart
+++ b/sdk/lib/core/iterable.dart
@@ -52,15 +52,15 @@
 
   /**
    * Returns a lazy [Iterable] with all elements that satisfy the
-   * predicate [f].
+   * predicate [test].
    *
    * This method returns a view of the mapped elements. As long as the
-   * returned [Iterable] is not iterated over, the supplied function [f] will
+   * returned [Iterable] is not iterated over, the supplied function [test] will
    * not be invoked. Iterating will not cache results, and thus iterating
    * multiple times over the the returned [Iterable] will invoke the supplied
-   * function [f] multiple times on the same element.
+   * function [test] multiple times on the same element.
    */
-  Iterable<E> where(bool f(E element));
+  Iterable<E> where(bool test(E element));
 
   /**
    * Expand each element of this [Iterable] into zero or more elements.
@@ -112,9 +112,9 @@
 
   /**
    * Returns true if every elements of this collection satisify the
-   * predicate [f]. Returns `false` otherwise.
+   * predicate [test]. Returns `false` otherwise.
    */
-  bool every(bool f(E element));
+  bool every(bool test(E element));
 
   /**
    * Converts each element to a [String] and concatenates the strings.
@@ -131,9 +131,9 @@
 
   /**
    * Returns true if one element of this collection satisfies the
-   * predicate [f]. Returns false otherwise.
+   * predicate [test]. Returns false otherwise.
    */
-  bool any(bool f(E element));
+  bool any(bool test(E element));
 
   /**
    * Creates a [List] containing the elements of this [Iterable].
@@ -226,28 +226,28 @@
   E get single;
 
   /**
-   * Returns the first element that satisfies the given predicate [f].
+   * Returns the first element that satisfies the given predicate [test].
    *
    * If none matches, the result of invoking the [orElse] function is
    * returned. By default, when [orElse] is `null`, a [StateError] is
    * thrown.
    */
-  E firstWhere(bool test(E value), { E orElse() });
+  E firstWhere(bool test(E element), { E orElse() });
 
   /**
-   * Returns the last element that satisfies the given predicate [f].
+   * Returns the last element that satisfies the given predicate [test].
    *
    * If none matches, the result of invoking the [orElse] function is
    * returned. By default, when [orElse] is `null`, a [StateError] is
    * thrown.
    */
-  E lastWhere(bool test(E value), {E orElse()});
+  E lastWhere(bool test(E element), {E orElse()});
 
   /**
-   * Returns the single element that satisfies [f]. If no or more than one
+   * Returns the single element that satisfies [test]. If no or more than one
    * element match then a [StateError] is thrown.
    */
-  E singleWhere(bool test(E value));
+  E singleWhere(bool test(E element));
 
   /**
    * Returns the [index]th element.
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 3bb3ec2..8e53e7f 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -140,10 +140,14 @@
 
   @DomName('HTMLAnchorElement.name')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLAnchorElement-partial
+  @deprecated // deprecated
   String name;
 
   @DomName('HTMLAnchorElement.origin')
   @DocsEditable
+  // WebKit only
+  @deprecated // nonstandard
   final String origin;
 
   @DomName('HTMLAnchorElement.pathname')
@@ -152,6 +156,8 @@
 
   @DomName('HTMLAnchorElement.ping')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#the-a-element
+  @deprecated // deprecated
   String ping;
 
   @DomName('HTMLAnchorElement.port')
@@ -214,6 +220,7 @@
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.OPERA)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class ApplicationCache extends EventTarget native "ApplicationCache,DOMApplicationCache,OfflineResourceList" {
 
   @DomName('DOMApplicationCache.cachedEvent')
@@ -390,6 +397,8 @@
 
   @DomName('HTMLAreaElement.ping')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLAreaElement-partial
+  @deprecated // deprecated
   String ping;
 
   @DomName('HTMLAreaElement.port')
@@ -448,6 +457,8 @@
 
 @DocsEditable
 @DomName('AutocompleteErrorEvent')
+// http://wiki.whatwg.org/wiki/RequestAutocomplete
+@Experimental
 class AutocompleteErrorEvent extends Event native "AutocompleteErrorEvent" {
 
   @DomName('AutocompleteErrorEvent.reason')
@@ -474,6 +485,8 @@
 
 @DocsEditable
 @DomName('BarInfo')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#barprop (Rename to BarProp?)
+@Experimental // non-standard
 class BarInfo native "BarInfo" {
 
   @DomName('BarInfo.visible')
@@ -508,6 +521,7 @@
 
 @DocsEditable
 @DomName('BeforeLoadEvent')
+@Experimental
 class BeforeLoadEvent extends Event native "BeforeLoadEvent" {
 
   @DomName('BeforeLoadEvent.url')
@@ -710,6 +724,7 @@
 
   @DomName('HTMLButtonElement.labels')
   @DocsEditable
+  @Unstable
   @Returns('NodeList')
   @Creates('NodeList')
   final List<Node> labels;
@@ -753,6 +768,8 @@
 
 @DocsEditable
 @DomName('CDATASection')
+// http://dom.spec.whatwg.org/#cdatasection
+@deprecated // deprecated
 class CDataSection extends Text native "CDATASection" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -762,10 +779,12 @@
 
 @DocsEditable
 @DomName('Canvas2DContextAttributes')
+@Experimental // untriaged
 class Canvas2DContextAttributes native "Canvas2DContextAttributes" {
 
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable
+  @Experimental // untriaged
   bool alpha;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1003,6 +1022,8 @@
 
   @DomName('CanvasRenderingContext2D.currentPath')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects
+  @Experimental
   Path currentPath;
 
   @DomName('CanvasRenderingContext2D.fillStyle')
@@ -1165,6 +1186,7 @@
 
   @DomName('CanvasRenderingContext2D.getContextAttributes')
   @DocsEditable
+  @Experimental // untriaged
   Canvas2DContextAttributes getContextAttributes() native;
 
   @DomName('CanvasRenderingContext2D.getImageData')
@@ -1211,9 +1233,11 @@
       _putImageData_1(imagedata_1, dx, dy);
       return;
     }
-    var imagedata_2 = _convertDartToNative_ImageData(imagedata);
-    _putImageData_2(imagedata_2, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
-    return;
+    if (?dirtyX && ?dirtyY && ?dirtyWidth && ?dirtyHeight) {
+      var imagedata_2 = _convertDartToNative_ImageData(imagedata);
+      _putImageData_2(imagedata_2, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+      return;
+    }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('putImageData')
@@ -1306,9 +1330,11 @@
       _putImageDataHD_1(imagedata_1, dx, dy);
       return;
     }
-    var imagedata_2 = _convertDartToNative_ImageData(imagedata);
-    _putImageDataHD_2(imagedata_2, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
-    return;
+    if (?dirtyX && ?dirtyY && ?dirtyWidth && ?dirtyHeight) {
+      var imagedata_2 = _convertDartToNative_ImageData(imagedata);
+      _putImageDataHD_2(imagedata_2, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+      return;
+    }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('webkitPutImageDataHD')
@@ -1614,14 +1640,17 @@
 
 @DocsEditable
 @DomName('Composition')
+@Experimental // untriaged
 class Composition native "Composition" {
 
   @DomName('Composition.caret')
   @DocsEditable
+  @Experimental // untriaged
   final Range caret;
 
   @DomName('Composition.text')
   @DocsEditable
+  @Experimental // untriaged
   final Node text;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -1752,10 +1781,12 @@
 
   @DomName('Console.clear')
   @DocsEditable
+  @Experimental
   void clear(Object arg) native;
 
   @DomName('Console.table')
   @DocsEditable
+  @Experimental
   void table(Object arg) native;
 
 }
@@ -1768,6 +1799,7 @@
 @DomName('HTMLContentElement')
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
 @Experimental
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#content-element
 class ContentElement extends Element native "HTMLContentElement" {
 
   @DomName('HTMLContentElement.HTMLContentElement')
@@ -1838,6 +1870,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/WebCryptoAPI/
 class Crypto native "Crypto" {
 
   /// Checks if this type is supported on the current platform.
@@ -1856,10 +1889,12 @@
 
 @DocsEditable
 @DomName('CSS')
+@Experimental // untriaged
 class Css native "CSS" {
 
   @DomName('CSS.supports')
   @DocsEditable
+  @Experimental // untriaged
   bool supports(String conditionText_OR_property, [String value]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1869,6 +1904,8 @@
 
 @DocsEditable
 @DomName('CSSCharsetRule')
+// http://dev.w3.org/csswg/cssom/#the-csscharsetrule-interface
+@Experimental
 class CssCharsetRule extends CssRule native "CSSCharsetRule" {
 
   @DomName('CSSCharsetRule.encoding')
@@ -1885,6 +1922,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/filter-effects/
 class CssFilterRule extends CssRule native "WebKitCSSFilterRule" {
 
   @DomName('WebKitCSSFilterRule.style')
@@ -1898,6 +1936,8 @@
 
 @DocsEditable
 @DomName('CSSFontFaceLoadEvent')
+// http://www.w3.org/TR/css3-fonts/
+@Experimental
 class CssFontFaceLoadEvent extends Event native "CSSFontFaceLoadEvent" {
 
   @DomName('CSSFontFaceLoadEvent.error')
@@ -1930,6 +1970,7 @@
 @DomName('CSSHostRule')
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
 @Experimental
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#css-host-rule-interface
 class CssHostRule extends CssRule native "CSSHostRule" {
 
   @DomName('CSSHostRule.cssRules')
@@ -1977,6 +2018,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/css3-animations/#CSSKeyframeRule-interface
 class CssKeyframeRule extends CssRule native "WebKitCSSKeyframeRule" {
 
   @DomName('WebKitCSSKeyframeRule.keyText')
@@ -1997,6 +2039,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/css3-animations/#csskeyframesrule
 class CssKeyframesRule extends CssRule native "WebKitCSSKeyframesRule" {
 
   @DomName('WebKitCSSKeyframesRule.cssRules')
@@ -2075,6 +2118,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://dev.w3.org/csswg/css-regions/#region-style-rule-interface
 class CssRegionRule extends CssRule native "WebKitCSSRegionRule" {
 
   @DomName('WebKitCSSRegionRule.cssRules')
@@ -2102,6 +2146,8 @@
 
   @DomName('CSSRule.HOST_RULE')
   @DocsEditable
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-css-rule-host-rule
+  @Experimental
   static const int HOST_RULE = 1001;
 
   @DomName('CSSRule.IMPORT_RULE')
@@ -2122,26 +2168,37 @@
 
   @DomName('CSSRule.SUPPORTS_RULE')
   @DocsEditable
+  @Experimental // untriaged
   static const int SUPPORTS_RULE = 12;
 
   @DomName('CSSRule.UNKNOWN_RULE')
   @DocsEditable
+  // http://dev.w3.org/csswg/cssom/#changes-from-dom2
+  @deprecated // deprecated
   static const int UNKNOWN_RULE = 0;
 
   @DomName('CSSRule.WEBKIT_FILTER_RULE')
   @DocsEditable
+  // http://www.w3.org/TR/filter-effects/
+  @Experimental
   static const int WEBKIT_FILTER_RULE = 17;
 
   @DomName('CSSRule.WEBKIT_KEYFRAMES_RULE')
   @DocsEditable
+  // http://www.w3.org/TR/css3-animations/#cssrule
+  @Experimental
   static const int WEBKIT_KEYFRAMES_RULE = 7;
 
   @DomName('CSSRule.WEBKIT_KEYFRAME_RULE')
   @DocsEditable
+  // http://www.w3.org/TR/css3-animations/#cssrule
+  @Experimental
   static const int WEBKIT_KEYFRAME_RULE = 8;
 
   @DomName('CSSRule.WEBKIT_REGION_RULE')
   @DocsEditable
+  // http://dev.w3.org/csswg/css-regions/#region-style-rule-interface
+  @Experimental
   static const int WEBKIT_REGION_RULE = 16;
 
   @DomName('CSSRule.cssText')
@@ -2190,6 +2247,8 @@
 
   @DomName('CSSStyleDeclaration.getPropertyShorthand')
   @DocsEditable
+  // http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface
+  @deprecated // deprecated
   String getPropertyShorthand(String propertyName) native;
 
   @JSName('getPropertyValue')
@@ -2199,6 +2258,8 @@
 
   @DomName('CSSStyleDeclaration.isPropertyImplicit')
   @DocsEditable
+  // http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface
+  @deprecated // deprecated
   bool isPropertyImplicit(String propertyName) native;
 
   @DomName('CSSStyleDeclaration.item')
@@ -5438,12 +5499,14 @@
 
   @DomName('CSSStyleSheet.rules')
   @DocsEditable
+  @Experimental // non-standard
   @Returns('_CssRuleList')
   @Creates('_CssRuleList')
   final List<CssRule> rules;
 
   @DomName('CSSStyleSheet.addRule')
   @DocsEditable
+  @Experimental // non-standard
   int addRule(String selector, String style, [int index]) native;
 
   @DomName('CSSStyleSheet.deleteRule')
@@ -5456,6 +5519,7 @@
 
   @DomName('CSSStyleSheet.removeRule')
   @DocsEditable
+  @Experimental // non-standard
   void removeRule(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5465,24 +5529,29 @@
 
 @DocsEditable
 @DomName('CSSSupportsRule')
+@Experimental // untriaged
 class CssSupportsRule extends CssRule native "CSSSupportsRule" {
 
   @DomName('CSSSupportsRule.conditionText')
   @DocsEditable
+  @Experimental // untriaged
   final String conditionText;
 
   @DomName('CSSSupportsRule.cssRules')
   @DocsEditable
+  @Experimental // untriaged
   @Returns('_CssRuleList')
   @Creates('_CssRuleList')
   final List<CssRule> cssRules;
 
   @DomName('CSSSupportsRule.deleteRule')
   @DocsEditable
+  @Experimental // untriaged
   void deleteRule(int index) native;
 
   @DomName('CSSSupportsRule.insertRule')
   @DocsEditable
+  @Experimental // untriaged
   int insertRule(String rule, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5492,6 +5561,8 @@
 
 @DocsEditable
 @DomName('CSSUnknownRule')
+// http://dev.w3.org/csswg/cssom/#the-cssstylesheet-interface
+@deprecated // deprecated
 class CssUnknownRule extends CssRule native "CSSUnknownRule" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5501,6 +5572,8 @@
 
 @DocsEditable
 @DomName('CustomElementConstructor')
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html#dfn-custom-element-constructor-generation
+@Experimental
 class CustomElementConstructor native "CustomElementConstructor" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5638,6 +5711,8 @@
 
 @DocsEditable
 @DomName('DataTransferItem')
+// http://www.w3.org/TR/2011/WD-html5-20110113/dnd.html#the-datatransferitem-interface
+@Experimental
 class DataTransferItem native "DataTransferItem" {
 
   @DomName('DataTransferItem.kind')
@@ -5682,6 +5757,8 @@
 
 @DocsEditable
 @DomName('DataTransferItemList')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-datatransferitemlist-interface
+@Experimental
 class DataTransferItemList native "DataTransferItemList" {
 
   @DomName('DataTransferItemList.length')
@@ -5707,6 +5784,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('DatabaseCallback')
+// http://www.w3.org/TR/webdatabase/#databasecallback
+@Experimental // deprecated
 typedef void DatabaseCallback(database);
 // 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
@@ -5738,6 +5818,8 @@
 
 @DocsEditable
 @DomName('DeviceAcceleration')
+// http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
+@Experimental
 class DeviceAcceleration native "DeviceAcceleration" {
 
   @DomName('DeviceAcceleration.x')
@@ -5759,6 +5841,8 @@
 
 @DocsEditable
 @DomName('DeviceMotionEvent')
+// http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
+@Experimental
 class DeviceMotionEvent extends Event native "DeviceMotionEvent" {
 
   @DomName('DeviceMotionEvent.acceleration')
@@ -5784,6 +5868,8 @@
 // WARNING: Do not edit - generated code.
 
 @DomName('DeviceOrientationEvent')
+// http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
+@Experimental
 
 class DeviceOrientationEvent extends Event native "DeviceOrientationEvent" {
   factory DeviceOrientationEvent(String type,
@@ -5824,6 +5910,8 @@
 
 @DocsEditable
 @DomName('DeviceRotationRate')
+// http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
+@Experimental
 class DeviceRotationRate native "DeviceRotationRate" {
 
   @DomName('DeviceRotationRate.alpha')
@@ -5845,6 +5933,7 @@
 
 @DocsEditable
 @DomName('HTMLDialogElement')
+@Unstable
 class DialogElement extends Element native "HTMLDialogElement" {
 
   @DomName('HTMLDialogElement.open')
@@ -5869,6 +5958,8 @@
 
 
 @DomName('DirectoryEntry')
+// http://www.w3.org/TR/file-system-api/#the-directoryentry-interface
+@Experimental
 class DirectoryEntry extends Entry native "DirectoryEntry" {
   
   /**
@@ -6035,6 +6126,8 @@
 
 @DocsEditable
 @DomName('DirectoryReader')
+// http://www.w3.org/TR/file-system-api/#the-directoryreader-interface
+@Experimental
 class DirectoryReader native "DirectoryReader" {
 
   @JSName('readEntries')
@@ -6112,6 +6205,8 @@
 
   @DomName('Document.securitypolicyviolationEvent')
   @DocsEditable
+  // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#widl-Document-onsecuritypolicyviolation
+  @Experimental
   static const EventStreamProvider<SecurityPolicyViolationEvent> securityPolicyViolationEvent = const EventStreamProvider<SecurityPolicyViolationEvent>('securitypolicyviolation');
 
   @DomName('Document.selectionchangeEvent')
@@ -6123,6 +6218,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockchange
   static const EventStreamProvider<Event> pointerLockChangeEvent = const EventStreamProvider<Event>('webkitpointerlockchange');
 
   @DomName('Document.webkitpointerlockerrorEvent')
@@ -6130,6 +6226,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockerror
   static const EventStreamProvider<Event> pointerLockErrorEvent = const EventStreamProvider<Event>('webkitpointerlockerror');
 
   @JSName('body')
@@ -6140,6 +6237,7 @@
 
   @DomName('Document.charset')
   @DocsEditable
+  @deprecated // nonstandard
   String charset;
 
   @DomName('Document.cookie')
@@ -6150,6 +6248,7 @@
   @JSName('defaultView')
   @DomName('Document.window')
   @DocsEditable
+  @Experimental // untriaged
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   @Creates('Window|=Object|Null')
@@ -6166,6 +6265,8 @@
 
   @DomName('Document.fontloader')
   @DocsEditable
+  // http://www.w3.org/TR/css3-fonts/#document-fontloader
+  @Experimental
   final FontLoader fontloader;
 
   @JSName('head')
@@ -6201,6 +6302,8 @@
 
   @DomName('Document.securityPolicy')
   @DocsEditable
+  // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#idl-def-SecurityPolicy
+  @Experimental
   final SecurityPolicy securityPolicy;
 
   @JSName('selectedStylesheetSet')
@@ -6229,6 +6332,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenelement
   final Element $dom_webkitFullscreenElement;
 
   @JSName('webkitFullscreenEnabled')
@@ -6238,6 +6342,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenenabled
   final bool $dom_webkitFullscreenEnabled;
 
   @JSName('webkitHidden')
@@ -6247,6 +6352,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#document
   final bool $dom_webkitHidden;
 
   @JSName('webkitIsFullScreen')
@@ -6256,6 +6362,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @deprecated // deprecated
   final bool $dom_webkitIsFullScreen;
 
   @JSName('webkitPointerLockElement')
@@ -6265,6 +6373,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-pointerLockElement
   final Element $dom_webkitPointerLockElement;
 
   @JSName('webkitVisibilityState')
@@ -6273,17 +6382,22 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#dom-document-visibilitystate
   final String $dom_webkitVisibilityState;
 
   @JSName('caretRangeFromPoint')
   /// Use the [Range] constructor instead.
   @DomName('Document.caretRangeFromPoint')
   @DocsEditable
+  // http://www.w3.org/TR/2009/WD-cssom-view-20090804/#dom-documentview-caretrangefrompoint
+  @Experimental
   Range $dom_caretRangeFromPoint(int x, int y) native;
 
   @JSName('createCDATASection')
   @DomName('Document.createCDATASection')
   @DocsEditable
+  // http://dom.spec.whatwg.org/#dom-document-createcdatasection
+  @deprecated // deprecated
   CDataSection createCDataSection(String data) native;
 
   @DomName('Document.createDocumentFragment')
@@ -6309,6 +6423,7 @@
   @JSName('createNodeIterator')
   @DomName('Document.createNodeIterator')
   @DocsEditable
+  @Unstable
   NodeIterator $dom_createNodeIterator(Node root, int whatToShow, NodeFilter filter, bool expandEntityReferences) native;
 
   @JSName('createRange')
@@ -6323,6 +6438,8 @@
 
   @DomName('Document.createTouch')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   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);
@@ -6330,12 +6447,16 @@
   @JSName('createTouch')
   @DomName('Document.createTouch')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Touch _$dom_createTouch_1(Window window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native;
 
   @JSName('createTouchList')
   /// Use the [TouchList] constructor instead.
   @DomName('Document.createTouchList')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   TouchList $dom_createTouchList() native;
 
   @JSName('createTreeWalker')
@@ -6356,6 +6477,8 @@
   /// Moved to [HtmlDocument].
   @DomName('Document.getCSSCanvasContext')
   @DocsEditable
+  // https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariCSSRef/Articles/Functions.html
+  @Experimental // non-standard
   CanvasRenderingContext $dom_getCssCanvasContext(String contextId, String name, int width, int height) native;
 
   @DomName('Document.getElementById')
@@ -6435,6 +6558,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @deprecated // deprecated
   void $dom_webkitCancelFullScreen() native;
 
   @JSName('webkitExitFullscreen')
@@ -6444,6 +6569,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
   void $dom_webkitExitFullscreen() native;
 
   @JSName('webkitExitPointerLock')
@@ -6453,6 +6579,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-exitPointerLock-void
   void $dom_webkitExitPointerLock() native;
 
   @JSName('webkitGetNamedFlows')
@@ -6461,6 +6588,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.w3.org/TR/css3-regions/#dom-named-flow-collection
   NamedFlowCollection getNamedFlows() native;
 
   @DomName('Document.webkitRegister')
@@ -6468,6 +6596,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html#dfn-document-register
   CustomElementConstructor register(String name, [Map options]) {
     if (?options) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -6481,6 +6610,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html#dfn-document-register
   CustomElementConstructor _register_1(name, options) native;
   @JSName('webkitRegister')
   @DomName('Document.webkitRegister')
@@ -6488,6 +6618,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html#dfn-document-register
   CustomElementConstructor _register_2(name) native;
 
   @DomName('Document.onabort')
@@ -6636,10 +6767,14 @@
 
   @DomName('Document.onsearch')
   @DocsEditable
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental
   Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
   @DomName('Document.onsecuritypolicyviolation')
   @DocsEditable
+  // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#widl-Document-onsecuritypolicyviolation
+  @Experimental
   Stream<SecurityPolicyViolationEvent> get onSecurityPolicyViolation => securityPolicyViolationEvent.forTarget(this);
 
   @DomName('Document.onselect')
@@ -6660,34 +6795,50 @@
 
   @DomName('Document.ontouchcancel')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
 
   @DomName('Document.ontouchend')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
   @DomName('Document.ontouchmove')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
   @DomName('Document.ontouchstart')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
   @DomName('Document.onwebkitfullscreenchange')
   @DocsEditable
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @Experimental
   Stream<Event> get onFullscreenChange => Element.fullscreenChangeEvent.forTarget(this);
 
   @DomName('Document.onwebkitfullscreenerror')
   @DocsEditable
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @Experimental
   Stream<Event> get onFullscreenError => Element.fullscreenErrorEvent.forTarget(this);
 
   @DomName('Document.onwebkitpointerlockchange')
   @DocsEditable
+  // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockchange
+  @Experimental
   Stream<Event> get onPointerLockChange => pointerLockChangeEvent.forTarget(this);
 
   @DomName('Document.onwebkitpointerlockerror')
   @DocsEditable
+  // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockerror
+  @Experimental
   Stream<Event> get onPointerLockError => pointerLockErrorEvent.forTarget(this);
 
 
@@ -6806,6 +6957,8 @@
 
 @DocsEditable
 @DomName('DocumentType')
+// http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-412266927
+@deprecated // stable
 class DocumentType extends Node native "DocumentType" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6827,6 +6980,7 @@
 
 
 @DomName('DOMException')
+@Unstable
 class DomException native "DOMException" {
 
   static const String INDEX_SIZE = 'IndexSizeError';
@@ -6883,6 +7037,7 @@
   @JSName('createCSSStyleSheet')
   @DomName('DOMImplementation.createCSSStyleSheet')
   @DocsEditable
+  @Experimental // non-standard
   CssStyleSheet createCssStyleSheet(String title, String media) native;
 
   @DomName('DOMImplementation.createDocument')
@@ -8057,6 +8212,8 @@
 
   @DomName('Element.searchEvent')
   @DocsEditable
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental
   static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
 
   @DomName('Element.selectEvent')
@@ -8065,6 +8222,7 @@
 
   @DomName('Element.selectstartEvent')
   @DocsEditable
+  @Experimental // nonstandard
   static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
 
   @DomName('Element.submitEvent')
@@ -8073,26 +8231,38 @@
 
   @DomName('Element.touchcancelEvent')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   static const EventStreamProvider<TouchEvent> touchCancelEvent = const EventStreamProvider<TouchEvent>('touchcancel');
 
   @DomName('Element.touchendEvent')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   static const EventStreamProvider<TouchEvent> touchEndEvent = const EventStreamProvider<TouchEvent>('touchend');
 
   @DomName('Element.touchenterEvent')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   static const EventStreamProvider<TouchEvent> touchEnterEvent = const EventStreamProvider<TouchEvent>('touchenter');
 
   @DomName('Element.touchleaveEvent')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   static const EventStreamProvider<TouchEvent> touchLeaveEvent = const EventStreamProvider<TouchEvent>('touchleave');
 
   @DomName('Element.touchmoveEvent')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   static const EventStreamProvider<TouchEvent> touchMoveEvent = const EventStreamProvider<TouchEvent>('touchmove');
 
   @DomName('Element.touchstartEvent')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   static const EventStreamProvider<TouchEvent> touchStartEvent = const EventStreamProvider<TouchEvent>('touchstart');
 
   @DomName('Element.webkitfullscreenchangeEvent')
@@ -8100,6 +8270,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   static const EventStreamProvider<Event> fullscreenChangeEvent = const EventStreamProvider<Event>('webkitfullscreenchange');
 
   @DomName('Element.webkitfullscreenerrorEvent')
@@ -8107,6 +8278,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   static const EventStreamProvider<Event> fullscreenErrorEvent = const EventStreamProvider<Event>('webkitfullscreenerror');
 
   @JSName('children')
@@ -8154,6 +8326,8 @@
 
   @DomName('Element.spellcheck')
   @DocsEditable
+  // http://blog.whatwg.org/the-road-to-html-5-spellchecking
+  @Experimental // nonstandard
   bool spellcheck;
 
   @DomName('Element.tabIndex')
@@ -8166,6 +8340,8 @@
 
   @DomName('Element.translate')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-translate-attribute
+  @Experimental
   bool translate;
 
   @JSName('webkitdropzone')
@@ -8174,6 +8350,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
   String dropzone;
 
   @DomName('Element.click')
@@ -8182,6 +8359,8 @@
 
   @DomName('Element.ALLOW_KEYBOARD_INPUT')
   @DocsEditable
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-element-requestfullscreen
+  @deprecated // deprecated
   static const int ALLOW_KEYBOARD_INPUT = 1;
 
   @JSName('attributes')
@@ -8283,6 +8462,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://www.w3.org/Bugs/Public/show_bug.cgi?id=21067
   final Node insertionParent;
 
   @JSName('webkitPseudo')
@@ -8291,6 +8471,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // nonstandard
   String pseudo;
 
   @JSName('webkitRegionOverset')
@@ -8299,6 +8480,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://dev.w3.org/csswg/css-regions/#dom-region-regionoverset
   final String regionOverset;
 
   @JSName('webkitShadowRoot')
@@ -8307,6 +8489,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
   final ShadowRoot shadowRoot;
 
   @DomName('Element.blur')
@@ -8415,6 +8598,8 @@
   @JSName('scrollIntoViewIfNeeded')
   @DomName('Element.scrollIntoViewIfNeeded')
   @DocsEditable
+  // http://docs.webplatform.org/wiki/dom/methods/scrollIntoViewIfNeeded
+  @Experimental // non-standard
   void $dom_scrollIntoViewIfNeeded([bool centerIfNeeded]) native;
 
   @JSName('setAttribute')
@@ -8432,6 +8617,7 @@
   @DocsEditable
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
   @Experimental
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
   ShadowRoot createShadowRoot() native;
 
   @JSName('webkitGetRegionFlowRanges')
@@ -8440,6 +8626,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://dev.w3.org/csswg/css-regions/#dom-region-getregionflowranges
   List<Range> getRegionFlowRanges() native;
 
   @JSName('webkitRequestFullScreen')
@@ -8448,6 +8635,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-element-requestfullscreen
+  @deprecated // deprecated
   void requestFullScreen(int flags) native;
 
   @JSName('webkitRequestFullscreen')
@@ -8456,6 +8645,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-element-requestfullscreen
   void requestFullscreen() native;
 
   @JSName('webkitRequestPointerLock')
@@ -8464,6 +8654,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Element-requestPointerLock-void
   void requestPointerLock() native;
 
   @DomName('Element.onabort')
@@ -8592,6 +8783,8 @@
 
   @DomName('Element.onmousewheel')
   @DocsEditable
+  // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
+  @Experimental // non-standard
   Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
 
   @DomName('Element.onpaste')
@@ -8608,6 +8801,8 @@
 
   @DomName('Element.onsearch')
   @DocsEditable
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental
   Stream<Event> get onSearch => searchEvent.forTarget(this);
 
   @DomName('Element.onselect')
@@ -8616,6 +8811,7 @@
 
   @DomName('Element.onselectstart')
   @DocsEditable
+  @Experimental // nonstandard
   Stream<Event> get onSelectStart => selectStartEvent.forTarget(this);
 
   @DomName('Element.onsubmit')
@@ -8624,26 +8820,38 @@
 
   @DomName('Element.ontouchcancel')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchCancel => touchCancelEvent.forTarget(this);
 
   @DomName('Element.ontouchend')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchEnd => touchEndEvent.forTarget(this);
 
   @DomName('Element.ontouchenter')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchEnter => touchEnterEvent.forTarget(this);
 
   @DomName('Element.ontouchleave')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchLeave => touchLeaveEvent.forTarget(this);
 
   @DomName('Element.ontouchmove')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchMove => touchMoveEvent.forTarget(this);
 
   @DomName('Element.ontouchstart')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchStart => touchStartEvent.forTarget(this);
 
   @DomName('Element.onwebkitTransitionEnd')
@@ -8652,14 +8860,19 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
+  @deprecated
   Stream<TransitionEvent> get onTransitionEnd => transitionEndEvent.forTarget(this);
 
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @Experimental
   Stream<Event> get onFullscreenChange => fullscreenChangeEvent.forTarget(this);
 
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @Experimental
   Stream<Event> get onFullscreenError => fullscreenErrorEvent.forTarget(this);
 
 }
@@ -8809,6 +9022,7 @@
 
 
 @DomName('ElementTraversal')
+@Unstable
 abstract class ElementTraversal {
 
   int $dom_childElementCount;
@@ -8831,6 +9045,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class EmbedElement extends Element native "HTMLEmbedElement" {
 
   @DomName('HTMLEmbedElement.HTMLEmbedElement')
@@ -8842,6 +9057,8 @@
 
   @DomName('HTMLEmbedElement.align')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLEmbedElement-partial
+  @deprecated // deprecated
   String align;
 
   @DomName('HTMLEmbedElement.height')
@@ -8871,6 +9088,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('EntriesCallback')
+// http://www.w3.org/TR/file-system-api/#the-entriescallback-interface
+@Experimental
 typedef void _EntriesCallback(List<Entry> entries);
 // 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
@@ -8879,6 +9099,8 @@
 
 @DocsEditable
 @DomName('Entry')
+// http://www.w3.org/TR/file-system-api/#the-entry-interface
+@Experimental
 class Entry native "Entry" {
 
   @DomName('Entry.filesystem')
@@ -8993,6 +9215,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('EntryCallback')
+// http://www.w3.org/TR/file-system-api/#the-entrycallback-interface
+@Experimental
 typedef void _EntryCallback(Entry entry);
 // 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
@@ -9001,6 +9226,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('ErrorCallback')
+// http://www.w3.org/TR/file-system-api/#the-errorcallback-interface
+@Experimental
 typedef void _ErrorCallback(FileError 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
@@ -9009,6 +9237,7 @@
 
 @DocsEditable
 @DomName('ErrorEvent')
+@Unstable
 class ErrorEvent extends Event native "ErrorEvent" {
 
   @DomName('ErrorEvent.filename')
@@ -9065,6 +9294,8 @@
 
   @DomName('Event.BLUR')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int BLUR = 8192;
 
   @DomName('Event.BUBBLING_PHASE')
@@ -9077,66 +9308,98 @@
 
   @DomName('Event.CHANGE')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int CHANGE = 32768;
 
   @DomName('Event.CLICK')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int CLICK = 64;
 
   @DomName('Event.DBLCLICK')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int DBLCLICK = 128;
 
   @DomName('Event.DRAGDROP')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int DRAGDROP = 2048;
 
   @DomName('Event.FOCUS')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int FOCUS = 4096;
 
   @DomName('Event.KEYDOWN')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int KEYDOWN = 256;
 
   @DomName('Event.KEYPRESS')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int KEYPRESS = 1024;
 
   @DomName('Event.KEYUP')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int KEYUP = 512;
 
   @DomName('Event.MOUSEDOWN')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int MOUSEDOWN = 1;
 
   @DomName('Event.MOUSEDRAG')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int MOUSEDRAG = 32;
 
   @DomName('Event.MOUSEMOVE')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int MOUSEMOVE = 16;
 
   @DomName('Event.MOUSEOUT')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int MOUSEOUT = 8;
 
   @DomName('Event.MOUSEOVER')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int MOUSEOVER = 4;
 
   @DomName('Event.MOUSEUP')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int MOUSEUP = 2;
 
   @DomName('Event.NONE')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int NONE = 0;
 
   @DomName('Event.SELECT')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int SELECT = 16384;
 
   @DomName('Event.bubbles')
@@ -9145,6 +9408,8 @@
 
   @DomName('Event.cancelBubble')
   @DocsEditable
+  // http://www.w3.org/TR/DOM-Level-3-Events/#events-event-type-stopPropagation
+  @deprecated // deprecated
   bool cancelBubble;
 
   @DomName('Event.cancelable')
@@ -9156,6 +9421,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // Part of copy/paste
+  @Experimental // nonstandard
   final DataTransfer clipboardData;
 
   EventTarget get currentTarget => _convertNativeToDart_EventTarget(this._get_currentTarget);
@@ -9215,6 +9482,7 @@
 
 @DocsEditable
 @DomName('EventException')
+@Unstable
 class EventException native "EventException" {
 
   @DomName('EventException.DISPATCH_REQUEST_ERR')
@@ -9231,10 +9499,12 @@
 
   @DomName('EventException.message')
   @DocsEditable
+  @deprecated // nonstandard
   final String message;
 
   @DomName('EventException.name')
   @DocsEditable
+  @deprecated // nonstandard
   final String name;
 
   @DomName('EventException.toString')
@@ -9247,6 +9517,8 @@
 
 
 @DomName('EventSource')
+// http://www.w3.org/TR/eventsource/#the-eventsource-interface
+@Experimental // stable
 class EventSource extends EventTarget native "EventSource" {
   factory EventSource(String title, {withCredentials: false}) {
     var parsedOptions = {
@@ -9423,6 +9695,7 @@
 
 @DocsEditable
 @DomName('HTMLFieldSetElement')
+@Unstable
 class FieldSetElement extends Element native "HTMLFieldSetElement" {
 
   @DomName('HTMLFieldSetElement.HTMLFieldSetElement')
@@ -9494,6 +9767,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
   final String relativePath;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9503,6 +9777,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('FileCallback')
+// http://www.w3.org/TR/file-system-api/#the-filecallback-interface
+@Experimental
 typedef void _FileCallback(File file);
 // 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
@@ -9511,6 +9788,8 @@
 
 @DocsEditable
 @DomName('FileEntry')
+// http://www.w3.org/TR/file-system-api/#the-fileentry-interface
+@Experimental
 class FileEntry extends Entry native "FileEntry" {
 
   @JSName('createWriter')
@@ -9552,6 +9831,8 @@
 
 @DocsEditable
 @DomName('FileError')
+// http://dev.w3.org/2009/dap/file-system/pub/FileSystem/
+@Experimental
 class FileError native "FileError" {
 
   @DomName('FileError.ABORT_ERR')
@@ -9613,6 +9894,8 @@
 
 @DocsEditable
 @DomName('FileException')
+// http://dev.w3.org/2009/dap/file-system/pub/FileSystem/
+@Experimental
 class FileException native "FileException" {
 
   @DomName('FileException.ABORT_ERR')
@@ -9824,6 +10107,8 @@
 
   @DomName('FileReader.readAsBinaryString')
   @DocsEditable
+  // http://blog.whatwg.org/weekly-stream-autocomplete
+  @deprecated // deprecated
   void readAsBinaryString(Blob blob) native;
 
   @JSName('readAsDataURL')
@@ -9873,6 +10158,7 @@
 @DomName('DOMFileSystem')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://www.w3.org/TR/file-system-api/
 class FileSystem native "DOMFileSystem" {
 
   /// Checks if this type is supported on the current platform.
@@ -9893,6 +10179,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('FileSystemCallback')
+// http://www.w3.org/TR/file-system-api/#the-filesystemcallback-interface
+@Experimental
 typedef void _FileSystemCallback(FileSystem fileSystem);
 // 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
@@ -9901,6 +10190,8 @@
 
 @DocsEditable
 @DomName('FileWriter')
+// http://www.w3.org/TR/file-writer-api/#the-filewriter-interface
+@Experimental
 class FileWriter extends EventTarget native "FileWriter" {
 
   @DomName('FileWriter.abortEvent')
@@ -10016,6 +10307,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('FileWriterCallback')
+// http://www.w3.org/TR/file-writer-api/#idl-def-FileWriter
+@Experimental
 typedef void _FileWriterCallback(FileWriter fileWriter);
 // 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
@@ -10039,6 +10333,8 @@
 
 @DocsEditable
 @DomName('FontLoader')
+// http://www.w3.org/TR/css3-fonts/#document-fontloader
+@Experimental
 class FontLoader extends EventTarget native "FontLoader" {
 
   @DomName('FontLoader.errorEvent')
@@ -10161,10 +10457,14 @@
 
   @DomName('HTMLFormElement.autocompleteEvent')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
+  @Experimental
   static const EventStreamProvider<Event> autocompleteEvent = const EventStreamProvider<Event>('autocomplete');
 
   @DomName('HTMLFormElement.autocompleteerrorEvent')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
+  @Experimental
   static const EventStreamProvider<AutocompleteErrorEvent> autocompleteErrorEvent = const EventStreamProvider<AutocompleteErrorEvent>('autocompleteerror');
 
   @DomName('HTMLFormElement.HTMLFormElement')
@@ -10181,6 +10481,8 @@
 
   @DomName('HTMLFormElement.autocomplete')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
+  @Experimental
   String autocomplete;
 
   @DomName('HTMLFormElement.encoding')
@@ -10217,6 +10519,8 @@
 
   @DomName('HTMLFormElement.requestAutocomplete')
   @DocsEditable
+  // http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-October/037711.html
+  @Experimental
   void requestAutocomplete() native;
 
   @DomName('HTMLFormElement.reset')
@@ -10229,10 +10533,14 @@
 
   @DomName('HTMLFormElement.onautocomplete')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
+  @Experimental
   Stream<Event> get onAutocomplete => autocompleteEvent.forTarget(this);
 
   @DomName('HTMLFormElement.onautocompleteerror')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
+  @Experimental
   Stream<AutocompleteErrorEvent> get onAutocompleteError => autocompleteErrorEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10242,6 +10550,8 @@
 
 @DocsEditable
 @DomName('Gamepad')
+// https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#gamepad-interface
+@Experimental
 class Gamepad native "Gamepad" {
 
   @DomName('Gamepad.axes')
@@ -10271,6 +10581,7 @@
 
 @DocsEditable
 @DomName('Geolocation')
+@Unstable
 class Geolocation native "Geolocation" {
 
   @DomName('Geolocation.getCurrentPosition')
@@ -10387,6 +10698,7 @@
 
 @DocsEditable
 @DomName('Geoposition')
+@Unstable
 class Geoposition native "Geoposition" {
 
   @DomName('Geoposition.coords')
@@ -10423,6 +10735,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 
 class HashChangeEvent extends Event native "HashChangeEvent" {
   factory HashChangeEvent(String type,
@@ -10564,6 +10877,8 @@
 
 @DocsEditable
 @DomName('HTMLAllCollection')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dom-document-all
+@deprecated // deprecated
 class HtmlAllCollection extends Interceptor with ListMixin<Node>, ImmutableListMixin<Node> implements JavaScriptIndexingBehavior, List<Node> native "HTMLAllCollection" {
 
   @DomName('HTMLAllCollection.length')
@@ -11241,6 +11556,7 @@
    */
   @DomName('XMLHttpRequest.upload')
   @DocsEditable
+  @Unstable
   final HttpRequestUpload upload;
 
   /**
@@ -11285,6 +11601,7 @@
    */
   @DomName('XMLHttpRequest.getAllResponseHeaders')
   @DocsEditable
+  @Unstable
   String getAllResponseHeaders() native;
 
   /**
@@ -11295,6 +11612,7 @@
    */
   @DomName('XMLHttpRequest.getResponseHeader')
   @DocsEditable
+  @Unstable
   String getResponseHeader(String header) native;
 
   /**
@@ -11424,6 +11742,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+@Experimental // nonstandard
 class HttpRequestProgressEvent extends ProgressEvent native "XMLHttpRequestProgressEvent" {
 
   /// Checks if this type is supported on the current platform.
@@ -11444,6 +11763,8 @@
 
 @DocsEditable
 @DomName('XMLHttpRequestUpload')
+// http://xhr.spec.whatwg.org/#xmlhttprequestupload
+@Experimental
 class HttpRequestUpload extends EventTarget native "XMLHttpRequestUpload" {
 
   @DomName('XMLHttpRequestUpload.abortEvent')
@@ -11603,6 +11924,7 @@
 
   @DomName('HTMLImageElement.border')
   @DocsEditable
+  @deprecated // deprecated
   String border;
 
   @DomName('HTMLImageElement.complete')
@@ -11623,6 +11945,7 @@
 
   @DomName('HTMLImageElement.lowsrc')
   @DocsEditable
+  @deprecated // deprecated
   String lowsrc;
 
   @DomName('HTMLImageElement.naturalHeight')
@@ -11647,10 +11970,12 @@
 
   @DomName('HTMLImageElement.x')
   @DocsEditable
+  @deprecated // deprecated
   final int x;
 
   @DomName('HTMLImageElement.y')
   @DocsEditable
+  @deprecated // deprecated
   final int y;
 
 }
@@ -11756,6 +12081,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#extending_html_elements
   static const EventStreamProvider<Event> speechChangeEvent = const EventStreamProvider<Event>('webkitSpeechChange');
 
   @DomName('HTMLInputElement.accept')
@@ -11830,6 +12156,8 @@
 
   @DomName('HTMLInputElement.incremental')
   @DocsEditable
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental
   bool incremental;
 
   @DomName('HTMLInputElement.indeterminate')
@@ -11912,6 +12240,8 @@
 
   @DomName('HTMLInputElement.useMap')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLInputElement-partial
+  @deprecated // deprecated
   String useMap;
 
   @DomName('HTMLInputElement.validationMessage')
@@ -11949,6 +12279,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#concept-input-type-file-selected
   @Returns('_EntryArray')
   @Creates('_EntryArray')
   final List<Entry> entries;
@@ -11959,6 +12290,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#attrib-grammar
   bool grammar;
 
   @JSName('webkitSpeech')
@@ -11967,6 +12299,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#attrib-speech
   bool speech;
 
   @JSName('webkitdirectory')
@@ -11975,6 +12308,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
   bool directory;
 
   @DomName('HTMLInputElement.width')
@@ -11999,6 +12333,8 @@
 
   @DomName('HTMLInputElement.setRangeText')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#dom-textarea/input-setrangetext
+  @Experimental // experimental
   void setRangeText(String replacement, {int start, int end, String selectionMode}) native;
 
   @DomName('HTMLInputElement.setSelectionRange')
@@ -12015,6 +12351,8 @@
 
   @DomName('HTMLInputElement.onwebkitSpeechChange')
   @DocsEditable
+  // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#extending_html_elements
+  @Experimental
   Stream<Event> get onSpeechChange => speechChangeEvent.forTarget(this);
 
 }
@@ -12581,34 +12919,42 @@
 
 @DocsEditable
 @DomName('InputMethodContext')
+@Experimental // untriaged
 class InputMethodContext native "InputMethodContext" {
 
   @DomName('InputMethodContext.composition')
   @DocsEditable
+  @Experimental // untriaged
   final Composition composition;
 
   @DomName('InputMethodContext.enabled')
   @DocsEditable
+  @Experimental // untriaged
   bool enabled;
 
   @DomName('InputMethodContext.locale')
   @DocsEditable
+  @Experimental // untriaged
   final String locale;
 
   @DomName('InputMethodContext.confirmComposition')
   @DocsEditable
+  @Experimental // untriaged
   void confirmComposition() native;
 
   @DomName('InputMethodContext.open')
   @DocsEditable
+  @Experimental // untriaged
   bool open() native;
 
   @DomName('InputMethodContext.setCaretRectangle')
   @DocsEditable
+  @Experimental // untriaged
   void setCaretRectangle(Node anchor, int x, int y, int w, int h) native;
 
   @DomName('InputMethodContext.setExclusionRectangle')
   @DocsEditable
+  @Experimental // untriaged
   void setExclusionRectangle(Node anchor, int x, int y, int w, int h) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12661,6 +13007,7 @@
 
   @DomName('KeyboardEvent.altGraphKey')
   @DocsEditable
+  @Experimental // nonstandard
   final bool altGraphKey;
 
   @DomName('KeyboardEvent.altKey')
@@ -12674,10 +13021,12 @@
   @JSName('keyIdentifier')
   @DomName('KeyboardEvent.keyIdentifier')
   @DocsEditable
+  @Experimental // nonstandard
   final String $dom_keyIdentifier;
 
   @DomName('KeyboardEvent.keyLocation')
   @DocsEditable
+  @Experimental // nonstandard
   final int keyLocation;
 
   @DomName('KeyboardEvent.metaKey')
@@ -12699,6 +13048,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#the-keygen-element
 class KeygenElement extends Element native "HTMLKeygenElement" {
 
   @DomName('HTMLKeygenElement.HTMLKeygenElement')
@@ -12730,6 +13080,7 @@
 
   @DomName('HTMLKeygenElement.labels')
   @DocsEditable
+  @Unstable
   @Returns('NodeList')
   @Creates('NodeList')
   final List<Node> labels;
@@ -12777,6 +13128,8 @@
 
   @DomName('HTMLLIElement.type')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLLIElement-partial
+  @deprecated // deprecated
   String type;
 
   @DomName('HTMLLIElement.value')
@@ -12881,6 +13234,7 @@
 
   @DomName('Location.ancestorOrigins')
   @DocsEditable
+  @Experimental // nonstandard
   @Returns('DomStringList')
   @Creates('DomStringList')
   final List<String> ancestorOrigins;
@@ -12935,6 +13289,7 @@
 
   @DomName('Location.valueOf')
   @DocsEditable
+  @Experimental // nonstandard
   Object valueOf() native;
 
 
@@ -12953,6 +13308,8 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('MIDIErrorCallback')
+@Experimental // untriaged
 typedef void MidiErrorCallback(DomError 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
@@ -12982,6 +13339,8 @@
 
 @DocsEditable
 @DomName('MediaController')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#mediacontroller
+@Experimental
 class MediaController extends EventTarget native "MediaController" {
 
   @DomName('MediaController.MediaController')
@@ -13068,6 +13427,7 @@
 
 @DocsEditable
 @DomName('HTMLMediaElement')
+@Unstable
 class MediaElement extends Element native "HTMLMediaElement" {
 
   @DomName('HTMLMediaElement.canplayEvent')
@@ -13132,6 +13492,8 @@
 
   @DomName('HTMLMediaElement.showEvent')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
+  @Experimental
   static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');
 
   @DomName('HTMLMediaElement.stalledEvent')
@@ -13159,6 +13521,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyAddedEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyadded');
 
   @DomName('HTMLMediaElement.webkitkeyerrorEvent')
@@ -13166,6 +13529,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyErrorEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyerror');
 
   @DomName('HTMLMediaElement.webkitkeymessageEvent')
@@ -13173,6 +13537,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyMessageEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeymessage');
 
   @DomName('HTMLMediaElement.webkitneedkeyEvent')
@@ -13180,6 +13545,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> needKeyEvent = const EventStreamProvider<MediaKeyEvent>('webkitneedkey');
 
   @DomName('HTMLMediaElement.HAVE_CURRENT_DATA')
@@ -13264,6 +13630,8 @@
 
   @DomName('HTMLMediaElement.initialTime')
   @DocsEditable
+  // http://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-media-initialtime
+  @Experimental
   final num initialTime;
 
   @DomName('HTMLMediaElement.loop')
@@ -13316,10 +13684,13 @@
 
   @DomName('HTMLMediaElement.startTime')
   @DocsEditable
+  @Experimental // non-standard
   final num startTime;
 
   @DomName('HTMLMediaElement.textTracks')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-media-texttracks
+  @Experimental
   final TextTrackList textTracks;
 
   @DomName('HTMLMediaElement.volume')
@@ -13332,6 +13703,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // nonstandard
   final int audioDecodedByteCount;
 
   @JSName('webkitClosedCaptionsVisible')
@@ -13340,6 +13712,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // nonstandard
   bool closedCaptionsVisible;
 
   @JSName('webkitHasClosedCaptions')
@@ -13348,6 +13721,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // nonstandard
   final bool hasClosedCaptions;
 
   @JSName('webkitPreservesPitch')
@@ -13356,6 +13730,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // nonstandard
   bool preservesPitch;
 
   @JSName('webkitVideoDecodedByteCount')
@@ -13364,10 +13739,13 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // nonstandard
   final int videoDecodedByteCount;
 
   @DomName('HTMLMediaElement.addTextTrack')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-media-addtexttrack
+  @Experimental
   TextTrack addTextTrack(String kind, [String label, String language]) native;
 
   @DomName('HTMLMediaElement.canPlayType')
@@ -13392,6 +13770,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
   void addKey(String keySystem, Uint8List key, [Uint8List initData, String sessionId]) native;
 
   @JSName('webkitCancelKeyRequest')
@@ -13400,6 +13779,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
   void cancelKeyRequest(String keySystem, String sessionId) native;
 
   @JSName('webkitGenerateKeyRequest')
@@ -13408,6 +13788,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
   void generateKeyRequest(String keySystem, [Uint8List initData]) native;
 
   @DomName('HTMLMediaElement.oncanplay')
@@ -13472,6 +13853,8 @@
 
   @DomName('HTMLMediaElement.onshow')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
+  @Experimental
   Stream<Event> get onShow => showEvent.forTarget(this);
 
   @DomName('HTMLMediaElement.onstalled')
@@ -13496,18 +13879,26 @@
 
   @DomName('HTMLMediaElement.onwebkitkeyadded')
   @DocsEditable
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
+  @Experimental
   Stream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forTarget(this);
 
   @DomName('HTMLMediaElement.onwebkitkeyerror')
   @DocsEditable
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
+  @Experimental
   Stream<MediaKeyEvent> get onKeyError => keyErrorEvent.forTarget(this);
 
   @DomName('HTMLMediaElement.onwebkitkeymessage')
   @DocsEditable
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
+  @Experimental
   Stream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.forTarget(this);
 
   @DomName('HTMLMediaElement.onwebkitneedkey')
   @DocsEditable
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
+  @Experimental
   Stream<MediaKeyEvent> get onNeedKey => needKeyEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13517,6 +13908,7 @@
 
 @DocsEditable
 @DomName('MediaError')
+@Unstable
 class MediaError native "MediaError" {
 
   @DomName('MediaError.MEDIA_ERR_ABORTED')
@@ -13529,6 +13921,8 @@
 
   @DomName('MediaError.MEDIA_ERR_ENCRYPTED')
   @DocsEditable
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#error-codes
+  @Experimental
   static const int MEDIA_ERR_ENCRYPTED = 5;
 
   @DomName('MediaError.MEDIA_ERR_NETWORK')
@@ -13550,6 +13944,8 @@
 
 @DocsEditable
 @DomName('MediaKeyError')
+// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#error-codes
+@Experimental
 class MediaKeyError native "MediaKeyError" {
 
   @DomName('MediaKeyError.MEDIA_KEYERR_CLIENT')
@@ -13587,6 +13983,8 @@
 
 @DocsEditable
 @DomName('MediaKeyEvent')
+// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#event-definitions
+@Experimental
 class MediaKeyEvent extends Event native "MediaKeyEvent" {
 
   @JSName('defaultURL')
@@ -13625,6 +14023,7 @@
 
 @DocsEditable
 @DomName('MediaList')
+@Unstable
 class MediaList native "MediaList" {
 
   @DomName('MediaList.length')
@@ -13654,6 +14053,7 @@
 
 @DocsEditable
 @DomName('MediaQueryList')
+@Unstable
 class MediaQueryList native "MediaQueryList" {
 
   @DomName('MediaQueryList.matches')
@@ -13678,6 +14078,7 @@
 
 
 @DomName('MediaQueryListListener')
+@Unstable
 abstract class MediaQueryListListener {
 
   void queryChanged(MediaQueryList list);
@@ -13689,6 +14090,8 @@
 
 @DocsEditable
 @DomName('MediaSource')
+// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#mediasource
+@Experimental
 class MediaSource extends EventTarget native "MediaSource" {
 
   @DomName('MediaSource.MediaSource')
@@ -13752,6 +14155,7 @@
 @DomName('MediaStream')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastream
 class MediaStream extends EventTarget native "MediaStream" {
 
   @DomName('MediaStream.addtrackEvent')
@@ -13794,6 +14198,7 @@
 
   @DomName('MediaStream.label')
   @DocsEditable
+  @Experimental // non-standard
   final String label;
 
   @JSName('addEventListener')
@@ -13832,6 +14237,7 @@
 
   @DomName('MediaStream.stop')
   @DocsEditable
+  @Experimental // untriaged
   void stop() native;
 
   @DomName('MediaStream.onaddtrack')
@@ -13871,6 +14277,7 @@
 @DomName('MediaStreamEvent')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://dev.w3.org/2011/webrtc/editor/getusermedia.html
 class MediaStreamEvent extends Event native "MediaStreamEvent" {
 
   /// Checks if this type is supported on the current platform.
@@ -13889,6 +14296,7 @@
 @DomName('MediaStreamTrack')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastreamtrack
 class MediaStreamTrack extends EventTarget native "MediaStreamTrack" {
 
   @DomName('MediaStreamTrack.endedEvent')
@@ -13958,6 +14366,7 @@
 @DomName('MediaStreamTrackEvent')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://dev.w3.org/2011/webrtc/editor/getusermedia.html
 class MediaStreamTrackEvent extends Event native "MediaStreamTrackEvent" {
 
   /// Checks if this type is supported on the current platform.
@@ -13974,6 +14383,7 @@
 
 @DocsEditable
 @DomName('MemoryInfo')
+@Experimental // nonstandard
 class MemoryInfo native "MemoryInfo" {
 
   @DomName('MemoryInfo.jsHeapSizeLimit')
@@ -14018,6 +14428,7 @@
 
 @DocsEditable
 @DomName('MessageChannel')
+@Unstable
 class MessageChannel native "MessageChannel" {
 
   @DomName('MessageChannel.MessageChannel')
@@ -14067,6 +14478,7 @@
 
   @DomName('MessageEvent.lastEventId')
   @DocsEditable
+  @Unstable
   final String lastEventId;
 
   @DomName('MessageEvent.origin')
@@ -14075,6 +14487,7 @@
 
   @DomName('MessageEvent.ports')
   @DocsEditable
+  @Unstable
   @Creates('=List')
   final List ports;
 
@@ -14099,6 +14512,7 @@
 
 @DocsEditable
 @DomName('MessagePort')
+@Unstable
 class MessagePort extends EventTarget native "MessagePort" {
 
   @DomName('MessagePort.messageEvent')
@@ -14180,6 +14594,8 @@
 
 @DocsEditable
 @DomName('Metadata')
+// http://www.w3.org/TR/file-system-api/#the-metadata-interface
+@Experimental
 class Metadata native "Metadata" {
 
   DateTime get modificationTime => _convertNativeToDart_DateTime(this._get_modificationTime);
@@ -14199,6 +14615,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('MetadataCallback')
+// http://www.w3.org/TR/file-system-api/#idl-def-MetadataCallback
+@Experimental
 typedef void MetadataCallback(Metadata metadata);
 // 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
@@ -14210,6 +14629,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class MeterElement extends Element native "HTMLMeterElement" {
 
   @DomName('HTMLMeterElement.HTMLMeterElement')
@@ -14225,6 +14645,7 @@
 
   @DomName('HTMLMeterElement.labels')
   @DocsEditable
+  @Unstable
   @Returns('NodeList')
   @Creates('NodeList')
   final List<Node> labels;
@@ -14256,10 +14677,12 @@
 
 @DocsEditable
 @DomName('MIDIConnectionEvent')
+@Experimental // untriaged
 class MidiConnectionEvent extends Event native "MIDIConnectionEvent" {
 
   @DomName('MIDIConnectionEvent.port')
   @DocsEditable
+  @Experimental // untriaged
   final MidiPort port;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14269,6 +14692,7 @@
 
 @DocsEditable
 @DomName('MIDIInput')
+@Experimental // untriaged
 class MidiInput extends MidiPort implements EventTarget native "MIDIInput" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14278,14 +14702,17 @@
 
 @DocsEditable
 @DomName('MIDIMessageEvent')
+@Experimental // untriaged
 class MidiMessageEvent extends Event native "MIDIMessageEvent" {
 
   @DomName('MIDIMessageEvent.data')
   @DocsEditable
+  @Experimental // untriaged
   final Uint8List data;
 
   @DomName('MIDIMessageEvent.receivedTime')
   @DocsEditable
+  @Experimental // untriaged
   final num receivedTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14295,48 +14722,59 @@
 
 @DocsEditable
 @DomName('MIDIPort')
+@Experimental // untriaged
 class MidiPort extends EventTarget native "MIDIPort" {
 
   @DomName('MIDIPort.disconnectEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
 
   @DomName('MIDIPort.id')
   @DocsEditable
+  @Experimental // untriaged
   final String id;
 
   @DomName('MIDIPort.manufacturer')
   @DocsEditable
+  @Experimental // untriaged
   final String manufacturer;
 
   @DomName('MIDIPort.name')
   @DocsEditable
+  @Experimental // untriaged
   final String name;
 
   @DomName('MIDIPort.type')
   @DocsEditable
+  @Experimental // untriaged
   final String type;
 
   @DomName('MIDIPort.version')
   @DocsEditable
+  @Experimental // untriaged
   final String version;
 
   @JSName('addEventListener')
   @DomName('MIDIPort.addEventListener')
   @DocsEditable
+  @Experimental // untriaged
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   @DomName('MIDIPort.dispatchEvent')
   @DocsEditable
+  @Experimental // untriaged
   bool dispatchEvent(Event event) native;
 
   @JSName('removeEventListener')
   @DomName('MIDIPort.removeEventListener')
   @DocsEditable
+  @Experimental // untriaged
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   @DomName('MIDIPort.ondisconnect')
   @DocsEditable
+  @Experimental // untriaged
   Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14346,6 +14784,7 @@
 
 @DocsEditable
 @DomName('MimeType')
+@Experimental // non-standard
 class MimeType native "MimeType" {
 
   @DomName('MimeType.description')
@@ -14371,6 +14810,7 @@
 
 @DocsEditable
 @DomName('MimeTypeArray')
+@Experimental // non-standard
 class MimeTypeArray extends Interceptor with ListMixin<MimeType>, ImmutableListMixin<MimeType> implements JavaScriptIndexingBehavior, List<MimeType> native "MimeTypeArray" {
 
   @DomName('MimeTypeArray.length')
@@ -14436,6 +14876,7 @@
 
 @DocsEditable
 @DomName('HTMLModElement')
+@Unstable
 class ModElement extends Element native "HTMLModElement" {
 
   @DomName('HTMLModElement.cite')
@@ -14493,10 +14934,12 @@
 
   @DomName('MouseEvent.dataTransfer')
   @DocsEditable
+  @Unstable
   final DataTransfer dataTransfer;
 
   @DomName('MouseEvent.fromElement')
   @DocsEditable
+  @Experimental // nonstandard
   final Node fromElement;
 
   @DomName('MouseEvent.metaKey')
@@ -14527,6 +14970,7 @@
 
   @DomName('MouseEvent.toElement')
   @DocsEditable
+  @Experimental // nonstandard
   final Node toElement;
 
   @JSName('webkitMovementX')
@@ -14620,6 +15064,7 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('MutationCallback')
 typedef void MutationCallback(List<MutationRecord> mutations, MutationObserver observer);
 // 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
@@ -14627,6 +15072,8 @@
 
 
 @DomName('MutationEvent')
+// http://www.w3.org/TR/DOM-Level-3-Events/#events-mutationevents
+@deprecated
 class MutationEvent extends Event native "MutationEvent" {
   factory MutationEvent(String type,
       {bool canBubble: false, bool cancelable: false, Node relatedNode,
@@ -14837,6 +15284,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/css3-regions/#dom-named-flow-collection
 class NamedFlow extends EventTarget native "WebKitNamedFlow" {
 
   @DomName('WebKitNamedFlow.firstEmptyRegionIndex')
@@ -14893,6 +15341,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://dev.w3.org/csswg/css-regions/#dom-named-flow-collection
 class NamedFlowCollection native "WebKitNamedFlowCollection" {
 
   @DomName('WebKitNamedFlowCollection.length')
@@ -14989,6 +15438,7 @@
 
   @DomName('Navigator.appCodeName')
   @DocsEditable
+  @Experimental // non-standard
   final String appCodeName;
 
   @DomName('Navigator.appName')
@@ -15001,22 +15451,28 @@
 
   @DomName('Navigator.cookieEnabled')
   @DocsEditable
+  @Unstable
   final bool cookieEnabled;
 
   @DomName('Navigator.doNotTrack')
   @DocsEditable
+  // http://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html#js-dom
+  @Experimental // experimental
   final String doNotTrack;
 
   @DomName('Navigator.geolocation')
   @DocsEditable
+  @Unstable
   final Geolocation geolocation;
 
   @DomName('Navigator.mimeTypes')
   @DocsEditable
+  @Experimental // nonstandard
   final MimeTypeArray mimeTypes;
 
   @DomName('Navigator.onLine')
   @DocsEditable
+  @Unstable
   final bool onLine;
 
   @DomName('Navigator.platform')
@@ -15025,14 +15481,17 @@
 
   @DomName('Navigator.plugins')
   @DocsEditable
+  @deprecated // nonstandard
   final PluginArray plugins;
 
   @DomName('Navigator.product')
   @DocsEditable
+  @Unstable
   final String product;
 
   @DomName('Navigator.productSub')
   @DocsEditable
+  @Unstable
   final String productSub;
 
   @DomName('Navigator.userAgent')
@@ -15041,10 +15500,12 @@
 
   @DomName('Navigator.vendor')
   @DocsEditable
+  @Unstable
   final String vendor;
 
   @DomName('Navigator.vendorSub')
   @DocsEditable
+  @Unstable
   final String vendorSub;
 
   @JSName('webkitPersistentStorage')
@@ -15053,6 +15514,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.w3.org/TR/quota-api/#accessing-storagequota
   final StorageQuota persistentStorage;
 
   @JSName('webkitTemporaryStorage')
@@ -15061,18 +15523,23 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.w3.org/TR/quota-api/#accessing-storagequota
   final StorageQuota temporaryStorage;
 
   @DomName('Navigator.getStorageUpdates')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils
+  @Experimental
   void getStorageUpdates() native;
 
   @DomName('Navigator.javaEnabled')
   @DocsEditable
+  @deprecated // nonstandard
   bool javaEnabled() native;
 
   @DomName('Navigator.registerProtocolHandler')
   @DocsEditable
+  @Unstable
   void registerProtocolHandler(String scheme, String url, String title) native;
 
   @JSName('webkitGetGamepads')
@@ -15081,6 +15548,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#widl-Navigator-getGamepads-Gamepad
   @Returns('_GamepadList')
   @Creates('_GamepadList')
   List<Gamepad> getGamepads() native;
@@ -15093,14 +15561,18 @@
 
 @DocsEditable
 @DomName('NavigatorUserMediaError')
+// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-NavigatorUserMediaError
+@Experimental
 class NavigatorUserMediaError native "NavigatorUserMediaError" {
 
   @DomName('NavigatorUserMediaError.PERMISSION_DENIED')
   @DocsEditable
+  @Experimental // nonstandard
   static const int PERMISSION_DENIED = 1;
 
   @DomName('NavigatorUserMediaError.code')
   @DocsEditable
+  @Experimental // nonstandard
   final int code;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15110,6 +15582,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('NavigatorUserMediaErrorCallback')
+// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-NavigatorUserMediaErrorCallback
+@Experimental
 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
@@ -15118,6 +15593,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('NavigatorUserMediaSuccessCallback')
+// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-NavigatorUserMediaSuccessCallback
+@Experimental
 typedef void _NavigatorUserMediaSuccessCallback(MediaStream 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
@@ -15449,11 +15927,15 @@
 
   @DomName('Node.localName')
   @DocsEditable
+  // http://dom.spec.whatwg.org/#dom-node-localname
+  @deprecated // deprecated
   final String localName;
 
   @JSName('namespaceURI')
   @DomName('Node.namespaceURI')
   @DocsEditable
+  // http://dom.spec.whatwg.org/#dom-node-namespaceuri
+  @deprecated // deprecated
   final String $dom_namespaceUri;
 
   @JSName('nextSibling')
@@ -15556,6 +16038,7 @@
 
 @DocsEditable
 @DomName('NodeFilter')
+@Unstable
 class NodeFilter native "NodeFilter" {
 
   @DomName('NodeFilter.FILTER_ACCEPT')
@@ -15576,10 +16059,12 @@
 
   @DomName('NodeFilter.SHOW_ATTRIBUTE')
   @DocsEditable
+  @deprecated // deprecated
   static const int SHOW_ATTRIBUTE = 0x00000002;
 
   @DomName('NodeFilter.SHOW_CDATA_SECTION')
   @DocsEditable
+  @deprecated // deprecated
   static const int SHOW_CDATA_SECTION = 0x00000008;
 
   @DomName('NodeFilter.SHOW_COMMENT')
@@ -15604,14 +16089,17 @@
 
   @DomName('NodeFilter.SHOW_ENTITY')
   @DocsEditable
+  @deprecated // deprecated
   static const int SHOW_ENTITY = 0x00000020;
 
   @DomName('NodeFilter.SHOW_ENTITY_REFERENCE')
   @DocsEditable
+  @deprecated // deprecated
   static const int SHOW_ENTITY_REFERENCE = 0x00000010;
 
   @DomName('NodeFilter.SHOW_NOTATION')
   @DocsEditable
+  @deprecated // deprecated
   static const int SHOW_NOTATION = 0x00000800;
 
   @DomName('NodeFilter.SHOW_PROCESSING_INSTRUCTION')
@@ -15628,6 +16116,7 @@
 
 
 @DomName('NodeIterator')
+@Unstable
 class NodeIterator native "NodeIterator" {
   factory NodeIterator(Node root, int whatToShow) {
     return document.$dom_createNodeIterator(root, whatToShow, null, false);
@@ -15731,6 +16220,8 @@
 
 @DocsEditable
 @DomName('Notation')
+// http://dom.spec.whatwg.org/#notation
+@deprecated // deprecated
 class Notation extends Node native "Notation" {
 
   @DomName('Notation.publicId')
@@ -15747,6 +16238,8 @@
 
 
 @DomName('Notification')
+// http://www.w3.org/TR/notifications/#notification
+@Experimental // experimental
 class Notification extends EventTarget native "Notification" {
 
   factory Notification(String title, {String titleDir: null, String body: null, 
@@ -15772,6 +16265,7 @@
 
   @DomName('Notification.displayEvent')
   @DocsEditable
+  @Experimental // nonstandard
   static const EventStreamProvider<Event> displayEvent = const EventStreamProvider<Event>('display');
 
   @DomName('Notification.errorEvent')
@@ -15795,6 +16289,7 @@
 
   @DomName('Notification.dir')
   @DocsEditable
+  @Experimental // nonstandard
   String dir;
 
   @DomName('Notification.permission')
@@ -15803,10 +16298,12 @@
 
   @DomName('Notification.replaceId')
   @DocsEditable
+  @Experimental // nonstandard
   String replaceId;
 
   @DomName('Notification.tag')
   @DocsEditable
+  @Experimental // nonstandard
   String tag;
 
   @JSName('addEventListener')
@@ -15816,6 +16313,7 @@
 
   @DomName('Notification.cancel')
   @DocsEditable
+  @Experimental // nonstandard
   void cancel() native;
 
   @DomName('Notification.close')
@@ -15848,6 +16346,7 @@
 
   @DomName('Notification.show')
   @DocsEditable
+  @Experimental // nonstandard
   void show() native;
 
   @DomName('Notification.onclick')
@@ -15860,6 +16359,7 @@
 
   @DomName('Notification.ondisplay')
   @DocsEditable
+  @Experimental // nonstandard
   Stream<Event> get onDisplay => displayEvent.forTarget(this);
 
   @DomName('Notification.onerror')
@@ -15881,6 +16381,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/notifications/#showing-a-notification
+@deprecated // deprecated
 class NotificationCenter native "NotificationCenter" {
 
   /// Checks if this type is supported on the current platform.
@@ -15921,6 +16423,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('NotificationPermissionCallback')
+// http://www.w3.org/TR/notifications/#notificationpermissioncallback
+@Experimental
 typedef void _NotificationPermissionCallback(String permission);
 // 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
@@ -15957,6 +16462,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class ObjectElement extends Element native "HTMLObjectElement" {
 
   @DomName('HTMLObjectElement.HTMLObjectElement')
@@ -15968,6 +16474,8 @@
 
   @DomName('HTMLObjectElement.code')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLObjectElement-partial
+  @deprecated // deprecated
   String code;
 
   @DomName('HTMLObjectElement.data')
@@ -16132,6 +16640,7 @@
 
   @DomName('HTMLOutputElement.labels')
   @DocsEditable
+  @Unstable
   @Returns('NodeList')
   @Creates('NodeList')
   final List<Node> labels;
@@ -16175,6 +16684,7 @@
 
 @DocsEditable
 @DomName('OverflowEvent')
+@Experimental // nonstandard
 class OverflowEvent extends Event native "OverflowEvent" {
 
   @DomName('OverflowEvent.BOTH')
@@ -16208,6 +16718,8 @@
 
 @DocsEditable
 @DomName('PageTransitionEvent')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#pagetransitionevent
+@Experimental
 class PageTransitionEvent extends Event native "PageTransitionEvent" {
 
   @DomName('PageTransitionEvent.persisted')
@@ -16234,6 +16746,7 @@
 
 @DocsEditable
 @DomName('HTMLParamElement')
+@Unstable
 class ParamElement extends Element native "HTMLParamElement" {
 
   @DomName('HTMLParamElement.HTMLParamElement')
@@ -16255,6 +16768,8 @@
 
 @DocsEditable
 @DomName('Path')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects
+@Experimental
 class Path native "Path" {
 
   @DomName('Path.DOMPath')
@@ -16324,6 +16839,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
   static const EventStreamProvider<Event> resourceTimingBufferFullEvent = const EventStreamProvider<Event>('webkitresourcetimingbufferfull');
 
   /// Checks if this type is supported on the current platform.
@@ -16331,6 +16847,7 @@
 
   @DomName('Performance.memory')
   @DocsEditable
+  @Experimental // nonstandard
   final MemoryInfo memory;
 
   @DomName('Performance.navigation')
@@ -16343,30 +16860,37 @@
 
   @DomName('Performance.clearMarks')
   @DocsEditable
+  @Experimental // untriaged
   void clearMarks(String markName) native;
 
   @DomName('Performance.clearMeasures')
   @DocsEditable
+  @Experimental // untriaged
   void clearMeasures(String measureName) native;
 
   @DomName('Performance.getEntries')
   @DocsEditable
+  @Experimental // untriaged
   List<PerformanceEntry> getEntries() native;
 
   @DomName('Performance.getEntriesByName')
   @DocsEditable
+  @Experimental // untriaged
   List<PerformanceEntry> getEntriesByName(String name, String entryType) native;
 
   @DomName('Performance.getEntriesByType')
   @DocsEditable
+  @Experimental // untriaged
   List<PerformanceEntry> getEntriesByType(String entryType) native;
 
   @DomName('Performance.mark')
   @DocsEditable
+  @Experimental // untriaged
   void mark(String markName) native;
 
   @DomName('Performance.measure')
   @DocsEditable
+  @Experimental // untriaged
   void measure(String measureName, String startMark, String endMark) native;
 
   @DomName('Performance.now')
@@ -16379,6 +16903,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
   void clearResourceTimings() native;
 
   @JSName('webkitSetResourceTimingBufferSize')
@@ -16387,10 +16912,13 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
   void setResourceTimingBufferSize(int maxSize) native;
 
   @DomName('Performance.onwebkitresourcetimingbufferfull')
   @DocsEditable
+  // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
+  @Experimental
   Stream<Event> get onResourceTimingBufferFull => resourceTimingBufferFullEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16400,6 +16928,8 @@
 
 @DocsEditable
 @DomName('PerformanceEntry')
+// http://www.w3.org/TR/performance-timeline/#sec-PerformanceEntry-interface
+@Experimental
 class PerformanceEntry native "PerformanceEntry" {
 
   @DomName('PerformanceEntry.duration')
@@ -16425,6 +16955,8 @@
 
 @DocsEditable
 @DomName('PerformanceMark')
+// http://www.w3.org/TR/user-timing/#performancemark
+@Experimental
 class PerformanceMark extends PerformanceEntry native "PerformanceMark" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16434,6 +16966,8 @@
 
 @DocsEditable
 @DomName('PerformanceMeasure')
+// http://www.w3.org/TR/user-timing/#performancemeasure
+@Experimental
 class PerformanceMeasure extends PerformanceEntry native "PerformanceMeasure" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16443,6 +16977,7 @@
 
 @DocsEditable
 @DomName('PerformanceNavigation')
+@Unstable
 class PerformanceNavigation native "PerformanceNavigation" {
 
   @DomName('PerformanceNavigation.TYPE_BACK_FORWARD')
@@ -16476,6 +17011,8 @@
 
 @DocsEditable
 @DomName('PerformanceResourceTiming')
+// http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming
+@Experimental
 class PerformanceResourceTiming extends PerformanceEntry native "PerformanceResourceTiming" {
 
   @DomName('PerformanceResourceTiming.connectEnd')
@@ -16512,14 +17049,17 @@
 
   @DomName('PerformanceResourceTiming.requestStart')
   @DocsEditable
+  @Experimental // nonstandard
   final num requestStart;
 
   @DomName('PerformanceResourceTiming.responseEnd')
   @DocsEditable
+  @Experimental // nonstandard
   final num responseEnd;
 
   @DomName('PerformanceResourceTiming.responseStart')
   @DocsEditable
+  @Experimental // nonstandard
   final num responseStart;
 
   @DomName('PerformanceResourceTiming.secureConnectionStart')
@@ -16533,6 +17073,7 @@
 
 @DocsEditable
 @DomName('PerformanceTiming')
+@Unstable
 class PerformanceTiming native "PerformanceTiming" {
 
   @DomName('PerformanceTiming.connectEnd')
@@ -16626,6 +17167,7 @@
 
 @DocsEditable
 @DomName('Plugin')
+@Experimental // non-standard
 class Plugin native "Plugin" {
 
   @DomName('Plugin.description')
@@ -16659,6 +17201,7 @@
 
 @DocsEditable
 @DomName('PluginArray')
+@Experimental // non-standard
 class PluginArray extends Interceptor with ListMixin<Plugin>, ImmutableListMixin<Plugin> implements JavaScriptIndexingBehavior, List<Plugin> native "PluginArray" {
 
   @DomName('PluginArray.length')
@@ -16749,6 +17292,8 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('PositionCallback')
+@Unstable
 typedef void _PositionCallback(Geoposition position);
 // 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
@@ -16757,6 +17302,7 @@
 
 @DocsEditable
 @DomName('PositionError')
+@Unstable
 class PositionError native "PositionError" {
 
   @DomName('PositionError.PERMISSION_DENIED')
@@ -16786,6 +17332,8 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('PositionErrorCallback')
+@Unstable
 typedef void _PositionErrorCallback(PositionError 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
@@ -16802,6 +17350,7 @@
 
   @DomName('HTMLPreElement.wrap')
   @DocsEditable
+  @deprecated // deprecated
   bool wrap;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16811,14 +17360,17 @@
 
 @DocsEditable
 @DomName('ProcessingInstruction')
+@Unstable
 class ProcessingInstruction extends Node native "ProcessingInstruction" {
 
   @DomName('ProcessingInstruction.data')
   @DocsEditable
+  @Experimental // non-standard
   String data;
 
   @DomName('ProcessingInstruction.sheet')
   @DocsEditable
+  @Experimental // non-standard
   final StyleSheet sheet;
 
   @DomName('ProcessingInstruction.target')
@@ -16847,6 +17399,7 @@
 
   @DomName('HTMLProgressElement.labels')
   @DocsEditable
+  @Unstable
   @Returns('NodeList')
   @Creates('NodeList')
   final List<Node> labels;
@@ -16904,6 +17457,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('RTCErrorCallback')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#rtcerror
+@Experimental
 typedef void _RtcErrorCallback(String errorInformation);
 // 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
@@ -16912,6 +17468,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('RTCSessionDescriptionCallback')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCSessionDescription
+@Experimental
 typedef void _RtcSessionDescriptionCallback(RtcSessionDescription sdp);
 // 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
@@ -16920,6 +17479,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('RTCStatsCallback')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCStatsCallback
+@Experimental
 typedef void RtcStatsCallback(RtcStatsResponse response);
 // 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
@@ -16929,6 +17491,7 @@
 
 
 @DomName('Range')
+@Unstable
 class Range native "Range" {
   factory Range() => document.$dom_createRange();
 
@@ -16943,18 +17506,22 @@
 
   @DomName('Range.NODE_AFTER')
   @DocsEditable
+  @Experimental // nonstandard
   static const int NODE_AFTER = 1;
 
   @DomName('Range.NODE_BEFORE')
   @DocsEditable
+  @Experimental // nonstandard
   static const int NODE_BEFORE = 0;
 
   @DomName('Range.NODE_BEFORE_AND_AFTER')
   @DocsEditable
+  @Experimental // nonstandard
   static const int NODE_BEFORE_AND_AFTER = 2;
 
   @DomName('Range.NODE_INSIDE')
   @DocsEditable
+  @Experimental // nonstandard
   static const int NODE_INSIDE = 3;
 
   @DomName('Range.START_TO_END')
@@ -17003,6 +17570,7 @@
 
   @DomName('Range.compareNode')
   @DocsEditable
+  @deprecated // deprecated
   int compareNode(Node refNode) native;
 
   @DomName('Range.comparePoint')
@@ -17023,6 +17591,7 @@
 
   @DomName('Range.expand')
   @DocsEditable
+  @Experimental // non-standard
   void expand(String unit) native;
 
   @DomName('Range.extractContents')
@@ -17045,6 +17614,7 @@
 
   @DomName('Range.intersectsNode')
   @DocsEditable
+  @deprecated // deprecated
   bool intersectsNode(Node refNode) native;
 
   @DomName('Range.isPointInRange')
@@ -17109,6 +17679,7 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('RequestAnimationFrameCallback')
 typedef void RequestAnimationFrameCallback(num highResTime);
 // 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
@@ -17117,6 +17688,8 @@
 
 @DocsEditable
 @DomName('RTCDataChannel')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDataChannel
+@Experimental
 class RtcDataChannel extends EventTarget native "RTCDataChannel" {
 
   @DomName('RTCDataChannel.closeEvent')
@@ -17200,6 +17773,8 @@
 
 @DocsEditable
 @DomName('RTCDataChannelEvent')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#rtcdatachannelevent
+@Experimental
 class RtcDataChannelEvent extends Event native "RTCDataChannelEvent" {
 
   @DomName('RTCDataChannelEvent.channel')
@@ -17213,6 +17788,8 @@
 
 @DocsEditable
 @DomName('RTCDTMFSender')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDTMFSender
+@Experimental
 class RtcDtmfSender extends EventTarget native "RTCDTMFSender" {
 
   @DomName('RTCDTMFSender.tonechangeEvent')
@@ -17270,6 +17847,8 @@
 
 @DocsEditable
 @DomName('RTCDTMFToneChangeEvent')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDTMFToneChangeEvent
+@Experimental
 class RtcDtmfToneChangeEvent extends Event native "RTCDTMFToneChangeEvent" {
 
   @DomName('RTCDTMFToneChangeEvent.tone')
@@ -17284,6 +17863,7 @@
 @DomName('RTCIceCandidate')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCIceCandidate
 class RtcIceCandidate native "RTCIceCandidate" {
   factory RtcIceCandidate(Map dictionary) {
     return JS('RtcIceCandidate', 'new RTCIceCandidate(#)',
@@ -17310,6 +17890,8 @@
 
 @DocsEditable
 @DomName('RTCIceCandidateEvent')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#rtcicecandidate-type
+@Experimental
 class RtcIceCandidateEvent extends Event native "RTCIceCandidateEvent" {
 
   @DomName('RTCIceCandidateEvent.candidate')
@@ -17324,6 +17906,7 @@
 @DomName('RTCPeerConnection')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCPeerConnection
 class RtcPeerConnection extends EventTarget native "RTCPeerConnection" {
   factory RtcPeerConnection(Map rtcIceServers, [Map mediaConstraints]) {
     var constructorName = JS('RtcPeerConnection', 'window[#]',
@@ -17643,6 +18226,7 @@
 @DomName('RTCSessionDescription')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCSessionDescription
 class RtcSessionDescription native "RTCSessionDescription" {
   factory RtcSessionDescription(Map dictionary) {
     return JS('RtcSessionDescription', 'new RTCSessionDescription(#)',
@@ -17665,6 +18249,8 @@
 
 @DocsEditable
 @DomName('RTCStatsReport')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCStatsReport
+@Experimental
 class RtcStatsReport native "RTCStatsReport" {
 
   @DomName('RTCStatsReport.id')
@@ -17704,6 +18290,8 @@
 
 @DocsEditable
 @DomName('RTCStatsResponse')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#widl-RTCStatsReport-RTCStats-getter-DOMString-id
+@Experimental
 class RtcStatsResponse native "RTCStatsResponse" {
 
   @DomName('RTCStatsResponse.namedItem')
@@ -17738,11 +18326,13 @@
   @JSName('availLeft')
   @DomName('Screen.availLeft')
   @DocsEditable
+  @Experimental // nonstandard
   final int $dom_availLeft;
 
   @JSName('availTop')
   @DomName('Screen.availTop')
   @DocsEditable
+  @Experimental // nonstandard
   final int $dom_availTop;
 
   @JSName('availWidth')
@@ -17789,6 +18379,8 @@
 
   @DomName('HTMLScriptElement.crossOrigin')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#attr-script-crossorigin
+  @Experimental
   String crossOrigin;
 
   @DomName('HTMLScriptElement.defer')
@@ -17797,14 +18389,20 @@
 
   @DomName('HTMLScriptElement.event')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLScriptElement-partial
+  @deprecated // deprecated
   String event;
 
   @DomName('HTMLScriptElement.htmlFor')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLScriptElement-partial
+  @deprecated // deprecated
   String htmlFor;
 
   @DomName('HTMLScriptElement.nonce')
   @DocsEditable
+  // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#interaction-with-the-script-src-directive
+  @Experimental
   String nonce;
 
   @DomName('HTMLScriptElement.src')
@@ -17822,6 +18420,7 @@
 
 @DocsEditable
 @DomName('ScriptProfile')
+@deprecated // nonstandard
 class ScriptProfile native "ScriptProfile" {
 
   @DomName('ScriptProfile.head')
@@ -17847,6 +18446,7 @@
 
 @DocsEditable
 @DomName('ScriptProfileNode')
+@deprecated // nonstandard
 class ScriptProfileNode native "ScriptProfileNode" {
 
   @JSName('callUID')
@@ -17893,6 +18493,8 @@
 
 @DocsEditable
 @DomName('SecurityPolicy')
+// https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#securitypolicy
+@Experimental
 class SecurityPolicy native "SecurityPolicy" {
 
   @DomName('SecurityPolicy.allowsEval')
@@ -17964,6 +18566,8 @@
 
 @DocsEditable
 @DomName('SecurityPolicyViolationEvent')
+// https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#securitypolicyviolationevent-events
+@Experimental
 class SecurityPolicyViolationEvent extends Event native "SecurityPolicyViolationEvent" {
 
   @JSName('blockedURI')
@@ -17973,6 +18577,7 @@
 
   @DomName('SecurityPolicyViolationEvent.columnNumber')
   @DocsEditable
+  @Experimental // untriaged
   final int columnNumber;
 
   @JSName('documentURI')
@@ -18030,6 +18635,7 @@
 
   @DomName('HTMLSelectElement.labels')
   @DocsEditable
+  @Unstable
   @Returns('NodeList')
   @Creates('NodeList')
   final List<Node> labels;
@@ -18131,18 +18737,22 @@
 
   @DomName('Selection.baseNode')
   @DocsEditable
+  @Experimental // non-standard
   final Node baseNode;
 
   @DomName('Selection.baseOffset')
   @DocsEditable
+  @Experimental // non-standard
   final int baseOffset;
 
   @DomName('Selection.extentNode')
   @DocsEditable
+  @Experimental // non-standard
   final Node extentNode;
 
   @DomName('Selection.extentOffset')
   @DocsEditable
+  @Experimental // non-standard
   final int extentOffset;
 
   @DomName('Selection.focusNode')
@@ -18163,6 +18773,7 @@
 
   @DomName('Selection.type')
   @DocsEditable
+  @Experimental // non-standard
   final String type;
 
   @DomName('Selection.addRange')
@@ -18183,6 +18794,7 @@
 
   @DomName('Selection.containsNode')
   @DocsEditable
+  @Experimental // non-standard
   bool containsNode(Node node, bool allowPartial) native;
 
   @DomName('Selection.deleteFromDocument')
@@ -18191,6 +18803,7 @@
 
   @DomName('Selection.empty')
   @DocsEditable
+  @Experimental // non-standard
   void empty() native;
 
   @DomName('Selection.extend')
@@ -18203,6 +18816,7 @@
 
   @DomName('Selection.modify')
   @DocsEditable
+  @Experimental // non-standard
   void modify(String alter, String direction, String granularity) native;
 
   @DomName('Selection.removeAllRanges')
@@ -18215,10 +18829,12 @@
 
   @DomName('Selection.setBaseAndExtent')
   @DocsEditable
+  @Experimental // non-standard
   void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) native;
 
   @DomName('Selection.setPosition')
   @DocsEditable
+  @Experimental // non-standard
   void setPosition(Node node, int offset) native;
 
   @DomName('Selection.toString')
@@ -18234,6 +18850,7 @@
 @DomName('HTMLShadowElement')
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
 @Experimental
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-element
 class ShadowElement extends Element native "HTMLShadowElement" {
 
   /// Checks if this type is supported on the current platform.
@@ -18257,6 +18874,7 @@
 @DomName('ShadowRoot')
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
 @Experimental
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-root
 class ShadowRoot extends DocumentFragment native "ShadowRoot" {
 
   @DomName('ShadowRoot.activeElement')
@@ -18315,6 +18933,8 @@
 
 @DocsEditable
 @DomName('SourceBuffer')
+// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebuffer
+@Experimental
 class SourceBuffer native "SourceBuffer" {
 
   @DomName('SourceBuffer.buffered')
@@ -18331,6 +18951,7 @@
 
   @DomName('SourceBuffer.append')
   @DocsEditable
+  @Experimental // non-standard
   void append(Uint8List data) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18340,6 +18961,8 @@
 
 @DocsEditable
 @DomName('SourceBufferList')
+// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebufferlist
+@Experimental
 class SourceBufferList extends EventTarget with ListMixin<SourceBuffer>, ImmutableListMixin<SourceBuffer> implements JavaScriptIndexingBehavior, List<SourceBuffer> native "SourceBufferList" {
 
   @DomName('SourceBufferList.length')
@@ -18453,6 +19076,8 @@
 
 @DocsEditable
 @DomName('SpeechGrammar')
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#dfn-speechgrammar
+@Experimental
 class SpeechGrammar native "SpeechGrammar" {
 
   @DomName('SpeechGrammar.SpeechGrammar')
@@ -18477,6 +19102,8 @@
 
 @DocsEditable
 @DomName('SpeechGrammarList')
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#dfn-speechgrammarlist
+@Experimental
 class SpeechGrammarList extends Interceptor with ListMixin<SpeechGrammar>, ImmutableListMixin<SpeechGrammar> implements JavaScriptIndexingBehavior, List<SpeechGrammar> native "SpeechGrammarList" {
 
   @DomName('SpeechGrammarList.SpeechGrammarList')
@@ -18553,6 +19180,8 @@
 
 @DocsEditable
 @DomName('SpeechInputEvent')
+// http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#speech_input_event_interface
+@Experimental
 class SpeechInputEvent extends Event native "SpeechInputEvent" {
 
   @DomName('SpeechInputEvent.results')
@@ -18568,6 +19197,8 @@
 
 @DocsEditable
 @DomName('SpeechInputResult')
+// http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#speech_input_result_interface
+@Experimental
 class SpeechInputResult native "SpeechInputResult" {
 
   @DomName('SpeechInputResult.confidence')
@@ -18586,6 +19217,7 @@
 @DomName('SpeechRecognition')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechreco-section
 class SpeechRecognition extends EventTarget native "SpeechRecognition" {
 
   @DomName('SpeechRecognition.audioendEvent')
@@ -18739,6 +19371,7 @@
 @DomName('SpeechRecognitionAlternative')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechrecognitionalternative
 class SpeechRecognitionAlternative native "SpeechRecognitionAlternative" {
 
   @DomName('SpeechRecognitionAlternative.confidence')
@@ -18758,6 +19391,7 @@
 @DomName('SpeechRecognitionError')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechreco-error
 class SpeechRecognitionError extends Event native "SpeechRecognitionError" {
 
   @DomName('SpeechRecognitionError.error')
@@ -18777,6 +19411,7 @@
 @DomName('SpeechRecognitionEvent')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechreco-event
 class SpeechRecognitionEvent extends Event native "SpeechRecognitionEvent" {
 
   @DomName('SpeechRecognitionEvent.emma')
@@ -18806,6 +19441,7 @@
 @DomName('SpeechRecognitionResult')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechrecognitionresult
 class SpeechRecognitionResult native "SpeechRecognitionResult" {
 
   @DomName('SpeechRecognitionResult.isFinal')
@@ -18827,38 +19463,47 @@
 
 @DocsEditable
 @DomName('SpeechSynthesis')
+@Experimental // untriaged
 class SpeechSynthesis native "SpeechSynthesis" {
 
   @DomName('SpeechSynthesis.paused')
   @DocsEditable
+  @Experimental // untriaged
   final bool paused;
 
   @DomName('SpeechSynthesis.pending')
   @DocsEditable
+  @Experimental // untriaged
   final bool pending;
 
   @DomName('SpeechSynthesis.speaking')
   @DocsEditable
+  @Experimental // untriaged
   final bool speaking;
 
   @DomName('SpeechSynthesis.cancel')
   @DocsEditable
+  @Experimental // untriaged
   void cancel() native;
 
   @DomName('SpeechSynthesis.getVoices')
   @DocsEditable
+  @Experimental // untriaged
   List<SpeechSynthesisVoice> getVoices() native;
 
   @DomName('SpeechSynthesis.pause')
   @DocsEditable
+  @Experimental // untriaged
   void pause() native;
 
   @DomName('SpeechSynthesis.resume')
   @DocsEditable
+  @Experimental // untriaged
   void resume() native;
 
   @DomName('SpeechSynthesis.speak')
   @DocsEditable
+  @Experimental // untriaged
   void speak(SpeechSynthesisUtterance utterance) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18868,18 +19513,22 @@
 
 @DocsEditable
 @DomName('SpeechSynthesisEvent')
+@Experimental // untriaged
 class SpeechSynthesisEvent extends Event native "SpeechSynthesisEvent" {
 
   @DomName('SpeechSynthesisEvent.charIndex')
   @DocsEditable
+  @Experimental // untriaged
   final int charIndex;
 
   @DomName('SpeechSynthesisEvent.elapsedTime')
   @DocsEditable
+  @Experimental // untriaged
   final num elapsedTime;
 
   @DomName('SpeechSynthesisEvent.name')
   @DocsEditable
+  @Experimental // untriaged
   final String name;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18889,34 +19538,42 @@
 
 @DocsEditable
 @DomName('SpeechSynthesisUtterance')
+@Experimental // untriaged
 class SpeechSynthesisUtterance extends EventTarget native "SpeechSynthesisUtterance" {
 
   @DomName('SpeechSynthesisUtterance.boundaryEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> boundaryEvent = const EventStreamProvider<SpeechSynthesisEvent>('boundary');
 
   @DomName('SpeechSynthesisUtterance.endEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> endEvent = const EventStreamProvider<SpeechSynthesisEvent>('end');
 
   @DomName('SpeechSynthesisUtterance.errorEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
   @DomName('SpeechSynthesisUtterance.markEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> markEvent = const EventStreamProvider<SpeechSynthesisEvent>('mark');
 
   @DomName('SpeechSynthesisUtterance.pauseEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
 
   @DomName('SpeechSynthesisUtterance.resumeEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> resumeEvent = const EventStreamProvider<SpeechSynthesisEvent>('resume');
 
   @DomName('SpeechSynthesisUtterance.startEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> startEvent = const EventStreamProvider<SpeechSynthesisEvent>('start');
 
   @DomName('SpeechSynthesisUtterance.SpeechSynthesisUtterance')
@@ -18932,54 +19589,67 @@
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable
+  @Experimental // untriaged
   String lang;
 
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable
+  @Experimental // untriaged
   num pitch;
 
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable
+  @Experimental // untriaged
   num rate;
 
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable
+  @Experimental // untriaged
   String text;
 
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable
+  @Experimental // untriaged
   SpeechSynthesisVoice voice;
 
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable
+  @Experimental // untriaged
   num volume;
 
   @DomName('SpeechSynthesisUtterance.onboundary')
   @DocsEditable
+  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onBoundary => boundaryEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onend')
   @DocsEditable
+  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onEnd => endEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onerror')
   @DocsEditable
+  @Experimental // untriaged
   Stream<Event> get onError => errorEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onmark')
   @DocsEditable
+  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onMark => markEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onpause')
   @DocsEditable
+  @Experimental // untriaged
   Stream<Event> get onPause => pauseEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onresume')
   @DocsEditable
+  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onResume => resumeEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onstart')
   @DocsEditable
+  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onStart => startEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18989,28 +19659,34 @@
 
 @DocsEditable
 @DomName('SpeechSynthesisVoice')
+@Experimental // untriaged
 class SpeechSynthesisVoice native "SpeechSynthesisVoice" {
 
   @JSName('default')
   @DomName('SpeechSynthesisVoice.default')
   @DocsEditable
+  @Experimental // untriaged
   final bool defaultValue;
 
   @DomName('SpeechSynthesisVoice.lang')
   @DocsEditable
+  @Experimental // untriaged
   final String lang;
 
   @DomName('SpeechSynthesisVoice.localService')
   @DocsEditable
+  @Experimental // untriaged
   final bool localService;
 
   @DomName('SpeechSynthesisVoice.name')
   @DocsEditable
+  @Experimental // untriaged
   final String name;
 
   @JSName('voiceURI')
   @DomName('SpeechSynthesisVoice.voiceURI')
   @DocsEditable
+  @Experimental // untriaged
   final String voiceUri;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19044,6 +19720,7 @@
  * section of the library tour.
  */
 @DomName('Storage')
+@Unstable
 class Storage implements Map<String, String>
      native "Storage" {
 
@@ -19132,6 +19809,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('StorageErrorCallback')
+// http://www.w3.org/TR/quota-api/#storageerrorcallback-callback
+@Experimental
 typedef void StorageErrorCallback(DomException error);
 // 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
@@ -19141,6 +19821,7 @@
 
 
 @DomName('StorageEvent')
+@Unstable
 class StorageEvent extends Event native "StorageEvent" {
   factory StorageEvent(String type,
     {bool canBubble: false, bool cancelable: false, String key, String oldValue,
@@ -19184,6 +19865,8 @@
 
 
 @DomName('StorageInfo')
+// http://www.w3.org/TR/file-system-api/
+@Experimental
 class StorageInfo native "StorageInfo" {
 
   @DomName('StorageInfo.PERSISTENT')
@@ -19243,6 +19926,8 @@
 
 @DocsEditable
 @DomName('StorageQuota')
+// http://www.w3.org/TR/quota-api/#idl-def-StorageQuota
+@Experimental
 class StorageQuota native "StorageQuota" {
 
   @DomName('StorageQuota.queryUsageAndQuota')
@@ -19260,6 +19945,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('StorageQuotaCallback')
+// http://www.w3.org/TR/quota-api/#idl-def-StorageQuotaCallback
+@Experimental
 typedef void StorageQuotaCallback(int grantedQuotaInBytes);
 // 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
@@ -19268,6 +19956,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('StorageUsageCallback')
+// http://www.w3.org/TR/quota-api/#idl-def-StorageUsageCallback
+@Experimental
 typedef void StorageUsageCallback(int currentUsageInBytes, int currentQuotaInBytes);
 // 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
@@ -19276,6 +19967,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('StringCallback')
+// http://www.w3.org/TR/2011/WD-html5-20110113/dnd.html#the-datatransferitem-interface
+@Experimental
 typedef void _StringCallback(String data);
 // 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
@@ -19317,6 +20011,8 @@
 
 @DocsEditable
 @DomName('StyleMedia')
+// http://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html
+@Experimental // nonstandard
 class StyleMedia native "StyleMedia" {
 
   @DomName('StyleMedia.type')
@@ -19469,6 +20165,8 @@
 
   @DomName('HTMLTableElement.border')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLTableElement-partial
+  @deprecated // deprecated
   String border;
 
   @DomName('HTMLTableElement.caption')
@@ -19620,6 +20318,7 @@
 @DomName('HTMLTemplateElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#template-element
 class TemplateElement extends Element native "HTMLTemplateElement" {
 
   @DomName('HTMLTemplateElement.HTMLTemplateElement')
@@ -19775,6 +20474,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://www.w3.org/Bugs/Public/show_bug.cgi?id=21067
   final Node insertionParent;
 
   @DomName('Text.wholeText')
@@ -19783,6 +20483,8 @@
 
   @DomName('Text.replaceWholeText')
   @DocsEditable
+  // http://dom.spec.whatwg.org/#dom-text-replacewholetext
+  @deprecated // deprecated
   Text replaceWholeText(String content) native;
 
   @DomName('Text.splitText')
@@ -19853,6 +20555,8 @@
 
   @DomName('HTMLTextAreaElement.dirName')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#dom-textarea-dirname
+  @Experimental
   String dirName;
 
   @DomName('HTMLTextAreaElement.disabled')
@@ -19865,6 +20569,7 @@
 
   @DomName('HTMLTextAreaElement.labels')
   @DocsEditable
+  @Unstable
   @Returns('NodeList')
   @Creates('NodeList')
   final List<Node> labels;
@@ -19947,6 +20652,8 @@
 
   @DomName('HTMLTextAreaElement.setRangeText')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#dom-textarea/input-setrangetext
+  @Experimental
   void setRangeText(String replacement, [int start, int end, String selectionMode]) native;
 
   @DomName('HTMLTextAreaElement.setSelectionRange')
@@ -19961,6 +20668,7 @@
 
 
 @DomName('TextEvent')
+@Unstable
 class TextEvent extends UIEvent native "TextEvent" {
   factory TextEvent(String type,
     {bool canBubble: false, bool cancelable: false, Window view, String data}) {
@@ -20002,6 +20710,8 @@
 
 @DocsEditable
 @DomName('TextTrack')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttrack
+@Experimental
 class TextTrack extends EventTarget native "TextTrack" {
 
   @DomName('TextTrack.cuechangeEvent')
@@ -20065,6 +20775,8 @@
 
 @DocsEditable
 @DomName('TextTrackCue')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttrackcue
+@Experimental
 class TextTrackCue extends EventTarget native "TextTrackCue" {
 
   @DomName('TextTrackCue.enterEvent')
@@ -20084,6 +20796,7 @@
 
   @DomName('TextTrackCue.align')
   @DocsEditable
+  @Experimental // nonstandard
   String align;
 
   @DomName('TextTrackCue.endTime')
@@ -20096,6 +20809,7 @@
 
   @DomName('TextTrackCue.line')
   @DocsEditable
+  @Experimental // nonstandard
   int line;
 
   @DomName('TextTrackCue.pauseOnExit')
@@ -20104,14 +20818,17 @@
 
   @DomName('TextTrackCue.position')
   @DocsEditable
+  @Experimental // nonstandard
   int position;
 
   @DomName('TextTrackCue.size')
   @DocsEditable
+  @Experimental // nonstandard
   int size;
 
   @DomName('TextTrackCue.snapToLines')
   @DocsEditable
+  @Experimental // nonstandard
   bool snapToLines;
 
   @DomName('TextTrackCue.startTime')
@@ -20120,6 +20837,7 @@
 
   @DomName('TextTrackCue.text')
   @DocsEditable
+  @Experimental // nonstandard
   String text;
 
   @DomName('TextTrackCue.track')
@@ -20128,6 +20846,7 @@
 
   @DomName('TextTrackCue.vertical')
   @DocsEditable
+  @Experimental // nonstandard
   String vertical;
 
   @JSName('addEventListener')
@@ -20142,6 +20861,7 @@
   @JSName('getCueAsHTML')
   @DomName('TextTrackCue.getCueAsHTML')
   @DocsEditable
+  @Experimental // nonstandard
   DocumentFragment getCueAsHtml() native;
 
   @JSName('removeEventListener')
@@ -20164,6 +20884,8 @@
 
 @DocsEditable
 @DomName('TextTrackCueList')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttrackcuelist
+@Experimental
 class TextTrackCueList extends Interceptor with ListMixin<TextTrackCue>, ImmutableListMixin<TextTrackCue> implements List<TextTrackCue>, JavaScriptIndexingBehavior native "TextTrackCueList" {
 
   @DomName('TextTrackCueList.length')
@@ -20229,6 +20951,8 @@
 
 @DocsEditable
 @DomName('TextTrackList')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttracklist
+@Experimental
 class TextTrackList extends EventTarget with ListMixin<TextTrack>, ImmutableListMixin<TextTrack> implements JavaScriptIndexingBehavior, List<TextTrack> native "TextTrackList" {
 
   @DomName('TextTrackList.addtrackEvent')
@@ -20312,6 +21036,7 @@
 
 @DocsEditable
 @DomName('TimeRanges')
+@Unstable
 class TimeRanges native "TimeRanges" {
 
   @DomName('TimeRanges.length')
@@ -20333,6 +21058,7 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('TimeoutHandler')
 typedef void TimeoutHandler();
 // 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
@@ -20354,6 +21080,8 @@
 
 @DocsEditable
 @DomName('Touch')
+// http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+@Experimental
 class Touch native "Touch" {
 
   @JSName('clientX')
@@ -20451,6 +21179,8 @@
 
 
 @DomName('TouchEvent')
+// http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+@Experimental
 class TouchEvent extends UIEvent native "TouchEvent" {
   factory TouchEvent(TouchList touches, TouchList targetTouches,
       TouchList changedTouches, String type,
@@ -20521,6 +21251,8 @@
 
 
 @DomName('TouchList')
+// http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+@Experimental
 class TouchList extends Interceptor with ListMixin<Touch>, ImmutableListMixin<Touch> implements JavaScriptIndexingBehavior, List<Touch> native "TouchList" {
   /// NB: This constructor likely does not work as you might expect it to! This
   /// constructor will simply fail (returning null) if you are not on a device
@@ -20593,6 +21325,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#the-track-element
+@Experimental
 class TrackElement extends Element native "HTMLTrackElement" {
 
   @DomName('HTMLTrackElement.HTMLTrackElement')
@@ -20654,6 +21388,7 @@
 
 @DocsEditable
 @DomName('TrackEvent')
+@Unstable
 class TrackEvent extends Event native "TrackEvent" {
 
   @DomName('TrackEvent.track')
@@ -20687,6 +21422,7 @@
 
 
 @DomName('TreeWalker')
+@Unstable
 class TreeWalker native "TreeWalker" {
   factory TreeWalker(Node root, int whatToShow) {
     return document.$dom_createTreeWalker(root, whatToShow, null, false);
@@ -20698,6 +21434,8 @@
 
   @DomName('TreeWalker.expandEntityReferences')
   @DocsEditable
+  // http://dom.spec.whatwg.org/#dom-traversal
+  @deprecated // deprecated
   final bool expandEntityReferences;
 
   @DomName('TreeWalker.filter')
@@ -20770,6 +21508,7 @@
   @JSName('charCode')
   @DomName('UIEvent.charCode')
   @DocsEditable
+  @Unstable
   final int $dom_charCode;
 
   @DomName('UIEvent.detail')
@@ -20779,26 +21518,35 @@
   @JSName('keyCode')
   @DomName('UIEvent.keyCode')
   @DocsEditable
+  @Unstable
   final int $dom_keyCode;
 
   @JSName('layerX')
   @DomName('UIEvent.layerX')
   @DocsEditable
+  // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
+  @Experimental // nonstandard
   final int $dom_layerX;
 
   @JSName('layerY')
   @DomName('UIEvent.layerY')
   @DocsEditable
+  // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
+  @Experimental // nonstandard
   final int $dom_layerY;
 
   @JSName('pageX')
   @DomName('UIEvent.pageX')
   @DocsEditable
+  // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
+  @Experimental // nonstandard
   final int $dom_pageX;
 
   @JSName('pageY')
   @DomName('UIEvent.pageY')
   @DocsEditable
+  // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
+  @Experimental // nonstandard
   final int $dom_pageY;
 
   WindowBase get view => _convertNativeToDart_Window(this._get_view);
@@ -20811,6 +21559,7 @@
 
   @DomName('UIEvent.which')
   @DocsEditable
+  @Unstable
   final int which;
 
   @JSName('initUIEvent')
@@ -20968,6 +21717,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @deprecated // deprecated
   final bool displayingFullscreen;
 
   @JSName('webkitDroppedFrameCount')
@@ -20984,6 +21735,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @deprecated // deprecated
   final bool supportsFullscreen;
 
   @DomName('HTMLVideoElement.width')
@@ -20996,6 +21749,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @deprecated // deprecated
   void enterFullScreen() native;
 
   @JSName('webkitEnterFullscreen')
@@ -21004,6 +21759,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   void enterFullscreen() native;
 
   @JSName('webkitExitFullScreen')
@@ -21012,6 +21768,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
+  @deprecated // deprecated
   void exitFullScreen() native;
 
   @JSName('webkitExitFullscreen')
@@ -21020,6 +21778,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
   void exitFullscreen() native;
 
 }
@@ -21030,6 +21789,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('VoidCallback')
+// http://www.w3.org/TR/file-system-api/#the-voidcallback-interface
+@Experimental
 typedef void VoidCallback();
 // 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
@@ -21076,6 +21838,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class WebSocket extends EventTarget native "WebSocket" {
 
   @DomName('WebSocket.closeEvent')
@@ -21134,6 +21897,7 @@
   @JSName('URL')
   @DomName('WebSocket.URL')
   @DocsEditable
+  @deprecated // deprecated
   final String Url;
 
   @DomName('WebSocket.binaryType')
@@ -21300,6 +22064,7 @@
   @JSName('initWebKitWheelEvent')
   @DomName('WheelEvent.initWebKitWheelEvent')
   @DocsEditable
+  @Experimental
   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;
 
 
@@ -21689,14 +22454,19 @@
 
   @DomName('Window.DOMContentLoadedEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<Event> contentLoadedEvent = const EventStreamProvider<Event>('DOMContentLoaded');
 
   @DomName('Window.devicemotionEvent')
   @DocsEditable
+  // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
+  @Experimental
   static const EventStreamProvider<DeviceMotionEvent> deviceMotionEvent = const EventStreamProvider<DeviceMotionEvent>('devicemotion');
 
   @DomName('Window.deviceorientationEvent')
   @DocsEditable
+  // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
+  @Experimental
   static const EventStreamProvider<DeviceOrientationEvent> deviceOrientationEvent = const EventStreamProvider<DeviceOrientationEvent>('deviceorientation');
 
   @DomName('Window.hashchangeEvent')
@@ -21744,6 +22514,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // untriaged
   static const EventStreamProvider<AnimationEvent> animationEndEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationEnd');
 
   @DomName('Window.webkitAnimationIterationEvent')
@@ -21751,6 +22522,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // untriaged
   static const EventStreamProvider<AnimationEvent> animationIterationEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationIteration');
 
   @DomName('Window.webkitAnimationStartEvent')
@@ -21758,19 +22530,25 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // untriaged
   static const EventStreamProvider<AnimationEvent> animationStartEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationStart');
 
   @DomName('Window.PERSISTENT')
   @DocsEditable
+  // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
+  @Experimental
   static const int PERSISTENT = 1;
 
   @DomName('Window.TEMPORARY')
   @DocsEditable
+  // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
+  @Experimental
   static const int TEMPORARY = 0;
 
   @JSName('CSS')
   @DomName('Window.CSS')
   @DocsEditable
+  @Experimental // untriaged
   final Css css;
 
   @DomName('Window.applicationCache')
@@ -21783,6 +22561,8 @@
 
   @DomName('Window.crypto')
   @DocsEditable
+  // http://www.w3.org/TR/WebCryptoAPI/
+  @Experimental
   final Crypto crypto;
 
   @DomName('Window.defaultStatus')
@@ -21791,14 +22571,18 @@
 
   @DomName('Window.defaultstatus')
   @DocsEditable
+  @Experimental // non-standard
   String defaultstatus;
 
   @DomName('Window.devicePixelRatio')
   @DocsEditable
+  // http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html
+  @Experimental // non-standard
   final num devicePixelRatio;
 
   @DomName('Window.event')
   @DocsEditable
+  @deprecated // deprecated
   final Event event;
 
   @DomName('Window.history')
@@ -21835,6 +22619,7 @@
 
   @DomName('Window.offscreenBuffering')
   @DocsEditable
+  @Experimental // non-standard
   final bool offscreenBuffering;
 
   WindowBase get opener => _convertNativeToDart_Window(this._get_opener);
@@ -21878,6 +22663,8 @@
 
   @DomName('Window.personalbar')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.personalbar
+  @deprecated // deprecated
   final BarInfo personalbar;
 
   @DomName('Window.screen')
@@ -21926,6 +22713,7 @@
 
   @DomName('Window.speechSynthesis')
   @DocsEditable
+  @Experimental // untriaged
   final SpeechSynthesis speechSynthesis;
 
   @DomName('Window.status')
@@ -21938,6 +22726,8 @@
 
   @DomName('Window.styleMedia')
   @DocsEditable
+  // http://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html
+  @Experimental // nonstandard
   final StyleMedia styleMedia;
 
   @DomName('Window.toolbar')
@@ -21958,6 +22748,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://plus.sandbox.google.com/u/0/+GoogleChromeDevelopers/posts/8vWo8hq4pDm?e=Showroom
+  @deprecated // deprecated
   final NotificationCenter notifications;
 
   @JSName('webkitStorageInfo')
@@ -21966,6 +22758,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.w3.org/TR/file-system-api/
+  @deprecated // deprecated
   final StorageInfo storageInfo;
 
   WindowBase get window => _convertNativeToDart_Window(this._get_window);
@@ -21995,6 +22789,8 @@
 
   @DomName('Window.captureEvents')
   @DocsEditable
+  // http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-capture
+  @deprecated // deprecated
   void captureEvents() native;
 
   @JSName('clearInterval')
@@ -22021,6 +22817,7 @@
 
   @DomName('Window.find')
   @DocsEditable
+  @Experimental // non-standard
   bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) native;
 
   @JSName('getComputedStyle')
@@ -22031,6 +22828,7 @@
   @JSName('getMatchedCSSRules')
   @DomName('Window.getMatchedCSSRules')
   @DocsEditable
+  @Experimental // non-standard
   @Returns('_CssRuleList')
   @Creates('_CssRuleList')
   List<CssRule> getMatchedCssRules(Element element, String pseudoElement) native;
@@ -22056,6 +22854,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.w3.org/TR/webdatabase/
+  @Experimental // deprecated
   @Creates('SqlDatabase')
   SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
 
@@ -22086,6 +22886,8 @@
 
   @DomName('Window.releaseEvents')
   @DocsEditable
+  // http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-capture
+  @deprecated // deprecated
   void releaseEvents() native;
 
   @JSName('removeEventListener')
@@ -22141,6 +22943,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://developer.apple.com/library/safari/#documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html
   _DomPoint _convertPointFromNodeToPage(Node node, _DomPoint p) native;
 
   @JSName('webkitConvertPointFromPageToNode')
@@ -22149,6 +22952,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://developer.apple.com/library/safari/#documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html
   _DomPoint _convertPointFromPageToNode(Node node, _DomPoint p) native;
 
   @JSName('webkitRequestFileSystem')
@@ -22156,6 +22960,7 @@
   @DocsEditable
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental
+  // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
   void __requestFileSystem(int type, int size, _FileSystemCallback successCallback, [_ErrorCallback errorCallback]) native;
 
   @JSName('webkitRequestFileSystem')
@@ -22163,6 +22968,7 @@
   @DocsEditable
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental
+  // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
   Future<FileSystem> _requestFileSystem(int type, int size) {
     var completer = new Completer<FileSystem>();
     __requestFileSystem(type, size,
@@ -22176,6 +22982,7 @@
   @DocsEditable
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental
+  // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
   void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) native;
 
   @JSName('webkitResolveLocalFileSystemURL')
@@ -22183,6 +22990,7 @@
   @DocsEditable
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental
+  // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
   Future<Entry> resolveLocalFileSystemUrl(String url) {
     var completer = new Completer<Entry>();
     _resolveLocalFileSystemUrl(url,
@@ -22193,6 +23001,7 @@
 
   @DomName('Window.onDOMContentLoaded')
   @DocsEditable
+  @Experimental // untriaged
   Stream<Event> get onContentLoaded => contentLoadedEvent.forTarget(this);
 
   @DomName('Window.onabort')
@@ -22221,10 +23030,14 @@
 
   @DomName('Window.ondevicemotion')
   @DocsEditable
+  // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
+  @Experimental
   Stream<DeviceMotionEvent> get onDeviceMotion => deviceMotionEvent.forTarget(this);
 
   @DomName('Window.ondeviceorientation')
   @DocsEditable
+  // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
+  @Experimental
   Stream<DeviceOrientationEvent> get onDeviceOrientation => deviceOrientationEvent.forTarget(this);
 
   @DomName('Window.ondrag')
@@ -22353,6 +23166,8 @@
 
   @DomName('Window.onsearch')
   @DocsEditable
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental
   Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
   @DomName('Window.onselect')
@@ -22369,18 +23184,26 @@
 
   @DomName('Window.ontouchcancel')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
 
   @DomName('Window.ontouchend')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
   @DomName('Window.ontouchmove')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
   @DomName('Window.ontouchstart')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
   @DomName('Window.onunload')
@@ -22389,18 +23212,22 @@
 
   @DomName('Window.onwebkitAnimationEnd')
   @DocsEditable
+  @Experimental // untriaged
   Stream<AnimationEvent> get onAnimationEnd => animationEndEvent.forTarget(this);
 
   @DomName('Window.onwebkitAnimationIteration')
   @DocsEditable
+  @Experimental // untriaged
   Stream<AnimationEvent> get onAnimationIteration => animationIterationEvent.forTarget(this);
 
   @DomName('Window.onwebkitAnimationStart')
   @DocsEditable
+  @Experimental // untriaged
   Stream<AnimationEvent> get onAnimationStart => animationStartEvent.forTarget(this);
 
   @DomName('Window.onwebkitTransitionEnd')
   @DocsEditable
+  @deprecated
   Stream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent.forTarget(this);
 
 
@@ -22479,6 +23306,8 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#worker
+@Experimental // stable
 class Worker extends AbstractWorker native "Worker" {
 
   @DomName('Worker.messageEvent')
@@ -22514,6 +23343,8 @@
 
 @DocsEditable
 @DomName('XPathEvaluator')
+// http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator
+@deprecated // experimental
 class XPathEvaluator native "XPathEvaluator" {
 
   @DomName('XPathEvaluator.XPathEvaluator')
@@ -22542,6 +23373,8 @@
 
 @DocsEditable
 @DomName('XPathException')
+// http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathException
+@deprecated // experimental
 class XPathException native "XPathException" {
 
   @DomName('XPathException.INVALID_EXPRESSION_ERR')
@@ -22558,10 +23391,12 @@
 
   @DomName('XPathException.message')
   @DocsEditable
+  @Experimental // non-standard
   final String message;
 
   @DomName('XPathException.name')
   @DocsEditable
+  @Experimental // non-standard
   final String name;
 
   @DomName('XPathException.toString')
@@ -22575,6 +23410,8 @@
 
 @DocsEditable
 @DomName('XPathExpression')
+// http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathExpression
+@deprecated // experimental
 class XPathExpression native "XPathExpression" {
 
   @DomName('XPathExpression.evaluate')
@@ -22588,6 +23425,8 @@
 
 @DocsEditable
 @DomName('XPathNSResolver')
+// http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathNSResolver
+@deprecated // experimental
 class XPathNSResolver native "XPathNSResolver" {
 
   @JSName('lookupNamespaceURI')
@@ -22602,6 +23441,8 @@
 
 @DocsEditable
 @DomName('XPathResult')
+// http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult
+@deprecated // experimental
 class XPathResult native "XPathResult" {
 
   @DomName('XPathResult.ANY_TYPE')
@@ -22687,6 +23528,8 @@
 
 @DocsEditable
 @DomName('XMLSerializer')
+// http://domparsing.spec.whatwg.org/#the-xmlserializer-interface
+@deprecated // stable
 class XmlSerializer native "XMLSerializer" {
 
   @DomName('XMLSerializer.XMLSerializer')
@@ -22710,6 +23553,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@deprecated // nonstandard
 class XsltProcessor native "XSLTProcessor" {
 
   @DomName('XSLTProcessor.XSLTProcessor')
@@ -22761,6 +23605,8 @@
 
 @DocsEditable
 @DomName('CSSPrimitiveValue')
+// http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface
+@deprecated // deprecated
 abstract class _CSSPrimitiveValue extends _CSSValue native "CSSPrimitiveValue" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22770,6 +23616,8 @@
 
 @DocsEditable
 @DomName('CSSValue')
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 abstract class _CSSValue native "CSSValue" {
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -22965,6 +23813,8 @@
 
 @DocsEditable
 @DomName('Counter')
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 abstract class _Counter native "Counter" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23035,6 +23885,8 @@
 
 @DocsEditable
 @DomName('CSSValueList')
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 class _CssValueList extends _CSSValue with ListMixin<_CSSValue>, ImmutableListMixin<_CSSValue> implements JavaScriptIndexingBehavior, List<_CSSValue> native "CSSValueList" {
 
   @DomName('CSSValueList.length')
@@ -23098,6 +23950,7 @@
 @DomName('DOMFileSystemSync')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://www.w3.org/TR/file-system-api/#the-filesystemsync-interface
 abstract class _DOMFileSystemSync native "DOMFileSystemSync" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23110,6 +23963,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/webdatabase/#databasesync
+@deprecated // deprecated
 abstract class _DatabaseSync native "DatabaseSync" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23119,6 +23974,8 @@
 
 @DocsEditable
 @DomName('DedicatedWorkerContext')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html
+@Experimental
 abstract class _DedicatedWorkerContext extends _WorkerContext native "DedicatedWorkerContext" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23128,6 +23985,8 @@
 
 @DocsEditable
 @DomName('DirectoryEntrySync')
+// http://www.w3.org/TR/file-system-api/#the-directoryentrysync-interface
+@Experimental
 abstract class _DirectoryEntrySync extends _EntrySync native "DirectoryEntrySync" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23137,6 +23996,8 @@
 
 @DocsEditable
 @DomName('DirectoryReaderSync')
+// http://www.w3.org/TR/file-system-api/#idl-def-DirectoryReaderSync
+@Experimental
 abstract class _DirectoryReaderSync native "DirectoryReaderSync" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23149,6 +24010,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://developer.apple.com/library/safari/#documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html
+@Experimental // non-standard
 class _DomPoint native "WebKitPoint" {
 
   @DomName('WebKitPoint.DOMPoint')
@@ -23176,6 +24039,7 @@
 
 @DocsEditable
 @DomName('EntityReference')
+@deprecated // deprecated
 abstract class _EntityReference extends Node native "EntityReference" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23185,6 +24049,8 @@
 
 @DocsEditable
 @DomName('EntryArray')
+// http://www.w3.org/TR/file-system-api/#the-entry-interface
+@Experimental
 class _EntryArray extends Interceptor with ListMixin<Entry>, ImmutableListMixin<Entry> implements JavaScriptIndexingBehavior, List<Entry> native "EntryArray" {
 
   @DomName('EntryArray.length')
@@ -23246,6 +24112,8 @@
 
 @DocsEditable
 @DomName('EntryArraySync')
+// http://www.w3.org/TR/file-system-api/#idl-def-EntrySync
+@Experimental
 class _EntryArraySync extends Interceptor with ListMixin<_EntrySync>, ImmutableListMixin<_EntrySync> implements JavaScriptIndexingBehavior, List<_EntrySync> native "EntryArraySync" {
 
   @DomName('EntryArraySync.length')
@@ -23307,6 +24175,8 @@
 
 @DocsEditable
 @DomName('EntrySync')
+// http://www.w3.org/TR/file-system-api/#idl-def-EntrySync
+@Experimental
 abstract class _EntrySync native "EntrySync" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23316,6 +24186,8 @@
 
 @DocsEditable
 @DomName('FileEntrySync')
+// http://www.w3.org/TR/file-system-api/#the-fileentrysync-interface
+@Experimental
 abstract class _FileEntrySync extends _EntrySync native "FileEntrySync" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23325,6 +24197,8 @@
 
 @DocsEditable
 @DomName('FileReaderSync')
+// http://www.w3.org/TR/FileAPI/#FileReaderSync
+@Experimental
 abstract class _FileReaderSync native "FileReaderSync" {
 
   @DomName('FileReaderSync.FileReaderSync')
@@ -23341,6 +24215,8 @@
 
 @DocsEditable
 @DomName('FileWriterSync')
+// http://www.w3.org/TR/file-writer-api/#idl-def-FileWriterSync
+@Experimental
 abstract class _FileWriterSync native "FileWriterSync" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23350,6 +24226,8 @@
 
 @DocsEditable
 @DomName('GamepadList')
+// https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html
+@Experimental
 class _GamepadList extends Interceptor with ListMixin<Gamepad>, ImmutableListMixin<Gamepad> implements JavaScriptIndexingBehavior, List<Gamepad> native "GamepadList" {
 
   @DomName('GamepadList.length')
@@ -23411,6 +24289,8 @@
 
 @DocsEditable
 @DomName('HTMLAppletElement')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-applet-element
+@deprecated // deprecated
 abstract class _HTMLAppletElement extends Element native "HTMLAppletElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23420,6 +24300,8 @@
 
 @DocsEditable
 @DomName('HTMLBaseFontElement')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#basefont
+@deprecated // deprecated
 abstract class _HTMLBaseFontElement extends Element native "HTMLBaseFontElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23429,6 +24311,8 @@
 
 @DocsEditable
 @DomName('HTMLDirectoryElement')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dir
+@deprecated // deprecated
 abstract class _HTMLDirectoryElement extends Element native "HTMLDirectoryElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23438,6 +24322,8 @@
 
 @DocsEditable
 @DomName('HTMLFontElement')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlfontelement
+@deprecated // deprecated
 abstract class _HTMLFontElement extends Element native "HTMLFontElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23447,6 +24333,8 @@
 
 @DocsEditable
 @DomName('HTMLFrameElement')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlframeelement
+@deprecated // deprecated
 abstract class _HTMLFrameElement extends Element native "HTMLFrameElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23456,6 +24344,8 @@
 
 @DocsEditable
 @DomName('HTMLFrameSetElement')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#frameset
+@deprecated // deprecated
 abstract class _HTMLFrameSetElement extends Element native "HTMLFrameSetElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23465,6 +24355,8 @@
 
 @DocsEditable
 @DomName('HTMLMarqueeElement')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-marquee-element
+@deprecated // deprecated
 abstract class _HTMLMarqueeElement extends Element native "HTMLMarqueeElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23474,6 +24366,8 @@
 
 @DocsEditable
 @DomName('NamedNodeMap')
+// http://dom.spec.whatwg.org/#namednodemap
+@deprecated // deprecated
 class _NamedNodeMap extends Interceptor with ListMixin<Node>, ImmutableListMixin<Node> implements JavaScriptIndexingBehavior, List<Node> native "NamedNodeMap" {
 
   @DomName('NamedNodeMap.length')
@@ -23559,6 +24453,7 @@
 
 @DocsEditable
 @DomName('PagePopupController')
+@deprecated // nonstandard
 abstract class _PagePopupController native "PagePopupController" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23568,6 +24463,8 @@
 
 @DocsEditable
 @DomName('RGBColor')
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 abstract class _RGBColor native "RGBColor" {
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -23586,6 +24483,8 @@
 
 @DocsEditable
 @DomName('Rect')
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 abstract class _Rect native "Rect" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23595,6 +24494,8 @@
 
 @DocsEditable
 @DomName('SharedWorker')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#shared-workers-and-the-sharedworker-interface
+@Experimental
 abstract class _SharedWorker extends AbstractWorker native "SharedWorker" {
 
   @DomName('SharedWorker.SharedWorker')
@@ -23615,6 +24516,8 @@
 
 @DocsEditable
 @DomName('SharedWorkerContext')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#shared-workers-and-the-sharedworkerglobalscope-interface
+@Experimental // nonstandard
 abstract class _SharedWorkerContext extends _WorkerContext native "SharedWorkerContext" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23624,6 +24527,8 @@
 
 @DocsEditable
 @DomName('SpeechInputResultList')
+// http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#speech_input_result_list_interface
+@Experimental
 class _SpeechInputResultList extends Interceptor with ListMixin<SpeechInputResult>, ImmutableListMixin<SpeechInputResult> implements JavaScriptIndexingBehavior, List<SpeechInputResult> native "SpeechInputResultList" {
 
   @DomName('SpeechInputResultList.length')
@@ -23685,6 +24590,8 @@
 
 @DocsEditable
 @DomName('SpeechRecognitionResultList')
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechrecognitionresultlist
+@Experimental
 class _SpeechRecognitionResultList extends Interceptor with ListMixin<SpeechRecognitionResult>, ImmutableListMixin<SpeechRecognitionResult> implements JavaScriptIndexingBehavior, List<SpeechRecognitionResult> native "SpeechRecognitionResultList" {
 
   @DomName('SpeechRecognitionResultList.length')
@@ -23807,6 +24714,8 @@
 
 @DocsEditable
 @DomName('WebKitCSSFilterValue')
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 abstract class _WebKitCSSFilterValue extends _CssValueList native "WebKitCSSFilterValue" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23819,6 +24728,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 abstract class _WebKitCSSMatrix native "WebKitCSSMatrix" {
 
   @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
@@ -23839,6 +24750,8 @@
 
 @DocsEditable
 @DomName('WebKitCSSMixFunctionValue')
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 abstract class _WebKitCSSMixFunctionValue extends _CssValueList native "WebKitCSSMixFunctionValue" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23848,6 +24761,8 @@
 
 @DocsEditable
 @DomName('WebKitCSSTransformValue')
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 abstract class _WebKitCSSTransformValue extends _CssValueList native "WebKitCSSTransformValue" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23857,6 +24772,8 @@
 
 @DocsEditable
 @DomName('WorkerContext')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#WorkerGlobalScope-partial
+@Experimental // stable
 abstract class _WorkerContext extends EventTarget native "WorkerContext" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23866,6 +24783,8 @@
 
 @DocsEditable
 @DomName('WorkerLocation')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workerlocation
+@Experimental
 abstract class _WorkerLocation native "WorkerLocation" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23875,6 +24794,8 @@
 
 @DocsEditable
 @DomName('WorkerNavigator')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workernavigator
+@Experimental
 abstract class _WorkerNavigator native "WorkerNavigator" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 0a9d8af..a0b6278 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -175,14 +175,20 @@
 
   @DomName('HTMLAnchorElement.name')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLAnchorElement-partial
+  @deprecated // deprecated
   String get name native "HTMLAnchorElement_name_Getter";
 
   @DomName('HTMLAnchorElement.name')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLAnchorElement-partial
+  @deprecated // deprecated
   void set name(String value) native "HTMLAnchorElement_name_Setter";
 
   @DomName('HTMLAnchorElement.origin')
   @DocsEditable
+  // WebKit only
+  @deprecated // nonstandard
   String get origin native "HTMLAnchorElement_origin_Getter";
 
   @DomName('HTMLAnchorElement.pathname')
@@ -195,10 +201,14 @@
 
   @DomName('HTMLAnchorElement.ping')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#the-a-element
+  @deprecated // deprecated
   String get ping native "HTMLAnchorElement_ping_Getter";
 
   @DomName('HTMLAnchorElement.ping')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#the-a-element
+  @deprecated // deprecated
   void set ping(String value) native "HTMLAnchorElement_ping_Setter";
 
   @DomName('HTMLAnchorElement.port')
@@ -292,6 +302,7 @@
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.OPERA)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class ApplicationCache extends EventTarget {
   ApplicationCache.internal() : super.internal();
 
@@ -483,10 +494,14 @@
 
   @DomName('HTMLAreaElement.ping')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLAreaElement-partial
+  @deprecated // deprecated
   String get ping native "HTMLAreaElement_ping_Getter";
 
   @DomName('HTMLAreaElement.ping')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLAreaElement-partial
+  @deprecated // deprecated
   void set ping(String value) native "HTMLAreaElement_ping_Setter";
 
   @DomName('HTMLAreaElement.port')
@@ -562,6 +577,8 @@
 
 @DocsEditable
 @DomName('AutocompleteErrorEvent')
+// http://wiki.whatwg.org/wiki/RequestAutocomplete
+@Experimental
 class AutocompleteErrorEvent extends Event {
   AutocompleteErrorEvent.internal() : super.internal();
 
@@ -596,6 +613,8 @@
 
 @DocsEditable
 @DomName('BarInfo')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#barprop (Rename to BarProp?)
+@Experimental // non-standard
 class BarInfo extends NativeFieldWrapperClass1 {
   BarInfo.internal();
 
@@ -646,6 +665,7 @@
 
 @DocsEditable
 @DomName('BeforeLoadEvent')
+@Experimental
 class BeforeLoadEvent extends Event {
   BeforeLoadEvent.internal() : super.internal();
 
@@ -889,6 +909,7 @@
 
   @DomName('HTMLButtonElement.labels')
   @DocsEditable
+  @Unstable
   List<Node> get labels native "HTMLButtonElement_labels_Getter";
 
   @DomName('HTMLButtonElement.name')
@@ -945,6 +966,8 @@
 
 @DocsEditable
 @DomName('CDATASection')
+// http://dom.spec.whatwg.org/#cdatasection
+@deprecated // deprecated
 class CDataSection extends Text {
   CDataSection.internal() : super.internal();
 
@@ -958,15 +981,18 @@
 
 @DocsEditable
 @DomName('Canvas2DContextAttributes')
+@Experimental // untriaged
 class Canvas2DContextAttributes extends NativeFieldWrapperClass1 {
   Canvas2DContextAttributes.internal();
 
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable
+  @Experimental // untriaged
   bool get alpha native "Canvas2DContextAttributes_alpha_Getter";
 
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable
+  @Experimental // untriaged
   void set alpha(bool value) native "Canvas2DContextAttributes_alpha_Setter";
 
 }
@@ -1213,10 +1239,14 @@
 
   @DomName('CanvasRenderingContext2D.currentPath')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects
+  @Experimental
   Path get currentPath native "CanvasRenderingContext2D_currentPath_Getter";
 
   @DomName('CanvasRenderingContext2D.currentPath')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects
+  @Experimental
   void set currentPath(Path value) native "CanvasRenderingContext2D_currentPath_Setter";
 
   @DomName('CanvasRenderingContext2D.fillStyle')
@@ -1525,6 +1555,7 @@
 
   @DomName('CanvasRenderingContext2D.getContextAttributes')
   @DocsEditable
+  @Experimental // untriaged
   Canvas2DContextAttributes getContextAttributes() native "CanvasRenderingContext2D_getContextAttributes_Callback";
 
   @DomName('CanvasRenderingContext2D.getImageData')
@@ -1975,15 +2006,18 @@
 
 @DocsEditable
 @DomName('Composition')
+@Experimental // untriaged
 class Composition extends NativeFieldWrapperClass1 {
   Composition.internal();
 
   @DomName('Composition.caret')
   @DocsEditable
+  @Experimental // untriaged
   Range get caret native "Composition_caret_Getter";
 
   @DomName('Composition.text')
   @DocsEditable
+  @Experimental // untriaged
   Node get text native "Composition_text_Getter";
 
 }
@@ -2031,26 +2065,32 @@
 
   @DomName('Console.memory')
   @DocsEditable
+  @Experimental
   MemoryInfo get memory native "Console_memory_Getter";
 
   @DomName('Console.profiles')
   @DocsEditable
+  @Experimental
   List<ScriptProfile> get profiles native "Console_profiles_Getter";
 
   @DomName('Console.assertCondition')
   @DocsEditable
+  @Experimental
   void assertCondition(bool condition, Object arg) native "Console_assertCondition_Callback";
 
   @DomName('Console.clear')
   @DocsEditable
+  @Experimental
   void clear(Object arg) native "Console_clear_Callback";
 
   @DomName('Console.count')
   @DocsEditable
+  @Experimental
   void count(Object arg) native "Console_count_Callback";
 
   @DomName('Console.debug')
   @DocsEditable
+  @deprecated // deprecated
   void debug(Object arg) native "Console_debug_Callback";
 
   @DomName('Console.dir')
@@ -2059,6 +2099,7 @@
 
   @DomName('Console.dirxml')
   @DocsEditable
+  @Experimental
   void dirxml(Object arg) native "Console_dirxml_Callback";
 
   @DomName('Console.error')
@@ -2087,18 +2128,22 @@
 
   @DomName('Console.markTimeline')
   @DocsEditable
+  @Experimental
   void markTimeline(Object arg) native "Console_markTimeline_Callback";
 
   @DomName('Console.profile')
   @DocsEditable
+  @Experimental
   void profile(String title) native "Console_profile_Callback";
 
   @DomName('Console.profileEnd')
   @DocsEditable
+  @Experimental
   void profileEnd(String title) native "Console_profileEnd_Callback";
 
   @DomName('Console.table')
   @DocsEditable
+  @Experimental
   void table(Object arg) native "Console_table_Callback";
 
   @DomName('Console.time')
@@ -2111,6 +2156,7 @@
 
   @DomName('Console.timeStamp')
   @DocsEditable
+  @Experimental
   void timeStamp(Object arg) native "Console_timeStamp_Callback";
 
   @DomName('Console.trace')
@@ -2133,6 +2179,7 @@
 @DomName('HTMLContentElement')
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
 @Experimental
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#content-element
 class ContentElement extends _Element_Merged {
   ContentElement.internal() : super.internal();
 
@@ -2217,6 +2264,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/WebCryptoAPI/
 class Crypto extends NativeFieldWrapperClass1 {
   Crypto.internal();
 
@@ -2237,6 +2285,7 @@
 
 @DocsEditable
 @DomName('CSS')
+@Experimental // untriaged
 class Css extends NativeFieldWrapperClass1 {
   Css.internal();
 
@@ -2264,6 +2313,8 @@
 
 @DocsEditable
 @DomName('CSSCharsetRule')
+// http://dev.w3.org/csswg/cssom/#the-csscharsetrule-interface
+@Experimental
 class CssCharsetRule extends CssRule {
   CssCharsetRule.internal() : super.internal();
 
@@ -2288,6 +2339,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/filter-effects/
 class CssFilterRule extends CssRule {
   CssFilterRule.internal() : super.internal();
 
@@ -2305,6 +2357,8 @@
 
 @DocsEditable
 @DomName('CSSFontFaceLoadEvent')
+// http://www.w3.org/TR/css3-fonts/
+@Experimental
 class CssFontFaceLoadEvent extends Event {
   CssFontFaceLoadEvent.internal() : super.internal();
 
@@ -2345,6 +2399,7 @@
 @DomName('CSSHostRule')
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
 @Experimental
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#css-host-rule-interface
 class CssHostRule extends CssRule {
   CssHostRule.internal() : super.internal();
 
@@ -2398,6 +2453,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/css3-animations/#CSSKeyframeRule-interface
 class CssKeyframeRule extends CssRule {
   CssKeyframeRule.internal() : super.internal();
 
@@ -2426,6 +2482,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/css3-animations/#csskeyframesrule
 class CssKeyframesRule extends CssRule {
   CssKeyframesRule.internal() : super.internal();
 
@@ -2520,6 +2577,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://dev.w3.org/csswg/css-regions/#region-style-rule-interface
 class CssRegionRule extends CssRule {
   CssRegionRule.internal() : super.internal();
 
@@ -2550,6 +2608,8 @@
 
   @DomName('CSSRule.HOST_RULE')
   @DocsEditable
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-css-rule-host-rule
+  @Experimental
   static const int HOST_RULE = 1001;
 
   @DomName('CSSRule.IMPORT_RULE')
@@ -2570,26 +2630,37 @@
 
   @DomName('CSSRule.SUPPORTS_RULE')
   @DocsEditable
+  @Experimental // untriaged
   static const int SUPPORTS_RULE = 12;
 
   @DomName('CSSRule.UNKNOWN_RULE')
   @DocsEditable
+  // http://dev.w3.org/csswg/cssom/#changes-from-dom2
+  @deprecated // deprecated
   static const int UNKNOWN_RULE = 0;
 
   @DomName('CSSRule.WEBKIT_FILTER_RULE')
   @DocsEditable
+  // http://www.w3.org/TR/filter-effects/
+  @Experimental
   static const int WEBKIT_FILTER_RULE = 17;
 
   @DomName('CSSRule.WEBKIT_KEYFRAMES_RULE')
   @DocsEditable
+  // http://www.w3.org/TR/css3-animations/#cssrule
+  @Experimental
   static const int WEBKIT_KEYFRAMES_RULE = 7;
 
   @DomName('CSSRule.WEBKIT_KEYFRAME_RULE')
   @DocsEditable
+  // http://www.w3.org/TR/css3-animations/#cssrule
+  @Experimental
   static const int WEBKIT_KEYFRAME_RULE = 8;
 
   @DomName('CSSRule.WEBKIT_REGION_RULE')
   @DocsEditable
+  // http://dev.w3.org/csswg/css-regions/#region-style-rule-interface
+  @Experimental
   static const int WEBKIT_REGION_RULE = 16;
 
   @DomName('CSSRule.cssText')
@@ -2648,6 +2719,8 @@
 
   @DomName('CSSStyleDeclaration.getPropertyShorthand')
   @DocsEditable
+  // http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface
+  @deprecated // deprecated
   String getPropertyShorthand(String propertyName) native "CSSStyleDeclaration_getPropertyShorthand_Callback";
 
   @DomName('CSSStyleDeclaration.getPropertyValue')
@@ -2656,6 +2729,8 @@
 
   @DomName('CSSStyleDeclaration.isPropertyImplicit')
   @DocsEditable
+  // http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface
+  @deprecated // deprecated
   bool isPropertyImplicit(String propertyName) native "CSSStyleDeclaration_isPropertyImplicit_Callback";
 
   @DomName('CSSStyleDeclaration.item')
@@ -5895,6 +5970,7 @@
 
   @DomName('CSSStyleSheet.rules')
   @DocsEditable
+  @Experimental // non-standard
   List<CssRule> get rules native "CSSStyleSheet_rules_Getter";
 
   int addRule(String selector, String style, [int index]) {
@@ -5918,6 +5994,7 @@
 
   @DomName('CSSStyleSheet.removeRule')
   @DocsEditable
+  @Experimental // non-standard
   void removeRule(int index) native "CSSStyleSheet_removeRule_Callback";
 
 }
@@ -5930,23 +6007,28 @@
 
 @DocsEditable
 @DomName('CSSSupportsRule')
+@Experimental // untriaged
 class CssSupportsRule extends CssRule {
   CssSupportsRule.internal() : super.internal();
 
   @DomName('CSSSupportsRule.conditionText')
   @DocsEditable
+  @Experimental // untriaged
   String get conditionText native "CSSSupportsRule_conditionText_Getter";
 
   @DomName('CSSSupportsRule.cssRules')
   @DocsEditable
+  @Experimental // untriaged
   List<CssRule> get cssRules native "CSSSupportsRule_cssRules_Getter";
 
   @DomName('CSSSupportsRule.deleteRule')
   @DocsEditable
+  @Experimental // untriaged
   void deleteRule(int index) native "CSSSupportsRule_deleteRule_Callback";
 
   @DomName('CSSSupportsRule.insertRule')
   @DocsEditable
+  @Experimental // untriaged
   int insertRule(String rule, int index) native "CSSSupportsRule_insertRule_Callback";
 
 }
@@ -5959,6 +6041,8 @@
 
 @DocsEditable
 @DomName('CSSUnknownRule')
+// http://dev.w3.org/csswg/cssom/#the-cssstylesheet-interface
+@deprecated // deprecated
 class CssUnknownRule extends CssRule {
   CssUnknownRule.internal() : super.internal();
 
@@ -5972,6 +6056,8 @@
 
 @DocsEditable
 @DomName('CustomElementConstructor')
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html#dfn-custom-element-constructor-generation
+@Experimental
 class CustomElementConstructor extends NativeFieldWrapperClass1 {
   CustomElementConstructor.internal();
 
@@ -6131,6 +6217,8 @@
 
 @DocsEditable
 @DomName('DataTransferItem')
+// http://www.w3.org/TR/2011/WD-html5-20110113/dnd.html#the-datatransferitem-interface
+@Experimental
 class DataTransferItem extends NativeFieldWrapperClass1 {
   DataTransferItem.internal();
 
@@ -6174,6 +6262,8 @@
 
 @DocsEditable
 @DomName('DataTransferItemList')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-datatransferitemlist-interface
+@Experimental
 class DataTransferItemList extends NativeFieldWrapperClass1 {
   DataTransferItemList.internal();
 
@@ -6213,6 +6303,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('DatabaseCallback')
+// http://www.w3.org/TR/webdatabase/#databasecallback
+@Experimental // deprecated
 typedef void DatabaseCallback(database);
 // 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
@@ -6254,6 +6347,8 @@
 
 @DocsEditable
 @DomName('DeviceAcceleration')
+// http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
+@Experimental
 class DeviceAcceleration extends NativeFieldWrapperClass1 {
   DeviceAcceleration.internal();
 
@@ -6279,6 +6374,8 @@
 
 @DocsEditable
 @DomName('DeviceMotionEvent')
+// http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
+@Experimental
 class DeviceMotionEvent extends Event {
   DeviceMotionEvent.internal() : super.internal();
 
@@ -6306,6 +6403,8 @@
 // WARNING: Do not edit - generated code.
 
 @DomName('DeviceOrientationEvent')
+// http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
+@Experimental
 
 class DeviceOrientationEvent extends Event {
   factory DeviceOrientationEvent(String type,
@@ -6348,6 +6447,8 @@
 
 @DocsEditable
 @DomName('DeviceRotationRate')
+// http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
+@Experimental
 class DeviceRotationRate extends NativeFieldWrapperClass1 {
   DeviceRotationRate.internal();
 
@@ -6373,6 +6474,7 @@
 
 @DocsEditable
 @DomName('HTMLDialogElement')
+@Unstable
 class DialogElement extends _Element_Merged {
   DialogElement.internal() : super.internal();
 
@@ -6403,6 +6505,8 @@
 
 
 @DomName('DirectoryEntry')
+// http://www.w3.org/TR/file-system-api/#the-directoryentry-interface
+@Experimental
 class DirectoryEntry extends Entry {
   
   /**
@@ -6494,6 +6598,8 @@
 
 @DocsEditable
 @DomName('DirectoryReader')
+// http://www.w3.org/TR/file-system-api/#the-directoryreader-interface
+@Experimental
 class DirectoryReader extends NativeFieldWrapperClass1 {
   DirectoryReader.internal();
 
@@ -6574,6 +6680,8 @@
 
   @DomName('Document.securitypolicyviolationEvent')
   @DocsEditable
+  // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#widl-Document-onsecuritypolicyviolation
+  @Experimental
   static const EventStreamProvider<SecurityPolicyViolationEvent> securityPolicyViolationEvent = const EventStreamProvider<SecurityPolicyViolationEvent>('securitypolicyviolation');
 
   @DomName('Document.selectionchangeEvent')
@@ -6585,6 +6693,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockchange
   static const EventStreamProvider<Event> pointerLockChangeEvent = const EventStreamProvider<Event>('webkitpointerlockchange');
 
   @DomName('Document.webkitpointerlockerrorEvent')
@@ -6592,6 +6701,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockerror
   static const EventStreamProvider<Event> pointerLockErrorEvent = const EventStreamProvider<Event>('webkitpointerlockerror');
 
   /// Moved to [HtmlDocument].
@@ -6606,10 +6716,12 @@
 
   @DomName('Document.charset')
   @DocsEditable
+  @deprecated // nonstandard
   String get charset native "Document_charset_Getter";
 
   @DomName('Document.charset')
   @DocsEditable
+  @deprecated // nonstandard
   void set charset(String value) native "Document_charset_Setter";
 
   @DomName('Document.cookie')
@@ -6634,6 +6746,8 @@
 
   @DomName('Document.fontloader')
   @DocsEditable
+  // http://www.w3.org/TR/css3-fonts/#document-fontloader
+  @Experimental
   FontLoader get fontloader native "Document_fontloader_Getter";
 
   /// Moved to [HtmlDocument].
@@ -6665,6 +6779,8 @@
 
   @DomName('Document.securityPolicy')
   @DocsEditable
+  // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#idl-def-SecurityPolicy
+  @Experimental
   SecurityPolicy get securityPolicy native "Document_securityPolicy_Getter";
 
   @DomName('Document.selectedStylesheetSet')
@@ -6696,6 +6812,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenelement
   Element get $dom_webkitFullscreenElement native "Document_webkitFullscreenElement_Getter";
 
   /// Moved to [HtmlDocument].
@@ -6704,6 +6821,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenenabled
   bool get $dom_webkitFullscreenEnabled native "Document_webkitFullscreenEnabled_Getter";
 
   /// Moved to [HtmlDocument].
@@ -6712,6 +6830,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#document
   bool get $dom_webkitHidden native "Document_webkitHidden_Getter";
 
   /// Moved to [HtmlDocument].
@@ -6720,6 +6839,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @deprecated // deprecated
   bool get $dom_webkitIsFullScreen native "Document_webkitIsFullScreen_Getter";
 
   /// Moved to [HtmlDocument].
@@ -6728,6 +6849,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-pointerLockElement
   Element get $dom_webkitPointerLockElement native "Document_webkitPointerLockElement_Getter";
 
   @DomName('Document.webkitVisibilityState')
@@ -6735,15 +6857,20 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#dom-document-visibilitystate
   String get $dom_webkitVisibilityState native "Document_webkitVisibilityState_Getter";
 
   /// Use the [Range] constructor instead.
   @DomName('Document.caretRangeFromPoint')
   @DocsEditable
+  // http://www.w3.org/TR/2009/WD-cssom-view-20090804/#dom-documentview-caretrangefrompoint
+  @Experimental
   Range $dom_caretRangeFromPoint(int x, int y) native "Document_caretRangeFromPoint_Callback";
 
   @DomName('Document.createCDATASection')
   @DocsEditable
+  // http://dom.spec.whatwg.org/#dom-document-createcdatasection
+  @deprecated // deprecated
   CDataSection createCDataSection(String data) native "Document_createCDATASection_Callback";
 
   @DomName('Document.createDocumentFragment')
@@ -6784,6 +6911,7 @@
 
   @DomName('Document.createNodeIterator')
   @DocsEditable
+  @Unstable
   NodeIterator $dom_createNodeIterator(Node root, int whatToShow, NodeFilter filter, bool expandEntityReferences) native "Document_createNodeIterator_Callback";
 
   @DomName('Document.createRange')
@@ -6796,11 +6924,15 @@
 
   @DomName('Document.createTouch')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   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";
 
   /// Use the [TouchList] constructor instead.
   @DomName('Document.createTouchList')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   TouchList $dom_createTouchList() native "Document_createTouchList_Callback";
 
   @DomName('Document.createTreeWalker')
@@ -6818,6 +6950,8 @@
   /// Moved to [HtmlDocument].
   @DomName('Document.getCSSCanvasContext')
   @DocsEditable
+  // https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariCSSRef/Articles/Functions.html
+  @Experimental // non-standard
   CanvasRenderingContext $dom_getCssCanvasContext(String contextId, String name, int width, int height) native "Document_getCSSCanvasContext_Callback";
 
   @DomName('Document.getElementById')
@@ -6886,6 +7020,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @deprecated // deprecated
   void $dom_webkitCancelFullScreen() native "Document_webkitCancelFullScreen_Callback";
 
   /// Moved to [HtmlDocument].
@@ -6894,6 +7030,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
   void $dom_webkitExitFullscreen() native "Document_webkitExitFullscreen_Callback";
 
   /// Moved to [HtmlDocument].
@@ -6902,6 +7039,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-exitPointerLock-void
   void $dom_webkitExitPointerLock() native "Document_webkitExitPointerLock_Callback";
 
   @DomName('Document.webkitGetNamedFlows')
@@ -6909,6 +7047,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.w3.org/TR/css3-regions/#dom-named-flow-collection
   NamedFlowCollection getNamedFlows() native "Document_webkitGetNamedFlows_Callback";
 
   @DomName('Document.webkitRegister')
@@ -6916,6 +7055,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html#dfn-document-register
   CustomElementConstructor register(String name, [Map options]) native "Document_webkitRegister_Callback";
 
   @DomName('Document.onabort')
@@ -7064,10 +7204,14 @@
 
   @DomName('Document.onsearch')
   @DocsEditable
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental
   Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
   @DomName('Document.onsecuritypolicyviolation')
   @DocsEditable
+  // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#widl-Document-onsecuritypolicyviolation
+  @Experimental
   Stream<SecurityPolicyViolationEvent> get onSecurityPolicyViolation => securityPolicyViolationEvent.forTarget(this);
 
   @DomName('Document.onselect')
@@ -7088,34 +7232,50 @@
 
   @DomName('Document.ontouchcancel')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
 
   @DomName('Document.ontouchend')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
   @DomName('Document.ontouchmove')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
   @DomName('Document.ontouchstart')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
   @DomName('Document.onwebkitfullscreenchange')
   @DocsEditable
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @Experimental
   Stream<Event> get onFullscreenChange => Element.fullscreenChangeEvent.forTarget(this);
 
   @DomName('Document.onwebkitfullscreenerror')
   @DocsEditable
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @Experimental
   Stream<Event> get onFullscreenError => Element.fullscreenErrorEvent.forTarget(this);
 
   @DomName('Document.onwebkitpointerlockchange')
   @DocsEditable
+  // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockchange
+  @Experimental
   Stream<Event> get onPointerLockChange => pointerLockChangeEvent.forTarget(this);
 
   @DomName('Document.onwebkitpointerlockerror')
   @DocsEditable
+  // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockerror
+  @Experimental
   Stream<Event> get onPointerLockError => pointerLockErrorEvent.forTarget(this);
 
 
@@ -7230,6 +7390,8 @@
 
 @DocsEditable
 @DomName('DocumentType')
+// http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-412266927
+@deprecated // stable
 class DocumentType extends Node {
   DocumentType.internal() : super.internal();
 
@@ -7257,6 +7419,7 @@
 
 
 @DomName('DOMException')
+@Unstable
 class DomException extends NativeFieldWrapperClass1 {
 
   static const String INDEX_SIZE = 'IndexSizeError';
@@ -7310,6 +7473,7 @@
 
   @DomName('DOMImplementation.createCSSStyleSheet')
   @DocsEditable
+  @Experimental // non-standard
   CssStyleSheet createCssStyleSheet(String title, String media) native "DOMImplementation_createCSSStyleSheet_Callback";
 
   @DomName('DOMImplementation.createDocument')
@@ -8356,6 +8520,8 @@
 
   @DomName('Element.mousewheelEvent')
   @DocsEditable
+  // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
+  @Experimental // non-standard
   static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
 
   @DomName('Element.pasteEvent')
@@ -8372,6 +8538,8 @@
 
   @DomName('Element.searchEvent')
   @DocsEditable
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental
   static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
 
   @DomName('Element.selectEvent')
@@ -8380,6 +8548,7 @@
 
   @DomName('Element.selectstartEvent')
   @DocsEditable
+  @Experimental // nonstandard
   static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
 
   @DomName('Element.submitEvent')
@@ -8388,26 +8557,38 @@
 
   @DomName('Element.touchcancelEvent')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   static const EventStreamProvider<TouchEvent> touchCancelEvent = const EventStreamProvider<TouchEvent>('touchcancel');
 
   @DomName('Element.touchendEvent')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   static const EventStreamProvider<TouchEvent> touchEndEvent = const EventStreamProvider<TouchEvent>('touchend');
 
   @DomName('Element.touchenterEvent')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   static const EventStreamProvider<TouchEvent> touchEnterEvent = const EventStreamProvider<TouchEvent>('touchenter');
 
   @DomName('Element.touchleaveEvent')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   static const EventStreamProvider<TouchEvent> touchLeaveEvent = const EventStreamProvider<TouchEvent>('touchleave');
 
   @DomName('Element.touchmoveEvent')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   static const EventStreamProvider<TouchEvent> touchMoveEvent = const EventStreamProvider<TouchEvent>('touchmove');
 
   @DomName('Element.touchstartEvent')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   static const EventStreamProvider<TouchEvent> touchStartEvent = const EventStreamProvider<TouchEvent>('touchstart');
 
   @DomName('Element.webkitTransitionEndEvent')
@@ -8415,6 +8596,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @deprecated
   static const EventStreamProvider<TransitionEvent> transitionEndEvent = const EventStreamProvider<TransitionEvent>('webkitTransitionEnd');
 
   @DomName('Element.webkitfullscreenchangeEvent')
@@ -8422,6 +8604,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   static const EventStreamProvider<Event> fullscreenChangeEvent = const EventStreamProvider<Event>('webkitfullscreenchange');
 
   @DomName('Element.webkitfullscreenerrorEvent')
@@ -8429,6 +8612,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   static const EventStreamProvider<Event> fullscreenErrorEvent = const EventStreamProvider<Event>('webkitfullscreenerror');
 
   HtmlCollection get $dom_children;
@@ -8471,6 +8655,8 @@
 
   @DomName('Element.ALLOW_KEYBOARD_INPUT')
   @DocsEditable
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-element-requestfullscreen
+  @deprecated // deprecated
   static const int ALLOW_KEYBOARD_INPUT = 1;
 
   @DomName('Element.attributes')
@@ -8578,6 +8764,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://www.w3.org/Bugs/Public/show_bug.cgi?id=21067
   Node get insertionParent native "Element_webkitInsertionParent_Getter";
 
   @DomName('Element.webkitPseudo')
@@ -8585,6 +8772,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // nonstandard
   String get pseudo native "Element_webkitPseudo_Getter";
 
   @DomName('Element.webkitPseudo')
@@ -8592,6 +8780,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // nonstandard
   void set pseudo(String value) native "Element_webkitPseudo_Setter";
 
   @DomName('Element.webkitRegionOverset')
@@ -8599,6 +8788,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://dev.w3.org/csswg/css-regions/#dom-region-regionoverset
   String get regionOverset native "Element_webkitRegionOverset_Getter";
 
   @DomName('Element.webkitShadowRoot')
@@ -8606,6 +8796,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
   ShadowRoot get shadowRoot native "Element_webkitShadowRoot_Getter";
 
   @DomName('Element.blur')
@@ -8731,6 +8922,7 @@
   @DocsEditable
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
   @Experimental
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
   ShadowRoot createShadowRoot() native "Element_webkitCreateShadowRoot_Callback";
 
   @DomName('Element.webkitGetRegionFlowRanges')
@@ -8738,11 +8930,14 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://dev.w3.org/csswg/css-regions/#dom-region-getregionflowranges
   List<Range> getRegionFlowRanges() native "Element_webkitGetRegionFlowRanges_Callback";
 
   @DomName('Element.webkitMatchesSelector')
   @DocsEditable
   @Experimental()
+  // http://dev.w3.org/2006/webapi/selectors-api2/#matches
+  @Experimental
   bool matches(String selectors) native "Element_webkitMatchesSelector_Callback";
 
   @DomName('Element.webkitRequestFullScreen')
@@ -8750,6 +8945,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-element-requestfullscreen
+  @deprecated // deprecated
   void requestFullScreen(int flags) native "Element_webkitRequestFullScreen_Callback";
 
   @DomName('Element.webkitRequestFullscreen')
@@ -8757,6 +8954,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-element-requestfullscreen
   void requestFullscreen() native "Element_webkitRequestFullscreen_Callback";
 
   @DomName('Element.webkitRequestPointerLock')
@@ -8764,6 +8962,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Element-requestPointerLock-void
   void requestPointerLock() native "Element_webkitRequestPointerLock_Callback";
 
   @DomName('Element.onabort')
@@ -8892,6 +9091,8 @@
 
   @DomName('Element.onmousewheel')
   @DocsEditable
+  // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
+  @Experimental // non-standard
   Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
 
   @DomName('Element.onpaste')
@@ -8908,6 +9109,8 @@
 
   @DomName('Element.onsearch')
   @DocsEditable
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental
   Stream<Event> get onSearch => searchEvent.forTarget(this);
 
   @DomName('Element.onselect')
@@ -8916,6 +9119,7 @@
 
   @DomName('Element.onselectstart')
   @DocsEditable
+  @Experimental // nonstandard
   Stream<Event> get onSelectStart => selectStartEvent.forTarget(this);
 
   @DomName('Element.onsubmit')
@@ -8924,26 +9128,38 @@
 
   @DomName('Element.ontouchcancel')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchCancel => touchCancelEvent.forTarget(this);
 
   @DomName('Element.ontouchend')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchEnd => touchEndEvent.forTarget(this);
 
   @DomName('Element.ontouchenter')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchEnter => touchEnterEvent.forTarget(this);
 
   @DomName('Element.ontouchleave')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchLeave => touchLeaveEvent.forTarget(this);
 
   @DomName('Element.ontouchmove')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchMove => touchMoveEvent.forTarget(this);
 
   @DomName('Element.ontouchstart')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchStart => touchStartEvent.forTarget(this);
 
   @DomName('Element.onwebkitTransitionEnd')
@@ -8952,14 +9168,19 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
+  @deprecated
   Stream<TransitionEvent> get onTransitionEnd => transitionEndEvent.forTarget(this);
 
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @Experimental
   Stream<Event> get onFullscreenChange => fullscreenChangeEvent.forTarget(this);
 
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @Experimental
   Stream<Event> get onFullscreenError => fullscreenErrorEvent.forTarget(this);
 
 }
@@ -9109,6 +9330,7 @@
 
 @DocsEditable
 @DomName('ElementTraversal')
+@Unstable
 class ElementTraversal extends NativeFieldWrapperClass1 {
   ElementTraversal.internal();
 
@@ -9145,6 +9367,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class EmbedElement extends _Element_Merged {
   EmbedElement.internal() : super.internal();
 
@@ -9157,10 +9380,14 @@
 
   @DomName('HTMLEmbedElement.align')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLEmbedElement-partial
+  @deprecated // deprecated
   String get align native "HTMLEmbedElement_align_Getter";
 
   @DomName('HTMLEmbedElement.align')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLEmbedElement-partial
+  @deprecated // deprecated
   void set align(String value) native "HTMLEmbedElement_align_Setter";
 
   @DomName('HTMLEmbedElement.height')
@@ -9211,6 +9438,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('EntriesCallback')
+// http://www.w3.org/TR/file-system-api/#the-entriescallback-interface
+@Experimental
 typedef void _EntriesCallback(List<Entry> entries);
 // 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
@@ -9221,6 +9451,8 @@
 
 @DocsEditable
 @DomName('Entry')
+// http://www.w3.org/TR/file-system-api/#the-entry-interface
+@Experimental
 class Entry extends NativeFieldWrapperClass1 {
   Entry.internal();
 
@@ -9334,6 +9566,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('EntryCallback')
+// http://www.w3.org/TR/file-system-api/#the-entrycallback-interface
+@Experimental
 typedef void _EntryCallback(Entry entry);
 // 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
@@ -9342,6 +9577,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('ErrorCallback')
+// http://www.w3.org/TR/file-system-api/#the-errorcallback-interface
+@Experimental
 typedef void _ErrorCallback(FileError 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
@@ -9352,6 +9590,7 @@
 
 @DocsEditable
 @DomName('ErrorEvent')
+@Unstable
 class ErrorEvent extends Event {
   ErrorEvent.internal() : super.internal();
 
@@ -9411,6 +9650,8 @@
 
   @DomName('Event.BLUR')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int BLUR = 8192;
 
   @DomName('Event.BUBBLING_PHASE')
@@ -9423,66 +9664,98 @@
 
   @DomName('Event.CHANGE')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int CHANGE = 32768;
 
   @DomName('Event.CLICK')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int CLICK = 64;
 
   @DomName('Event.DBLCLICK')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int DBLCLICK = 128;
 
   @DomName('Event.DRAGDROP')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int DRAGDROP = 2048;
 
   @DomName('Event.FOCUS')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int FOCUS = 4096;
 
   @DomName('Event.KEYDOWN')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int KEYDOWN = 256;
 
   @DomName('Event.KEYPRESS')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int KEYPRESS = 1024;
 
   @DomName('Event.KEYUP')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int KEYUP = 512;
 
   @DomName('Event.MOUSEDOWN')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int MOUSEDOWN = 1;
 
   @DomName('Event.MOUSEDRAG')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int MOUSEDRAG = 32;
 
   @DomName('Event.MOUSEMOVE')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int MOUSEMOVE = 16;
 
   @DomName('Event.MOUSEOUT')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int MOUSEOUT = 8;
 
   @DomName('Event.MOUSEOVER')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int MOUSEOVER = 4;
 
   @DomName('Event.MOUSEUP')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int MOUSEUP = 2;
 
   @DomName('Event.NONE')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int NONE = 0;
 
   @DomName('Event.SELECT')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents
+  @deprecated // deprecated
   static const int SELECT = 16384;
 
   @DomName('Event.bubbles')
@@ -9491,10 +9764,14 @@
 
   @DomName('Event.cancelBubble')
   @DocsEditable
+  // http://www.w3.org/TR/DOM-Level-3-Events/#events-event-type-stopPropagation
+  @deprecated // deprecated
   bool get cancelBubble native "Event_cancelBubble_Getter";
 
   @DomName('Event.cancelBubble')
   @DocsEditable
+  // http://www.w3.org/TR/DOM-Level-3-Events/#events-event-type-stopPropagation
+  @deprecated // deprecated
   void set cancelBubble(bool value) native "Event_cancelBubble_Setter";
 
   @DomName('Event.cancelable')
@@ -9506,6 +9783,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // Part of copy/paste
+  @Experimental // nonstandard
   DataTransfer get clipboardData native "Event_clipboardData_Getter";
 
   @DomName('Event.currentTarget')
@@ -9558,6 +9837,7 @@
 
 @DocsEditable
 @DomName('EventException')
+@Unstable
 class EventException extends NativeFieldWrapperClass1 {
   EventException.internal();
 
@@ -9575,10 +9855,12 @@
 
   @DomName('EventException.message')
   @DocsEditable
+  @deprecated // nonstandard
   String get message native "EventException_message_Getter";
 
   @DomName('EventException.name')
   @DocsEditable
+  @deprecated // nonstandard
   String get name native "EventException_name_Getter";
 
   @DomName('EventException.toString')
@@ -9592,6 +9874,8 @@
 
 
 @DomName('EventSource')
+// http://www.w3.org/TR/eventsource/#the-eventsource-interface
+@Experimental // stable
 class EventSource extends EventTarget {
   factory EventSource(String title, {withCredentials: false}) {
     var parsedOptions = {
@@ -9766,6 +10050,7 @@
 
 @DocsEditable
 @DomName('HTMLFieldSetElement')
+@Unstable
 class FieldSetElement extends _Element_Merged {
   FieldSetElement.internal() : super.internal();
 
@@ -9847,6 +10132,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
   String get relativePath native "File_webkitRelativePath_Getter";
 
 }
@@ -9857,6 +10143,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('FileCallback')
+// http://www.w3.org/TR/file-system-api/#the-filecallback-interface
+@Experimental
 typedef void _FileCallback(File file);
 // 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
@@ -9867,6 +10156,8 @@
 
 @DocsEditable
 @DomName('FileEntry')
+// http://www.w3.org/TR/file-system-api/#the-fileentry-interface
+@Experimental
 class FileEntry extends Entry {
   FileEntry.internal() : super.internal();
 
@@ -9904,6 +10195,8 @@
 
 @DocsEditable
 @DomName('FileError')
+// http://dev.w3.org/2009/dap/file-system/pub/FileSystem/
+@Experimental
 class FileError extends NativeFieldWrapperClass1 {
   FileError.internal();
 
@@ -9969,6 +10262,8 @@
 
 @DocsEditable
 @DomName('FileException')
+// http://dev.w3.org/2009/dap/file-system/pub/FileSystem/
+@Experimental
 class FileException extends NativeFieldWrapperClass1 {
   FileException.internal();
 
@@ -10190,6 +10485,8 @@
 
   @DomName('FileReader.readAsBinaryString')
   @DocsEditable
+  // http://blog.whatwg.org/weekly-stream-autocomplete
+  @deprecated // deprecated
   void readAsBinaryString(Blob blob) native "FileReader_readAsBinaryString_Callback";
 
   @DomName('FileReader.readAsDataURL')
@@ -10249,6 +10546,7 @@
 @DomName('DOMFileSystem')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://www.w3.org/TR/file-system-api/
 class FileSystem extends NativeFieldWrapperClass1 {
   FileSystem.internal();
 
@@ -10271,6 +10569,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('FileSystemCallback')
+// http://www.w3.org/TR/file-system-api/#the-filesystemcallback-interface
+@Experimental
 typedef void _FileSystemCallback(FileSystem fileSystem);
 // 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
@@ -10281,6 +10582,8 @@
 
 @DocsEditable
 @DomName('FileWriter')
+// http://www.w3.org/TR/file-writer-api/#the-filewriter-interface
+@Experimental
 class FileWriter extends EventTarget {
   FileWriter.internal() : super.internal();
 
@@ -10396,6 +10699,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('FileWriterCallback')
+// http://www.w3.org/TR/file-writer-api/#idl-def-FileWriter
+@Experimental
 typedef void _FileWriterCallback(FileWriter fileWriter);
 // 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
@@ -10423,6 +10729,8 @@
 
 @DocsEditable
 @DomName('FontLoader')
+// http://www.w3.org/TR/css3-fonts/#document-fontloader
+@Experimental
 class FontLoader extends EventTarget {
   FontLoader.internal() : super.internal();
 
@@ -10537,10 +10845,14 @@
 
   @DomName('HTMLFormElement.autocompleteEvent')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
+  @Experimental
   static const EventStreamProvider<Event> autocompleteEvent = const EventStreamProvider<Event>('autocomplete');
 
   @DomName('HTMLFormElement.autocompleteerrorEvent')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
+  @Experimental
   static const EventStreamProvider<AutocompleteErrorEvent> autocompleteErrorEvent = const EventStreamProvider<AutocompleteErrorEvent>('autocompleteerror');
 
   @DomName('HTMLFormElement.HTMLFormElement')
@@ -10565,10 +10877,14 @@
 
   @DomName('HTMLFormElement.autocomplete')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
+  @Experimental
   String get autocomplete native "HTMLFormElement_autocomplete_Getter";
 
   @DomName('HTMLFormElement.autocomplete')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
+  @Experimental
   void set autocomplete(String value) native "HTMLFormElement_autocomplete_Setter";
 
   @DomName('HTMLFormElement.encoding')
@@ -10629,6 +10945,8 @@
 
   @DomName('HTMLFormElement.requestAutocomplete')
   @DocsEditable
+  // http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-October/037711.html
+  @Experimental
   void requestAutocomplete() native "HTMLFormElement_requestAutocomplete_Callback";
 
   @DomName('HTMLFormElement.reset')
@@ -10641,10 +10959,14 @@
 
   @DomName('HTMLFormElement.onautocomplete')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
+  @Experimental
   Stream<Event> get onAutocomplete => autocompleteEvent.forTarget(this);
 
   @DomName('HTMLFormElement.onautocompleteerror')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
+  @Experimental
   Stream<AutocompleteErrorEvent> get onAutocompleteError => autocompleteErrorEvent.forTarget(this);
 
 }
@@ -10657,6 +10979,8 @@
 
 @DocsEditable
 @DomName('Gamepad')
+// https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#gamepad-interface
+@Experimental
 class Gamepad extends NativeFieldWrapperClass1 {
   Gamepad.internal();
 
@@ -10688,6 +11012,7 @@
 
 @DocsEditable
 @DomName('Geolocation')
+@Unstable
 class Geolocation extends NativeFieldWrapperClass1 {
 
   @DomName('Geolocation.getCurrentPosition')
@@ -10786,6 +11111,7 @@
 
 @DocsEditable
 @DomName('Geoposition')
+@Unstable
 class Geoposition extends NativeFieldWrapperClass1 {
   Geoposition.internal();
 
@@ -10828,6 +11154,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 
 class HashChangeEvent extends Event {
   factory HashChangeEvent(String type,
@@ -10974,6 +11301,8 @@
 
 @DocsEditable
 @DomName('HTMLAllCollection')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dom-document-all
+@deprecated // deprecated
 class HtmlAllCollection extends NativeFieldWrapperClass1 with ListMixin<Node>, ImmutableListMixin<Node> implements List<Node> {
   HtmlAllCollection.internal();
 
@@ -11673,6 +12002,7 @@
    */
   @DomName('XMLHttpRequest.upload')
   @DocsEditable
+  @Unstable
   HttpRequestUpload get upload native "XMLHttpRequest_upload_Getter";
 
   /**
@@ -11726,6 +12056,7 @@
    */
   @DomName('XMLHttpRequest.getAllResponseHeaders')
   @DocsEditable
+  @Unstable
   String getAllResponseHeaders() native "XMLHttpRequest_getAllResponseHeaders_Callback";
 
   /**
@@ -11736,6 +12067,7 @@
    */
   @DomName('XMLHttpRequest.getResponseHeader')
   @DocsEditable
+  @Unstable
   String getResponseHeader(String header) native "XMLHttpRequest_getResponseHeader_Callback";
 
   /**
@@ -11866,6 +12198,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+@Experimental // nonstandard
 class HttpRequestProgressEvent extends ProgressEvent {
   HttpRequestProgressEvent.internal() : super.internal();
 
@@ -11890,6 +12223,8 @@
 
 @DocsEditable
 @DomName('XMLHttpRequestUpload')
+// http://xhr.spec.whatwg.org/#xmlhttprequestupload
+@Experimental
 class HttpRequestUpload extends EventTarget {
   HttpRequestUpload.internal() : super.internal();
 
@@ -12091,10 +12426,12 @@
 
   @DomName('HTMLImageElement.border')
   @DocsEditable
+  @deprecated // deprecated
   String get border native "HTMLImageElement_border_Getter";
 
   @DomName('HTMLImageElement.border')
   @DocsEditable
+  @deprecated // deprecated
   void set border(String value) native "HTMLImageElement_border_Setter";
 
   @DomName('HTMLImageElement.complete')
@@ -12127,10 +12464,12 @@
 
   @DomName('HTMLImageElement.lowsrc')
   @DocsEditable
+  @deprecated // deprecated
   String get lowsrc native "HTMLImageElement_lowsrc_Getter";
 
   @DomName('HTMLImageElement.lowsrc')
   @DocsEditable
+  @deprecated // deprecated
   void set lowsrc(String value) native "HTMLImageElement_lowsrc_Setter";
 
   @DomName('HTMLImageElement.naturalHeight')
@@ -12167,10 +12506,12 @@
 
   @DomName('HTMLImageElement.x')
   @DocsEditable
+  @deprecated // deprecated
   int get x native "HTMLImageElement_x_Getter";
 
   @DomName('HTMLImageElement.y')
   @DocsEditable
+  @deprecated // deprecated
   int get y native "HTMLImageElement_y_Getter";
 
 }
@@ -12275,6 +12616,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#extending_html_elements
   static const EventStreamProvider<Event> speechChangeEvent = const EventStreamProvider<Event>('webkitSpeechChange');
 
   @DomName('HTMLInputElement.accept')
@@ -12411,10 +12753,14 @@
 
   @DomName('HTMLInputElement.incremental')
   @DocsEditable
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental
   bool get incremental native "HTMLInputElement_incremental_Getter";
 
   @DomName('HTMLInputElement.incremental')
   @DocsEditable
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental
   void set incremental(bool value) native "HTMLInputElement_incremental_Setter";
 
   @DomName('HTMLInputElement.indeterminate')
@@ -12563,10 +12909,14 @@
 
   @DomName('HTMLInputElement.useMap')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLInputElement-partial
+  @deprecated // deprecated
   String get useMap native "HTMLInputElement_useMap_Getter";
 
   @DomName('HTMLInputElement.useMap')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLInputElement-partial
+  @deprecated // deprecated
   void set useMap(String value) native "HTMLInputElement_useMap_Setter";
 
   @DomName('HTMLInputElement.validationMessage')
@@ -12606,6 +12956,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#concept-input-type-file-selected
   List<Entry> get entries native "HTMLInputElement_webkitEntries_Getter";
 
   @DomName('HTMLInputElement.webkitGrammar')
@@ -12613,6 +12964,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#attrib-grammar
   bool get grammar native "HTMLInputElement_webkitGrammar_Getter";
 
   @DomName('HTMLInputElement.webkitGrammar')
@@ -12620,6 +12972,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#attrib-grammar
   void set grammar(bool value) native "HTMLInputElement_webkitGrammar_Setter";
 
   @DomName('HTMLInputElement.webkitSpeech')
@@ -12627,6 +12980,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#attrib-speech
   bool get speech native "HTMLInputElement_webkitSpeech_Getter";
 
   @DomName('HTMLInputElement.webkitSpeech')
@@ -12634,6 +12988,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#attrib-speech
   void set speech(bool value) native "HTMLInputElement_webkitSpeech_Setter";
 
   @DomName('HTMLInputElement.webkitdirectory')
@@ -12641,6 +12996,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
   bool get directory native "HTMLInputElement_webkitdirectory_Getter";
 
   @DomName('HTMLInputElement.webkitdirectory')
@@ -12648,6 +13004,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
   void set directory(bool value) native "HTMLInputElement_webkitdirectory_Setter";
 
   @DomName('HTMLInputElement.width')
@@ -12722,6 +13079,8 @@
 
   @DomName('HTMLInputElement.onwebkitSpeechChange')
   @DocsEditable
+  // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#extending_html_elements
+  @Experimental
   Stream<Event> get onSpeechChange => speechChangeEvent.forTarget(this);
 
 }
@@ -13290,39 +13649,48 @@
 
 @DocsEditable
 @DomName('InputMethodContext')
+@Experimental // untriaged
 class InputMethodContext extends NativeFieldWrapperClass1 {
   InputMethodContext.internal();
 
   @DomName('InputMethodContext.composition')
   @DocsEditable
+  @Experimental // untriaged
   Composition get composition native "InputMethodContext_composition_Getter";
 
   @DomName('InputMethodContext.enabled')
   @DocsEditable
+  @Experimental // untriaged
   bool get enabled native "InputMethodContext_enabled_Getter";
 
   @DomName('InputMethodContext.enabled')
   @DocsEditable
+  @Experimental // untriaged
   void set enabled(bool value) native "InputMethodContext_enabled_Setter";
 
   @DomName('InputMethodContext.locale')
   @DocsEditable
+  @Experimental // untriaged
   String get locale native "InputMethodContext_locale_Getter";
 
   @DomName('InputMethodContext.confirmComposition')
   @DocsEditable
+  @Experimental // untriaged
   void confirmComposition() native "InputMethodContext_confirmComposition_Callback";
 
   @DomName('InputMethodContext.open')
   @DocsEditable
+  @Experimental // untriaged
   bool open() native "InputMethodContext_open_Callback";
 
   @DomName('InputMethodContext.setCaretRectangle')
   @DocsEditable
+  @Experimental // untriaged
   void setCaretRectangle(Node anchor, int x, int y, int w, int h) native "InputMethodContext_setCaretRectangle_Callback";
 
   @DomName('InputMethodContext.setExclusionRectangle')
   @DocsEditable
+  @Experimental // untriaged
   void setExclusionRectangle(Node anchor, int x, int y, int w, int h) native "InputMethodContext_setExclusionRectangle_Callback";
 
 }
@@ -13357,6 +13725,7 @@
 
   @DomName('KeyboardEvent.altGraphKey')
   @DocsEditable
+  @Experimental // nonstandard
   bool get altGraphKey native "KeyboardEvent_altGraphKey_Getter";
 
   @DomName('KeyboardEvent.altKey')
@@ -13369,10 +13738,12 @@
 
   @DomName('KeyboardEvent.keyIdentifier')
   @DocsEditable
+  @Experimental // nonstandard
   String get $dom_keyIdentifier native "KeyboardEvent_keyIdentifier_Getter";
 
   @DomName('KeyboardEvent.keyLocation')
   @DocsEditable
+  @Experimental // nonstandard
   int get keyLocation native "KeyboardEvent_keyLocation_Getter";
 
   @DomName('KeyboardEvent.metaKey')
@@ -13400,6 +13771,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#the-keygen-element
 class KeygenElement extends _Element_Merged {
   KeygenElement.internal() : super.internal();
 
@@ -13448,6 +13820,7 @@
 
   @DomName('HTMLKeygenElement.labels')
   @DocsEditable
+  @Unstable
   List<Node> get labels native "HTMLKeygenElement_labels_Getter";
 
   @DomName('HTMLKeygenElement.name')
@@ -13501,10 +13874,14 @@
 
   @DomName('HTMLLIElement.type')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLLIElement-partial
+  @deprecated // deprecated
   String get type native "HTMLLIElement_type_Getter";
 
   @DomName('HTMLLIElement.type')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLLIElement-partial
+  @deprecated // deprecated
   void set type(String value) native "HTMLLIElement_type_Setter";
 
   @DomName('HTMLLIElement.value')
@@ -13659,6 +14036,7 @@
 
   @DomName('Location.ancestorOrigins')
   @DocsEditable
+  @Experimental // nonstandard
   List<String> get ancestorOrigins native "Location_ancestorOrigins_Getter";
 
   @DomName('Location.hash')
@@ -13695,6 +14073,8 @@
 
   @DomName('Location.origin')
   @DocsEditable
+  // http://url.spec.whatwg.org/#urlutils Webkit Only
+  @Experimental // non-standard
   String get origin native "Location_origin_Getter";
 
   @DomName('Location.pathname')
@@ -13747,6 +14127,7 @@
 
   @DomName('Location.valueOf')
   @DocsEditable
+  @Experimental // nonstandard
   Object valueOf() native "Location_valueOf_Callback";
 
 
@@ -13758,6 +14139,8 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('MIDIErrorCallback')
+@Experimental // untriaged
 typedef void MidiErrorCallback(DomError 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
@@ -13797,6 +14180,8 @@
 
 @DocsEditable
 @DomName('MediaController')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#mediacontroller
+@Experimental
 class MediaController extends EventTarget {
   MediaController.internal() : super.internal();
 
@@ -13907,6 +14292,7 @@
 
 @DocsEditable
 @DomName('HTMLMediaElement')
+@Unstable
 class MediaElement extends _Element_Merged {
   MediaElement.internal() : super.internal();
 
@@ -13972,6 +14358,8 @@
 
   @DomName('HTMLMediaElement.showEvent')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
+  @Experimental
   static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');
 
   @DomName('HTMLMediaElement.stalledEvent')
@@ -13999,6 +14387,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyAddedEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyadded');
 
   @DomName('HTMLMediaElement.webkitkeyerrorEvent')
@@ -14006,6 +14395,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyErrorEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyerror');
 
   @DomName('HTMLMediaElement.webkitkeymessageEvent')
@@ -14013,6 +14403,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyMessageEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeymessage');
 
   @DomName('HTMLMediaElement.webkitneedkeyEvent')
@@ -14020,6 +14411,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> needKeyEvent = const EventStreamProvider<MediaKeyEvent>('webkitneedkey');
 
   @DomName('HTMLMediaElement.HAVE_CURRENT_DATA')
@@ -14128,6 +14520,8 @@
 
   @DomName('HTMLMediaElement.initialTime')
   @DocsEditable
+  // http://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-media-initialtime
+  @Experimental
   num get initialTime native "HTMLMediaElement_initialTime_Getter";
 
   @DomName('HTMLMediaElement.loop')
@@ -14204,10 +14598,13 @@
 
   @DomName('HTMLMediaElement.startTime')
   @DocsEditable
+  @Experimental // non-standard
   num get startTime native "HTMLMediaElement_startTime_Getter";
 
   @DomName('HTMLMediaElement.textTracks')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-media-texttracks
+  @Experimental
   TextTrackList get textTracks native "HTMLMediaElement_textTracks_Getter";
 
   @DomName('HTMLMediaElement.volume')
@@ -14223,6 +14620,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // nonstandard
   int get audioDecodedByteCount native "HTMLMediaElement_webkitAudioDecodedByteCount_Getter";
 
   @DomName('HTMLMediaElement.webkitClosedCaptionsVisible')
@@ -14230,6 +14628,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // nonstandard
   bool get closedCaptionsVisible native "HTMLMediaElement_webkitClosedCaptionsVisible_Getter";
 
   @DomName('HTMLMediaElement.webkitClosedCaptionsVisible')
@@ -14237,6 +14636,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // nonstandard
   void set closedCaptionsVisible(bool value) native "HTMLMediaElement_webkitClosedCaptionsVisible_Setter";
 
   @DomName('HTMLMediaElement.webkitHasClosedCaptions')
@@ -14244,6 +14644,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // nonstandard
   bool get hasClosedCaptions native "HTMLMediaElement_webkitHasClosedCaptions_Getter";
 
   @DomName('HTMLMediaElement.webkitPreservesPitch')
@@ -14251,6 +14652,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // nonstandard
   bool get preservesPitch native "HTMLMediaElement_webkitPreservesPitch_Getter";
 
   @DomName('HTMLMediaElement.webkitPreservesPitch')
@@ -14258,6 +14660,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // nonstandard
   void set preservesPitch(bool value) native "HTMLMediaElement_webkitPreservesPitch_Setter";
 
   @DomName('HTMLMediaElement.webkitVideoDecodedByteCount')
@@ -14265,6 +14668,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // nonstandard
   int get videoDecodedByteCount native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";
 
   TextTrack addTextTrack(String kind, [String label, String language]) {
@@ -14317,6 +14721,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
   void cancelKeyRequest(String keySystem, String sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
 
   void generateKeyRequest(String keySystem, [Uint8List initData]) {
@@ -14394,6 +14799,8 @@
 
   @DomName('HTMLMediaElement.onshow')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
+  @Experimental
   Stream<Event> get onShow => showEvent.forTarget(this);
 
   @DomName('HTMLMediaElement.onstalled')
@@ -14418,18 +14825,26 @@
 
   @DomName('HTMLMediaElement.onwebkitkeyadded')
   @DocsEditable
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
+  @Experimental
   Stream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forTarget(this);
 
   @DomName('HTMLMediaElement.onwebkitkeyerror')
   @DocsEditable
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
+  @Experimental
   Stream<MediaKeyEvent> get onKeyError => keyErrorEvent.forTarget(this);
 
   @DomName('HTMLMediaElement.onwebkitkeymessage')
   @DocsEditable
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
+  @Experimental
   Stream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.forTarget(this);
 
   @DomName('HTMLMediaElement.onwebkitneedkey')
   @DocsEditable
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
+  @Experimental
   Stream<MediaKeyEvent> get onNeedKey => needKeyEvent.forTarget(this);
 
 }
@@ -14442,6 +14857,7 @@
 
 @DocsEditable
 @DomName('MediaError')
+@Unstable
 class MediaError extends NativeFieldWrapperClass1 {
   MediaError.internal();
 
@@ -14455,6 +14871,8 @@
 
   @DomName('MediaError.MEDIA_ERR_ENCRYPTED')
   @DocsEditable
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#error-codes
+  @Experimental
   static const int MEDIA_ERR_ENCRYPTED = 5;
 
   @DomName('MediaError.MEDIA_ERR_NETWORK')
@@ -14479,6 +14897,8 @@
 
 @DocsEditable
 @DomName('MediaKeyError')
+// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#error-codes
+@Experimental
 class MediaKeyError extends NativeFieldWrapperClass1 {
   MediaKeyError.internal();
 
@@ -14520,6 +14940,8 @@
 
 @DocsEditable
 @DomName('MediaKeyEvent')
+// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#event-definitions
+@Experimental
 class MediaKeyEvent extends Event {
   MediaKeyEvent.internal() : super.internal();
 
@@ -14561,6 +14983,7 @@
 
 @DocsEditable
 @DomName('MediaList')
+@Unstable
 class MediaList extends NativeFieldWrapperClass1 {
   MediaList.internal();
 
@@ -14598,6 +15021,7 @@
 
 @DocsEditable
 @DomName('MediaQueryList')
+@Unstable
 class MediaQueryList extends NativeFieldWrapperClass1 {
   MediaQueryList.internal();
 
@@ -14627,6 +15051,7 @@
 
 @DocsEditable
 @DomName('MediaQueryListListener')
+@Unstable
 class MediaQueryListListener extends NativeFieldWrapperClass1 {
   MediaQueryListListener.internal();
 
@@ -14644,6 +15069,8 @@
 
 @DocsEditable
 @DomName('MediaSource')
+// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#mediasource
+@Experimental
 class MediaSource extends EventTarget {
   MediaSource.internal() : super.internal();
 
@@ -14713,6 +15140,7 @@
 @DomName('MediaStream')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastream
 class MediaStream extends EventTarget {
   MediaStream.internal() : super.internal();
 
@@ -14762,6 +15190,7 @@
 
   @DomName('MediaStream.label')
   @DocsEditable
+  @Experimental // non-standard
   String get label native "MediaStream_label_Getter";
 
   @DomName('MediaStream.addEventListener')
@@ -14798,6 +15227,7 @@
 
   @DomName('MediaStream.stop')
   @DocsEditable
+  @Experimental // untriaged
   void stop() native "MediaStream_stop_Callback";
 
   @DomName('MediaStream.onaddtrack')
@@ -14833,6 +15263,7 @@
 @DomName('MediaStreamEvent')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://dev.w3.org/2011/webrtc/editor/getusermedia.html
 class MediaStreamEvent extends Event {
   MediaStreamEvent.internal() : super.internal();
 
@@ -14855,6 +15286,7 @@
 @DomName('MediaStreamTrack')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastreamtrack
 class MediaStreamTrack extends EventTarget {
   MediaStreamTrack.internal() : super.internal();
 
@@ -14930,6 +15362,7 @@
 @DomName('MediaStreamTrackEvent')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://dev.w3.org/2011/webrtc/editor/getusermedia.html
 class MediaStreamTrackEvent extends Event {
   MediaStreamTrackEvent.internal() : super.internal();
 
@@ -14950,6 +15383,7 @@
 
 @DocsEditable
 @DomName('MemoryInfo')
+@Experimental // nonstandard
 class MemoryInfo extends NativeFieldWrapperClass1 {
   MemoryInfo.internal();
 
@@ -15002,6 +15436,7 @@
 
 @DocsEditable
 @DomName('MessageChannel')
+@Unstable
 class MessageChannel extends NativeFieldWrapperClass1 {
   MessageChannel.internal();
   factory MessageChannel() => _create();
@@ -15047,6 +15482,7 @@
 
   @DomName('MessageEvent.lastEventId')
   @DocsEditable
+  @Unstable
   String get lastEventId native "MessageEvent_lastEventId_Getter";
 
   @DomName('MessageEvent.origin')
@@ -15055,6 +15491,7 @@
 
   @DomName('MessageEvent.ports')
   @DocsEditable
+  @Unstable
   List get ports native "MessageEvent_ports_Getter";
 
   @DomName('MessageEvent.source')
@@ -15075,6 +15512,7 @@
 
 @DocsEditable
 @DomName('MessagePort')
+@Unstable
 class MessagePort extends EventTarget {
   MessagePort.internal() : super.internal();
 
@@ -15157,6 +15595,8 @@
 
 @DocsEditable
 @DomName('Metadata')
+// http://www.w3.org/TR/file-system-api/#the-metadata-interface
+@Experimental
 class Metadata extends NativeFieldWrapperClass1 {
   Metadata.internal();
 
@@ -15176,6 +15616,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('MetadataCallback')
+// http://www.w3.org/TR/file-system-api/#idl-def-MetadataCallback
+@Experimental
 typedef void MetadataCallback(Metadata metadata);
 // 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
@@ -15189,6 +15632,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class MeterElement extends _Element_Merged {
   MeterElement.internal() : super.internal();
 
@@ -15209,6 +15653,7 @@
 
   @DomName('HTMLMeterElement.labels')
   @DocsEditable
+  @Unstable
   List<Node> get labels native "HTMLMeterElement_labels_Getter";
 
   @DomName('HTMLMeterElement.low')
@@ -15261,11 +15706,13 @@
 
 @DocsEditable
 @DomName('MIDIConnectionEvent')
+@Experimental // untriaged
 class MidiConnectionEvent extends Event {
   MidiConnectionEvent.internal() : super.internal();
 
   @DomName('MIDIConnectionEvent.port')
   @DocsEditable
+  @Experimental // untriaged
   MidiPort get port native "MIDIConnectionEvent_port_Getter";
 
 }
@@ -15278,6 +15725,7 @@
 
 @DocsEditable
 @DomName('MIDIInput')
+@Experimental // untriaged
 class MidiInput extends MidiPort implements EventTarget {
   MidiInput.internal() : super.internal();
 
@@ -15291,15 +15739,18 @@
 
 @DocsEditable
 @DomName('MIDIMessageEvent')
+@Experimental // untriaged
 class MidiMessageEvent extends Event {
   MidiMessageEvent.internal() : super.internal();
 
   @DomName('MIDIMessageEvent.data')
   @DocsEditable
+  @Experimental // untriaged
   Uint8List get data native "MIDIMessageEvent_data_Getter";
 
   @DomName('MIDIMessageEvent.receivedTime')
   @DocsEditable
+  @Experimental // untriaged
   num get receivedTime native "MIDIMessageEvent_receivedTime_Getter";
 
 }
@@ -15312,47 +15763,58 @@
 
 @DocsEditable
 @DomName('MIDIPort')
+@Experimental // untriaged
 class MidiPort extends EventTarget {
   MidiPort.internal() : super.internal();
 
   @DomName('MIDIPort.disconnectEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
 
   @DomName('MIDIPort.id')
   @DocsEditable
+  @Experimental // untriaged
   String get id native "MIDIPort_id_Getter";
 
   @DomName('MIDIPort.manufacturer')
   @DocsEditable
+  @Experimental // untriaged
   String get manufacturer native "MIDIPort_manufacturer_Getter";
 
   @DomName('MIDIPort.name')
   @DocsEditable
+  @Experimental // untriaged
   String get name native "MIDIPort_name_Getter";
 
   @DomName('MIDIPort.type')
   @DocsEditable
+  @Experimental // untriaged
   String get type native "MIDIPort_type_Getter";
 
   @DomName('MIDIPort.version')
   @DocsEditable
+  @Experimental // untriaged
   String get version native "MIDIPort_version_Getter";
 
   @DomName('MIDIPort.addEventListener')
   @DocsEditable
+  @Experimental // untriaged
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIPort_addEventListener_Callback";
 
   @DomName('MIDIPort.dispatchEvent')
   @DocsEditable
+  @Experimental // untriaged
   bool dispatchEvent(Event event) native "MIDIPort_dispatchEvent_Callback";
 
   @DomName('MIDIPort.removeEventListener')
   @DocsEditable
+  @Experimental // untriaged
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIPort_removeEventListener_Callback";
 
   @DomName('MIDIPort.ondisconnect')
   @DocsEditable
+  @Experimental // untriaged
   Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.forTarget(this);
 
 }
@@ -15365,6 +15827,7 @@
 
 @DocsEditable
 @DomName('MimeType')
+@Experimental // non-standard
 class MimeType extends NativeFieldWrapperClass1 {
   MimeType.internal();
 
@@ -15394,6 +15857,7 @@
 
 @DocsEditable
 @DomName('MimeTypeArray')
+@Experimental // non-standard
 class MimeTypeArray extends NativeFieldWrapperClass1 with ListMixin<MimeType>, ImmutableListMixin<MimeType> implements List<MimeType> {
   MimeTypeArray.internal();
 
@@ -15464,6 +15928,7 @@
 
 @DocsEditable
 @DomName('HTMLModElement')
+@Unstable
 class ModElement extends _Element_Merged {
   ModElement.internal() : super.internal();
 
@@ -15532,10 +15997,12 @@
 
   @DomName('MouseEvent.dataTransfer')
   @DocsEditable
+  @Unstable
   DataTransfer get dataTransfer native "MouseEvent_dataTransfer_Getter";
 
   @DomName('MouseEvent.fromElement')
   @DocsEditable
+  @Experimental // nonstandard
   Node get fromElement native "MouseEvent_fromElement_Getter";
 
   @DomName('MouseEvent.metaKey')
@@ -15544,10 +16011,12 @@
 
   @DomName('MouseEvent.offsetX')
   @DocsEditable
+  @Unstable
   int get $dom_offsetX native "MouseEvent_offsetX_Getter";
 
   @DomName('MouseEvent.offsetY')
   @DocsEditable
+  @Unstable
   int get $dom_offsetY native "MouseEvent_offsetY_Getter";
 
   @DomName('MouseEvent.relatedTarget')
@@ -15568,6 +16037,7 @@
 
   @DomName('MouseEvent.toElement')
   @DocsEditable
+  @Experimental // nonstandard
   Node get toElement native "MouseEvent_toElement_Getter";
 
   @DomName('MouseEvent.webkitMovementX')
@@ -15637,6 +16107,7 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('MutationCallback')
 typedef void MutationCallback(List<MutationRecord> mutations, MutationObserver observer);
 // 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
@@ -15644,6 +16115,8 @@
 
 
 @DomName('MutationEvent')
+// http://www.w3.org/TR/DOM-Level-3-Events/#events-mutationevents
+@deprecated
 class MutationEvent extends Event {
   factory MutationEvent(String type,
       {bool canBubble: false, bool cancelable: false, Node relatedNode,
@@ -15842,6 +16315,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/css3-regions/#dom-named-flow-collection
 class NamedFlow extends EventTarget {
   NamedFlow.internal() : super.internal();
 
@@ -15894,6 +16368,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://dev.w3.org/csswg/css-regions/#dom-named-flow-collection
 class NamedFlowCollection extends NativeFieldWrapperClass1 {
   NamedFlowCollection.internal();
 
@@ -15978,6 +16453,7 @@
 
   @DomName('Navigator.appCodeName')
   @DocsEditable
+  @Experimental // non-standard
   String get appCodeName native "Navigator_appCodeName_Getter";
 
   @DomName('Navigator.appName')
@@ -15990,14 +16466,18 @@
 
   @DomName('Navigator.cookieEnabled')
   @DocsEditable
+  @Unstable
   bool get cookieEnabled native "Navigator_cookieEnabled_Getter";
 
   @DomName('Navigator.doNotTrack')
   @DocsEditable
+  // http://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html#js-dom
+  @Experimental // experimental
   String get doNotTrack native "Navigator_doNotTrack_Getter";
 
   @DomName('Navigator.geolocation')
   @DocsEditable
+  @Unstable
   Geolocation get geolocation native "Navigator_geolocation_Getter";
 
   @DomName('Navigator.language')
@@ -16006,10 +16486,12 @@
 
   @DomName('Navigator.mimeTypes')
   @DocsEditable
+  @Experimental // nonstandard
   MimeTypeArray get mimeTypes native "Navigator_mimeTypes_Getter";
 
   @DomName('Navigator.onLine')
   @DocsEditable
+  @Unstable
   bool get onLine native "Navigator_onLine_Getter";
 
   @DomName('Navigator.platform')
@@ -16018,14 +16500,17 @@
 
   @DomName('Navigator.plugins')
   @DocsEditable
+  @deprecated // nonstandard
   PluginArray get plugins native "Navigator_plugins_Getter";
 
   @DomName('Navigator.product')
   @DocsEditable
+  @Unstable
   String get product native "Navigator_product_Getter";
 
   @DomName('Navigator.productSub')
   @DocsEditable
+  @Unstable
   String get productSub native "Navigator_productSub_Getter";
 
   @DomName('Navigator.userAgent')
@@ -16034,10 +16519,12 @@
 
   @DomName('Navigator.vendor')
   @DocsEditable
+  @Unstable
   String get vendor native "Navigator_vendor_Getter";
 
   @DomName('Navigator.vendorSub')
   @DocsEditable
+  @Unstable
   String get vendorSub native "Navigator_vendorSub_Getter";
 
   @DomName('Navigator.webkitPersistentStorage')
@@ -16045,6 +16532,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.w3.org/TR/quota-api/#accessing-storagequota
   StorageQuota get persistentStorage native "Navigator_webkitPersistentStorage_Getter";
 
   @DomName('Navigator.webkitTemporaryStorage')
@@ -16052,18 +16540,23 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.w3.org/TR/quota-api/#accessing-storagequota
   StorageQuota get temporaryStorage native "Navigator_webkitTemporaryStorage_Getter";
 
   @DomName('Navigator.getStorageUpdates')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils
+  @Experimental
   void getStorageUpdates() native "Navigator_getStorageUpdates_Callback";
 
   @DomName('Navigator.javaEnabled')
   @DocsEditable
+  @deprecated // nonstandard
   bool javaEnabled() native "Navigator_javaEnabled_Callback";
 
   @DomName('Navigator.registerProtocolHandler')
   @DocsEditable
+  @Unstable
   void registerProtocolHandler(String scheme, String url, String title) native "Navigator_registerProtocolHandler_Callback";
 
   @DomName('Navigator.webkitGetGamepads')
@@ -16071,10 +16564,13 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#widl-Navigator-getGamepads-Gamepad
   List<Gamepad> getGamepads() native "Navigator_webkitGetGamepads_Callback";
 
   @DomName('Navigator.webkitGetUserMedia')
   @DocsEditable
+  // http://dev.w3.org/2011/webrtc/editor/getusermedia.html#navigatorusermedia
+  @Experimental
   void _getUserMedia(Map options, _NavigatorUserMediaSuccessCallback successCallback, [_NavigatorUserMediaErrorCallback errorCallback]) native "Navigator_webkitGetUserMedia_Callback";
 
 }
@@ -16087,15 +16583,19 @@
 
 @DocsEditable
 @DomName('NavigatorUserMediaError')
+// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-NavigatorUserMediaError
+@Experimental
 class NavigatorUserMediaError extends NativeFieldWrapperClass1 {
   NavigatorUserMediaError.internal();
 
   @DomName('NavigatorUserMediaError.PERMISSION_DENIED')
   @DocsEditable
+  @Experimental // nonstandard
   static const int PERMISSION_DENIED = 1;
 
   @DomName('NavigatorUserMediaError.code')
   @DocsEditable
+  @Experimental // nonstandard
   int get code native "NavigatorUserMediaError_code_Getter";
 
 }
@@ -16106,6 +16606,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('NavigatorUserMediaErrorCallback')
+// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-NavigatorUserMediaErrorCallback
+@Experimental
 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
@@ -16114,6 +16617,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('NavigatorUserMediaSuccessCallback')
+// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-NavigatorUserMediaSuccessCallback
+@Experimental
 typedef void _NavigatorUserMediaSuccessCallback(MediaStream 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
@@ -16441,10 +16947,14 @@
 
   @DomName('Node.localName')
   @DocsEditable
+  // http://dom.spec.whatwg.org/#dom-node-localname
+  @deprecated // deprecated
   String get localName native "Node_localName_Getter";
 
   @DomName('Node.namespaceURI')
   @DocsEditable
+  // http://dom.spec.whatwg.org/#dom-node-namespaceuri
+  @deprecated // deprecated
   String get $dom_namespaceUri native "Node_namespaceURI_Getter";
 
   @DomName('Node.nextSibling')
@@ -16542,6 +17052,7 @@
 
 @DocsEditable
 @DomName('NodeFilter')
+@Unstable
 class NodeFilter extends NativeFieldWrapperClass1 {
   NodeFilter.internal();
 
@@ -16563,10 +17074,12 @@
 
   @DomName('NodeFilter.SHOW_ATTRIBUTE')
   @DocsEditable
+  @deprecated // deprecated
   static const int SHOW_ATTRIBUTE = 0x00000002;
 
   @DomName('NodeFilter.SHOW_CDATA_SECTION')
   @DocsEditable
+  @deprecated // deprecated
   static const int SHOW_CDATA_SECTION = 0x00000008;
 
   @DomName('NodeFilter.SHOW_COMMENT')
@@ -16591,14 +17104,17 @@
 
   @DomName('NodeFilter.SHOW_ENTITY')
   @DocsEditable
+  @deprecated // deprecated
   static const int SHOW_ENTITY = 0x00000020;
 
   @DomName('NodeFilter.SHOW_ENTITY_REFERENCE')
   @DocsEditable
+  @deprecated // deprecated
   static const int SHOW_ENTITY_REFERENCE = 0x00000010;
 
   @DomName('NodeFilter.SHOW_NOTATION')
   @DocsEditable
+  @deprecated // deprecated
   static const int SHOW_NOTATION = 0x00000800;
 
   @DomName('NodeFilter.SHOW_PROCESSING_INSTRUCTION')
@@ -16616,6 +17132,7 @@
 
 
 @DomName('NodeIterator')
+@Unstable
 class NodeIterator extends NativeFieldWrapperClass1 {
   factory NodeIterator(Node root, int whatToShow) {
     return document.$dom_createNodeIterator(root, whatToShow, null, false);
@@ -16726,6 +17243,8 @@
 
 @DocsEditable
 @DomName('Notation')
+// http://dom.spec.whatwg.org/#notation
+@deprecated // deprecated
 class Notation extends Node {
   Notation.internal() : super.internal();
 
@@ -16744,6 +17263,8 @@
 
 
 @DomName('Notification')
+// http://www.w3.org/TR/notifications/#notification
+@Experimental // experimental
 class Notification extends EventTarget {
 
   factory Notification(String title, {String titleDir: null, String body: null, 
@@ -16770,6 +17291,7 @@
 
   @DomName('Notification.displayEvent')
   @DocsEditable
+  @Experimental // nonstandard
   static const EventStreamProvider<Event> displayEvent = const EventStreamProvider<Event>('display');
 
   @DomName('Notification.errorEvent')
@@ -16791,10 +17313,12 @@
 
   @DomName('Notification.dir')
   @DocsEditable
+  @Experimental // nonstandard
   String get dir native "Notification_dir_Getter";
 
   @DomName('Notification.dir')
   @DocsEditable
+  @Experimental // nonstandard
   void set dir(String value) native "Notification_dir_Setter";
 
   @DomName('Notification.permission')
@@ -16803,18 +17327,22 @@
 
   @DomName('Notification.replaceId')
   @DocsEditable
+  @Experimental // nonstandard
   String get replaceId native "Notification_replaceId_Getter";
 
   @DomName('Notification.replaceId')
   @DocsEditable
+  @Experimental // nonstandard
   void set replaceId(String value) native "Notification_replaceId_Setter";
 
   @DomName('Notification.tag')
   @DocsEditable
+  @Experimental // nonstandard
   String get tag native "Notification_tag_Getter";
 
   @DomName('Notification.tag')
   @DocsEditable
+  @Experimental // nonstandard
   void set tag(String value) native "Notification_tag_Setter";
 
   @DomName('Notification.addEventListener')
@@ -16823,6 +17351,7 @@
 
   @DomName('Notification.cancel')
   @DocsEditable
+  @Experimental // nonstandard
   void cancel() native "Notification_cancel_Callback";
 
   @DomName('Notification.close')
@@ -16850,6 +17379,7 @@
 
   @DomName('Notification.show')
   @DocsEditable
+  @Experimental // nonstandard
   void show() native "Notification_show_Callback";
 
   @DomName('Notification.onclick')
@@ -16862,6 +17392,7 @@
 
   @DomName('Notification.ondisplay')
   @DocsEditable
+  @Experimental // nonstandard
   Stream<Event> get onDisplay => displayEvent.forTarget(this);
 
   @DomName('Notification.onerror')
@@ -16885,6 +17416,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/notifications/#showing-a-notification
+@deprecated // deprecated
 class NotificationCenter extends NativeFieldWrapperClass1 {
   NotificationCenter.internal();
 
@@ -16922,6 +17455,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('NotificationPermissionCallback')
+// http://www.w3.org/TR/notifications/#notificationpermissioncallback
+@Experimental
 typedef void _NotificationPermissionCallback(String permission);
 // 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
@@ -16976,6 +17512,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class ObjectElement extends _Element_Merged {
   ObjectElement.internal() : super.internal();
 
@@ -16988,10 +17525,14 @@
 
   @DomName('HTMLObjectElement.code')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLObjectElement-partial
+  @deprecated // deprecated
   String get code native "HTMLObjectElement_code_Getter";
 
   @DomName('HTMLObjectElement.code')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLObjectElement-partial
+  @deprecated // deprecated
   void set code(String value) native "HTMLObjectElement_code_Setter";
 
   @DomName('HTMLObjectElement.data')
@@ -17210,6 +17751,7 @@
 
   @DomName('HTMLOutputElement.labels')
   @DocsEditable
+  @Unstable
   List<Node> get labels native "HTMLOutputElement_labels_Getter";
 
   @DomName('HTMLOutputElement.name')
@@ -17262,6 +17804,7 @@
 
 @DocsEditable
 @DomName('OverflowEvent')
+@Experimental // nonstandard
 class OverflowEvent extends Event {
   OverflowEvent.internal() : super.internal();
 
@@ -17299,6 +17842,8 @@
 
 @DocsEditable
 @DomName('PageTransitionEvent')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#pagetransitionevent
+@Experimental
 class PageTransitionEvent extends Event {
   PageTransitionEvent.internal() : super.internal();
 
@@ -17333,6 +17878,7 @@
 
 @DocsEditable
 @DomName('HTMLParamElement')
+@Unstable
 class ParamElement extends _Element_Merged {
   ParamElement.internal() : super.internal();
 
@@ -17366,6 +17912,8 @@
 
 @DocsEditable
 @DomName('Path')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects
+@Experimental
 class Path extends NativeFieldWrapperClass1 {
   Path.internal();
 
@@ -17446,6 +17994,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
   static const EventStreamProvider<Event> resourceTimingBufferFullEvent = const EventStreamProvider<Event>('webkitresourcetimingbufferfull');
 
   /// Checks if this type is supported on the current platform.
@@ -17453,6 +18002,7 @@
 
   @DomName('Performance.memory')
   @DocsEditable
+  @Experimental // nonstandard
   MemoryInfo get memory native "Performance_memory_Getter";
 
   @DomName('Performance.navigation')
@@ -17465,30 +18015,37 @@
 
   @DomName('Performance.clearMarks')
   @DocsEditable
+  @Experimental // untriaged
   void clearMarks(String markName) native "Performance_clearMarks_Callback";
 
   @DomName('Performance.clearMeasures')
   @DocsEditable
+  @Experimental // untriaged
   void clearMeasures(String measureName) native "Performance_clearMeasures_Callback";
 
   @DomName('Performance.getEntries')
   @DocsEditable
+  @Experimental // untriaged
   List<PerformanceEntry> getEntries() native "Performance_getEntries_Callback";
 
   @DomName('Performance.getEntriesByName')
   @DocsEditable
+  @Experimental // untriaged
   List<PerformanceEntry> getEntriesByName(String name, String entryType) native "Performance_getEntriesByName_Callback";
 
   @DomName('Performance.getEntriesByType')
   @DocsEditable
+  @Experimental // untriaged
   List<PerformanceEntry> getEntriesByType(String entryType) native "Performance_getEntriesByType_Callback";
 
   @DomName('Performance.mark')
   @DocsEditable
+  @Experimental // untriaged
   void mark(String markName) native "Performance_mark_Callback";
 
   @DomName('Performance.measure')
   @DocsEditable
+  @Experimental // untriaged
   void measure(String measureName, String startMark, String endMark) native "Performance_measure_Callback";
 
   @DomName('Performance.now')
@@ -17500,6 +18057,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
   void clearResourceTimings() native "Performance_webkitClearResourceTimings_Callback";
 
   @DomName('Performance.webkitSetResourceTimingBufferSize')
@@ -17507,10 +18065,13 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
   void setResourceTimingBufferSize(int maxSize) native "Performance_webkitSetResourceTimingBufferSize_Callback";
 
   @DomName('Performance.onwebkitresourcetimingbufferfull')
   @DocsEditable
+  // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
+  @Experimental
   Stream<Event> get onResourceTimingBufferFull => resourceTimingBufferFullEvent.forTarget(this);
 
 }
@@ -17523,6 +18084,8 @@
 
 @DocsEditable
 @DomName('PerformanceEntry')
+// http://www.w3.org/TR/performance-timeline/#sec-PerformanceEntry-interface
+@Experimental
 class PerformanceEntry extends NativeFieldWrapperClass1 {
   PerformanceEntry.internal();
 
@@ -17552,6 +18115,8 @@
 
 @DocsEditable
 @DomName('PerformanceMark')
+// http://www.w3.org/TR/user-timing/#performancemark
+@Experimental
 class PerformanceMark extends PerformanceEntry {
   PerformanceMark.internal() : super.internal();
 
@@ -17565,6 +18130,8 @@
 
 @DocsEditable
 @DomName('PerformanceMeasure')
+// http://www.w3.org/TR/user-timing/#performancemeasure
+@Experimental
 class PerformanceMeasure extends PerformanceEntry {
   PerformanceMeasure.internal() : super.internal();
 
@@ -17578,6 +18145,7 @@
 
 @DocsEditable
 @DomName('PerformanceNavigation')
+@Unstable
 class PerformanceNavigation extends NativeFieldWrapperClass1 {
   PerformanceNavigation.internal();
 
@@ -17615,6 +18183,8 @@
 
 @DocsEditable
 @DomName('PerformanceResourceTiming')
+// http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming
+@Experimental
 class PerformanceResourceTiming extends PerformanceEntry {
   PerformanceResourceTiming.internal() : super.internal();
 
@@ -17652,14 +18222,17 @@
 
   @DomName('PerformanceResourceTiming.requestStart')
   @DocsEditable
+  @Experimental // nonstandard
   num get requestStart native "PerformanceResourceTiming_requestStart_Getter";
 
   @DomName('PerformanceResourceTiming.responseEnd')
   @DocsEditable
+  @Experimental // nonstandard
   num get responseEnd native "PerformanceResourceTiming_responseEnd_Getter";
 
   @DomName('PerformanceResourceTiming.responseStart')
   @DocsEditable
+  @Experimental // nonstandard
   num get responseStart native "PerformanceResourceTiming_responseStart_Getter";
 
   @DomName('PerformanceResourceTiming.secureConnectionStart')
@@ -17676,6 +18249,7 @@
 
 @DocsEditable
 @DomName('PerformanceTiming')
+@Unstable
 class PerformanceTiming extends NativeFieldWrapperClass1 {
   PerformanceTiming.internal();
 
@@ -17773,6 +18347,7 @@
 
 @DocsEditable
 @DomName('Plugin')
+@Experimental // non-standard
 class Plugin extends NativeFieldWrapperClass1 {
   Plugin.internal();
 
@@ -17810,6 +18385,7 @@
 
 @DocsEditable
 @DomName('PluginArray')
+@Experimental // non-standard
 class PluginArray extends NativeFieldWrapperClass1 with ListMixin<Plugin>, ImmutableListMixin<Plugin> implements List<Plugin> {
   PluginArray.internal();
 
@@ -17903,6 +18479,8 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('PositionCallback')
+@Unstable
 typedef void _PositionCallback(Geoposition position);
 // 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
@@ -17913,6 +18491,7 @@
 
 @DocsEditable
 @DomName('PositionError')
+@Unstable
 class PositionError extends NativeFieldWrapperClass1 {
   PositionError.internal();
 
@@ -17944,6 +18523,8 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('PositionErrorCallback')
+@Unstable
 typedef void _PositionErrorCallback(PositionError 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
@@ -17963,10 +18544,12 @@
 
   @DomName('HTMLPreElement.wrap')
   @DocsEditable
+  @deprecated // deprecated
   bool get wrap native "HTMLPreElement_wrap_Getter";
 
   @DomName('HTMLPreElement.wrap')
   @DocsEditable
+  @deprecated // deprecated
   void set wrap(bool value) native "HTMLPreElement_wrap_Setter";
 
 }
@@ -17979,19 +18562,23 @@
 
 @DocsEditable
 @DomName('ProcessingInstruction')
+@Unstable
 class ProcessingInstruction extends Node {
   ProcessingInstruction.internal() : super.internal();
 
   @DomName('ProcessingInstruction.data')
   @DocsEditable
+  @Experimental // non-standard
   String get data native "ProcessingInstruction_data_Getter";
 
   @DomName('ProcessingInstruction.data')
   @DocsEditable
+  @Experimental // non-standard
   void set data(String value) native "ProcessingInstruction_data_Setter";
 
   @DomName('ProcessingInstruction.sheet')
   @DocsEditable
+  @Experimental // non-standard
   StyleSheet get sheet native "ProcessingInstruction_sheet_Getter";
 
   @DomName('ProcessingInstruction.target')
@@ -18024,6 +18611,7 @@
 
   @DomName('HTMLProgressElement.labels')
   @DocsEditable
+  @Unstable
   List<Node> get labels native "HTMLProgressElement_labels_Getter";
 
   @DomName('HTMLProgressElement.max')
@@ -18100,6 +18688,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('RTCErrorCallback')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#rtcerror
+@Experimental
 typedef void _RtcErrorCallback(String errorInformation);
 // 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
@@ -18108,6 +18699,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('RTCSessionDescriptionCallback')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCSessionDescription
+@Experimental
 typedef void _RtcSessionDescriptionCallback(RtcSessionDescription sdp);
 // 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
@@ -18116,6 +18710,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('RTCStatsCallback')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCStatsCallback
+@Experimental
 typedef void RtcStatsCallback(RtcStatsResponse response);
 // 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
@@ -18125,6 +18722,7 @@
 
 
 @DomName('Range')
+@Unstable
 class Range extends NativeFieldWrapperClass1 {
   factory Range() => document.$dom_createRange();
 
@@ -18140,18 +18738,22 @@
 
   @DomName('Range.NODE_AFTER')
   @DocsEditable
+  @Experimental // nonstandard
   static const int NODE_AFTER = 1;
 
   @DomName('Range.NODE_BEFORE')
   @DocsEditable
+  @Experimental // nonstandard
   static const int NODE_BEFORE = 0;
 
   @DomName('Range.NODE_BEFORE_AND_AFTER')
   @DocsEditable
+  @Experimental // nonstandard
   static const int NODE_BEFORE_AND_AFTER = 2;
 
   @DomName('Range.NODE_INSIDE')
   @DocsEditable
+  @Experimental // nonstandard
   static const int NODE_INSIDE = 3;
 
   @DomName('Range.START_TO_END')
@@ -18200,6 +18802,7 @@
 
   @DomName('Range.compareNode')
   @DocsEditable
+  @deprecated // deprecated
   int compareNode(Node refNode) native "Range_compareNode_Callback";
 
   @DomName('Range.comparePoint')
@@ -18220,6 +18823,7 @@
 
   @DomName('Range.expand')
   @DocsEditable
+  @Experimental // non-standard
   void expand(String unit) native "Range_expand_Callback";
 
   @DomName('Range.extractContents')
@@ -18240,6 +18844,7 @@
 
   @DomName('Range.intersectsNode')
   @DocsEditable
+  @deprecated // deprecated
   bool intersectsNode(Node refNode) native "Range_intersectsNode_Callback";
 
   @DomName('Range.isPointInRange')
@@ -18303,6 +18908,7 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('RequestAnimationFrameCallback')
 typedef void RequestAnimationFrameCallback(num highResTime);
 // 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
@@ -18313,6 +18919,8 @@
 
 @DocsEditable
 @DomName('RTCDataChannel')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDataChannel
+@Experimental
 class RtcDataChannel extends EventTarget {
   RtcDataChannel.internal() : super.internal();
 
@@ -18426,6 +19034,8 @@
 
 @DocsEditable
 @DomName('RTCDataChannelEvent')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#rtcdatachannelevent
+@Experimental
 class RtcDataChannelEvent extends Event {
   RtcDataChannelEvent.internal() : super.internal();
 
@@ -18443,6 +19053,8 @@
 
 @DocsEditable
 @DomName('RTCDTMFSender')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDTMFSender
+@Experimental
 class RtcDtmfSender extends EventTarget {
   RtcDtmfSender.internal() : super.internal();
 
@@ -18515,6 +19127,8 @@
 
 @DocsEditable
 @DomName('RTCDTMFToneChangeEvent')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDTMFToneChangeEvent
+@Experimental
 class RtcDtmfToneChangeEvent extends Event {
   RtcDtmfToneChangeEvent.internal() : super.internal();
 
@@ -18534,6 +19148,7 @@
 @DomName('RTCIceCandidate')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCIceCandidate
 class RtcIceCandidate extends NativeFieldWrapperClass1 {
   RtcIceCandidate.internal();
 
@@ -18568,6 +19183,8 @@
 
 @DocsEditable
 @DomName('RTCIceCandidateEvent')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#rtcicecandidate-type
+@Experimental
 class RtcIceCandidateEvent extends Event {
   RtcIceCandidateEvent.internal() : super.internal();
 
@@ -18584,6 +19201,7 @@
 @DomName('RTCPeerConnection')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCPeerConnection
 class RtcPeerConnection extends EventTarget {
 
   /**
@@ -18795,6 +19413,7 @@
 @DomName('RTCSessionDescription')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCSessionDescription
 class RtcSessionDescription extends NativeFieldWrapperClass1 {
   RtcSessionDescription.internal();
 
@@ -18833,6 +19452,8 @@
 
 @DocsEditable
 @DomName('RTCStatsReport')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCStatsReport
+@Experimental
 class RtcStatsReport extends NativeFieldWrapperClass1 {
   RtcStatsReport.internal();
 
@@ -18874,6 +19495,8 @@
 
 @DocsEditable
 @DomName('RTCStatsResponse')
+// http://dev.w3.org/2011/webrtc/editor/webrtc.html#widl-RTCStatsReport-RTCStats-getter-DOMString-id
+@Experimental
 class RtcStatsResponse extends NativeFieldWrapperClass1 {
   RtcStatsResponse.internal();
 
@@ -18909,10 +19532,12 @@
 
   @DomName('Screen.availLeft')
   @DocsEditable
+  @Experimental // nonstandard
   int get $dom_availLeft native "Screen_availLeft_Getter";
 
   @DomName('Screen.availTop')
   @DocsEditable
+  @Experimental // nonstandard
   int get $dom_availTop native "Screen_availTop_Getter";
 
   @DomName('Screen.availWidth')
@@ -18969,10 +19594,14 @@
 
   @DomName('HTMLScriptElement.crossOrigin')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#attr-script-crossorigin
+  @Experimental
   String get crossOrigin native "HTMLScriptElement_crossOrigin_Getter";
 
   @DomName('HTMLScriptElement.crossOrigin')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#attr-script-crossorigin
+  @Experimental
   void set crossOrigin(String value) native "HTMLScriptElement_crossOrigin_Setter";
 
   @DomName('HTMLScriptElement.defer')
@@ -18985,26 +19614,38 @@
 
   @DomName('HTMLScriptElement.event')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLScriptElement-partial
+  @deprecated // deprecated
   String get event native "HTMLScriptElement_event_Getter";
 
   @DomName('HTMLScriptElement.event')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLScriptElement-partial
+  @deprecated // deprecated
   void set event(String value) native "HTMLScriptElement_event_Setter";
 
   @DomName('HTMLScriptElement.htmlFor')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLScriptElement-partial
+  @deprecated // deprecated
   String get htmlFor native "HTMLScriptElement_htmlFor_Getter";
 
   @DomName('HTMLScriptElement.htmlFor')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLScriptElement-partial
+  @deprecated // deprecated
   void set htmlFor(String value) native "HTMLScriptElement_htmlFor_Setter";
 
   @DomName('HTMLScriptElement.nonce')
   @DocsEditable
+  // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#interaction-with-the-script-src-directive
+  @Experimental
   String get nonce native "HTMLScriptElement_nonce_Getter";
 
   @DomName('HTMLScriptElement.nonce')
   @DocsEditable
+  // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#interaction-with-the-script-src-directive
+  @Experimental
   void set nonce(String value) native "HTMLScriptElement_nonce_Setter";
 
   @DomName('HTMLScriptElement.src')
@@ -19033,6 +19674,7 @@
 
 @DocsEditable
 @DomName('ScriptProfile')
+@deprecated // nonstandard
 class ScriptProfile extends NativeFieldWrapperClass1 {
   ScriptProfile.internal();
 
@@ -19062,6 +19704,7 @@
 
 @DocsEditable
 @DomName('ScriptProfileNode')
+@deprecated // nonstandard
 class ScriptProfileNode extends NativeFieldWrapperClass1 {
   ScriptProfileNode.internal();
 
@@ -19111,6 +19754,8 @@
 
 @DocsEditable
 @DomName('SecurityPolicy')
+// https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#securitypolicy
+@Experimental
 class SecurityPolicy extends NativeFieldWrapperClass1 {
   SecurityPolicy.internal();
 
@@ -19184,6 +19829,8 @@
 
 @DocsEditable
 @DomName('SecurityPolicyViolationEvent')
+// https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#securitypolicyviolationevent-events
+@Experimental
 class SecurityPolicyViolationEvent extends Event {
   SecurityPolicyViolationEvent.internal() : super.internal();
 
@@ -19193,6 +19840,7 @@
 
   @DomName('SecurityPolicyViolationEvent.columnNumber')
   @DocsEditable
+  @Experimental // untriaged
   int get columnNumber native "SecurityPolicyViolationEvent_columnNumber_Getter";
 
   @DomName('SecurityPolicyViolationEvent.documentURI')
@@ -19259,6 +19907,7 @@
 
   @DomName('HTMLSelectElement.labels')
   @DocsEditable
+  @Unstable
   List<Node> get labels native "HTMLSelectElement_labels_Getter";
 
   @DomName('HTMLSelectElement.length')
@@ -19389,18 +20038,22 @@
 
   @DomName('Selection.baseNode')
   @DocsEditable
+  @Experimental // non-standard
   Node get baseNode native "DOMSelection_baseNode_Getter";
 
   @DomName('Selection.baseOffset')
   @DocsEditable
+  @Experimental // non-standard
   int get baseOffset native "DOMSelection_baseOffset_Getter";
 
   @DomName('Selection.extentNode')
   @DocsEditable
+  @Experimental // non-standard
   Node get extentNode native "DOMSelection_extentNode_Getter";
 
   @DomName('Selection.extentOffset')
   @DocsEditable
+  @Experimental // non-standard
   int get extentOffset native "DOMSelection_extentOffset_Getter";
 
   @DomName('Selection.focusNode')
@@ -19421,6 +20074,7 @@
 
   @DomName('Selection.type')
   @DocsEditable
+  @Experimental // non-standard
   String get type native "DOMSelection_type_Getter";
 
   @DomName('Selection.addRange')
@@ -19441,6 +20095,7 @@
 
   @DomName('Selection.containsNode')
   @DocsEditable
+  @Experimental // non-standard
   bool containsNode(Node node, bool allowPartial) native "DOMSelection_containsNode_Callback";
 
   @DomName('Selection.deleteFromDocument')
@@ -19449,6 +20104,7 @@
 
   @DomName('Selection.empty')
   @DocsEditable
+  @Experimental // non-standard
   void empty() native "DOMSelection_empty_Callback";
 
   @DomName('Selection.extend')
@@ -19461,6 +20117,7 @@
 
   @DomName('Selection.modify')
   @DocsEditable
+  @Experimental // non-standard
   void modify(String alter, String direction, String granularity) native "DOMSelection_modify_Callback";
 
   @DomName('Selection.removeAllRanges')
@@ -19473,10 +20130,12 @@
 
   @DomName('Selection.setBaseAndExtent')
   @DocsEditable
+  @Experimental // non-standard
   void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) native "DOMSelection_setBaseAndExtent_Callback";
 
   @DomName('Selection.setPosition')
   @DocsEditable
+  @Experimental // non-standard
   void setPosition(Node node, int offset) native "DOMSelection_setPosition_Callback";
 
   @DomName('Selection.toString')
@@ -19495,6 +20154,7 @@
 @DomName('HTMLShadowElement')
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
 @Experimental
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-element
 class ShadowElement extends _Element_Merged {
   ShadowElement.internal() : super.internal();
 
@@ -19524,6 +20184,7 @@
 @DomName('ShadowRoot')
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
 @Experimental
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-root
 class ShadowRoot extends DocumentFragment {
   ShadowRoot.internal() : super.internal();
 
@@ -19590,6 +20251,8 @@
 
 @DocsEditable
 @DomName('SourceBuffer')
+// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebuffer
+@Experimental
 class SourceBuffer extends NativeFieldWrapperClass1 {
   SourceBuffer.internal();
 
@@ -19611,6 +20274,7 @@
 
   @DomName('SourceBuffer.append')
   @DocsEditable
+  @Experimental // non-standard
   void append(Uint8List data) native "SourceBuffer_append_Callback";
 
 }
@@ -19623,6 +20287,8 @@
 
 @DocsEditable
 @DomName('SourceBufferList')
+// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebufferlist
+@Experimental
 class SourceBufferList extends EventTarget with ListMixin<SourceBuffer>, ImmutableListMixin<SourceBuffer> implements List<SourceBuffer> {
   SourceBufferList.internal() : super.internal();
 
@@ -19759,6 +20425,8 @@
 
 @DocsEditable
 @DomName('SpeechGrammar')
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#dfn-speechgrammar
+@Experimental
 class SpeechGrammar extends NativeFieldWrapperClass1 {
   SpeechGrammar.internal();
 
@@ -19797,6 +20465,8 @@
 
 @DocsEditable
 @DomName('SpeechGrammarList')
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#dfn-speechgrammarlist
+@Experimental
 class SpeechGrammarList extends NativeFieldWrapperClass1 with ListMixin<SpeechGrammar>, ImmutableListMixin<SpeechGrammar> implements List<SpeechGrammar> {
   SpeechGrammarList.internal();
 
@@ -19898,6 +20568,8 @@
 
 @DocsEditable
 @DomName('SpeechInputEvent')
+// http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#speech_input_event_interface
+@Experimental
 class SpeechInputEvent extends Event {
   SpeechInputEvent.internal() : super.internal();
 
@@ -19915,6 +20587,8 @@
 
 @DocsEditable
 @DomName('SpeechInputResult')
+// http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#speech_input_result_interface
+@Experimental
 class SpeechInputResult extends NativeFieldWrapperClass1 {
   SpeechInputResult.internal();
 
@@ -19938,6 +20612,7 @@
 @DomName('SpeechRecognition')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechreco-section
 class SpeechRecognition extends EventTarget {
   SpeechRecognition.internal() : super.internal();
 
@@ -20117,6 +20792,7 @@
 @DomName('SpeechRecognitionAlternative')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechrecognitionalternative
 class SpeechRecognitionAlternative extends NativeFieldWrapperClass1 {
   SpeechRecognitionAlternative.internal();
 
@@ -20140,6 +20816,7 @@
 @DomName('SpeechRecognitionError')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechreco-error
 class SpeechRecognitionError extends Event {
   SpeechRecognitionError.internal() : super.internal();
 
@@ -20163,6 +20840,7 @@
 @DomName('SpeechRecognitionEvent')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechreco-event
 class SpeechRecognitionEvent extends Event {
   SpeechRecognitionEvent.internal() : super.internal();
 
@@ -20194,6 +20872,7 @@
 @DomName('SpeechRecognitionResult')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechrecognitionresult
 class SpeechRecognitionResult extends NativeFieldWrapperClass1 {
   SpeechRecognitionResult.internal();
 
@@ -20219,39 +20898,48 @@
 
 @DocsEditable
 @DomName('SpeechSynthesis')
+@Experimental // untriaged
 class SpeechSynthesis extends NativeFieldWrapperClass1 {
   SpeechSynthesis.internal();
 
   @DomName('SpeechSynthesis.paused')
   @DocsEditable
+  @Experimental // untriaged
   bool get paused native "SpeechSynthesis_paused_Getter";
 
   @DomName('SpeechSynthesis.pending')
   @DocsEditable
+  @Experimental // untriaged
   bool get pending native "SpeechSynthesis_pending_Getter";
 
   @DomName('SpeechSynthesis.speaking')
   @DocsEditable
+  @Experimental // untriaged
   bool get speaking native "SpeechSynthesis_speaking_Getter";
 
   @DomName('SpeechSynthesis.cancel')
   @DocsEditable
+  @Experimental // untriaged
   void cancel() native "SpeechSynthesis_cancel_Callback";
 
   @DomName('SpeechSynthesis.getVoices')
   @DocsEditable
+  @Experimental // untriaged
   List<SpeechSynthesisVoice> getVoices() native "SpeechSynthesis_getVoices_Callback";
 
   @DomName('SpeechSynthesis.pause')
   @DocsEditable
+  @Experimental // untriaged
   void pause() native "SpeechSynthesis_pause_Callback";
 
   @DomName('SpeechSynthesis.resume')
   @DocsEditable
+  @Experimental // untriaged
   void resume() native "SpeechSynthesis_resume_Callback";
 
   @DomName('SpeechSynthesis.speak')
   @DocsEditable
+  @Experimental // untriaged
   void speak(SpeechSynthesisUtterance utterance) native "SpeechSynthesis_speak_Callback";
 
 }
@@ -20264,19 +20952,23 @@
 
 @DocsEditable
 @DomName('SpeechSynthesisEvent')
+@Experimental // untriaged
 class SpeechSynthesisEvent extends Event {
   SpeechSynthesisEvent.internal() : super.internal();
 
   @DomName('SpeechSynthesisEvent.charIndex')
   @DocsEditable
+  @Experimental // untriaged
   int get charIndex native "SpeechSynthesisEvent_charIndex_Getter";
 
   @DomName('SpeechSynthesisEvent.elapsedTime')
   @DocsEditable
+  @Experimental // untriaged
   num get elapsedTime native "SpeechSynthesisEvent_elapsedTime_Getter";
 
   @DomName('SpeechSynthesisEvent.name')
   @DocsEditable
+  @Experimental // untriaged
   String get name native "SpeechSynthesisEvent_name_Getter";
 
 }
@@ -20289,35 +20981,43 @@
 
 @DocsEditable
 @DomName('SpeechSynthesisUtterance')
+@Experimental // untriaged
 class SpeechSynthesisUtterance extends EventTarget {
   SpeechSynthesisUtterance.internal() : super.internal();
 
   @DomName('SpeechSynthesisUtterance.boundaryEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> boundaryEvent = const EventStreamProvider<SpeechSynthesisEvent>('boundary');
 
   @DomName('SpeechSynthesisUtterance.endEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> endEvent = const EventStreamProvider<SpeechSynthesisEvent>('end');
 
   @DomName('SpeechSynthesisUtterance.errorEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
   @DomName('SpeechSynthesisUtterance.markEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> markEvent = const EventStreamProvider<SpeechSynthesisEvent>('mark');
 
   @DomName('SpeechSynthesisUtterance.pauseEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
 
   @DomName('SpeechSynthesisUtterance.resumeEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> resumeEvent = const EventStreamProvider<SpeechSynthesisEvent>('resume');
 
   @DomName('SpeechSynthesisUtterance.startEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> startEvent = const EventStreamProvider<SpeechSynthesisEvent>('start');
 
   @DomName('SpeechSynthesisUtterance.SpeechSynthesisUtterance')
@@ -20331,78 +21031,97 @@
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable
+  @Experimental // untriaged
   String get lang native "SpeechSynthesisUtterance_lang_Getter";
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable
+  @Experimental // untriaged
   void set lang(String value) native "SpeechSynthesisUtterance_lang_Setter";
 
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable
+  @Experimental // untriaged
   num get pitch native "SpeechSynthesisUtterance_pitch_Getter";
 
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable
+  @Experimental // untriaged
   void set pitch(num value) native "SpeechSynthesisUtterance_pitch_Setter";
 
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable
+  @Experimental // untriaged
   num get rate native "SpeechSynthesisUtterance_rate_Getter";
 
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable
+  @Experimental // untriaged
   void set rate(num value) native "SpeechSynthesisUtterance_rate_Setter";
 
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable
+  @Experimental // untriaged
   String get text native "SpeechSynthesisUtterance_text_Getter";
 
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable
+  @Experimental // untriaged
   void set text(String value) native "SpeechSynthesisUtterance_text_Setter";
 
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable
+  @Experimental // untriaged
   SpeechSynthesisVoice get voice native "SpeechSynthesisUtterance_voice_Getter";
 
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable
+  @Experimental // untriaged
   void set voice(SpeechSynthesisVoice value) native "SpeechSynthesisUtterance_voice_Setter";
 
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable
+  @Experimental // untriaged
   num get volume native "SpeechSynthesisUtterance_volume_Getter";
 
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable
+  @Experimental // untriaged
   void set volume(num value) native "SpeechSynthesisUtterance_volume_Setter";
 
   @DomName('SpeechSynthesisUtterance.onboundary')
   @DocsEditable
+  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onBoundary => boundaryEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onend')
   @DocsEditable
+  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onEnd => endEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onerror')
   @DocsEditable
+  @Experimental // untriaged
   Stream<Event> get onError => errorEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onmark')
   @DocsEditable
+  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onMark => markEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onpause')
   @DocsEditable
+  @Experimental // untriaged
   Stream<Event> get onPause => pauseEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onresume')
   @DocsEditable
+  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onResume => resumeEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onstart')
   @DocsEditable
+  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onStart => startEvent.forTarget(this);
 
 }
@@ -20415,27 +21134,33 @@
 
 @DocsEditable
 @DomName('SpeechSynthesisVoice')
+@Experimental // untriaged
 class SpeechSynthesisVoice extends NativeFieldWrapperClass1 {
   SpeechSynthesisVoice.internal();
 
   @DomName('SpeechSynthesisVoice.default')
   @DocsEditable
+  @Experimental // untriaged
   bool get defaultValue native "SpeechSynthesisVoice_default_Getter";
 
   @DomName('SpeechSynthesisVoice.lang')
   @DocsEditable
+  @Experimental // untriaged
   String get lang native "SpeechSynthesisVoice_lang_Getter";
 
   @DomName('SpeechSynthesisVoice.localService')
   @DocsEditable
+  @Experimental // untriaged
   bool get localService native "SpeechSynthesisVoice_localService_Getter";
 
   @DomName('SpeechSynthesisVoice.name')
   @DocsEditable
+  @Experimental // untriaged
   String get name native "SpeechSynthesisVoice_name_Getter";
 
   @DomName('SpeechSynthesisVoice.voiceURI')
   @DocsEditable
+  @Experimental // untriaged
   String get voiceUri native "SpeechSynthesisVoice_voiceURI_Getter";
 
 }
@@ -20470,6 +21195,7 @@
  * section of the library tour.
  */
 @DomName('Storage')
+@Unstable
 class Storage extends NativeFieldWrapperClass1 implements Map<String, String>
      {
 
@@ -20553,6 +21279,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('StorageErrorCallback')
+// http://www.w3.org/TR/quota-api/#storageerrorcallback-callback
+@Experimental
 typedef void StorageErrorCallback(DomException error);
 // 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
@@ -20562,6 +21291,7 @@
 
 
 @DomName('StorageEvent')
+@Unstable
 class StorageEvent extends Event {
   factory StorageEvent(String type,
     {bool canBubble: false, bool cancelable: false, String key, String oldValue,
@@ -20605,6 +21335,8 @@
 
 
 @DomName('StorageInfo')
+// http://www.w3.org/TR/file-system-api/
+@Experimental
 class StorageInfo extends NativeFieldWrapperClass1 {
   StorageInfo.internal();
 
@@ -20662,6 +21394,8 @@
 
 @DocsEditable
 @DomName('StorageQuota')
+// http://www.w3.org/TR/quota-api/#idl-def-StorageQuota
+@Experimental
 class StorageQuota extends NativeFieldWrapperClass1 {
   StorageQuota.internal();
 
@@ -20681,6 +21415,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('StorageQuotaCallback')
+// http://www.w3.org/TR/quota-api/#idl-def-StorageQuotaCallback
+@Experimental
 typedef void StorageQuotaCallback(int grantedQuotaInBytes);
 // 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
@@ -20689,6 +21426,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('StorageUsageCallback')
+// http://www.w3.org/TR/quota-api/#idl-def-StorageUsageCallback
+@Experimental
 typedef void StorageUsageCallback(int currentUsageInBytes, int currentQuotaInBytes);
 // 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
@@ -20697,6 +21437,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('StringCallback')
+// http://www.w3.org/TR/2011/WD-html5-20110113/dnd.html#the-datatransferitem-interface
+@Experimental
 typedef void _StringCallback(String data);
 // 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
@@ -20760,6 +21503,8 @@
 
 @DocsEditable
 @DomName('StyleMedia')
+// http://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html
+@Experimental // nonstandard
 class StyleMedia extends NativeFieldWrapperClass1 {
   StyleMedia.internal();
 
@@ -20940,10 +21685,14 @@
 
   @DomName('HTMLTableElement.border')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLTableElement-partial
+  @deprecated // deprecated
   String get border native "HTMLTableElement_border_Getter";
 
   @DomName('HTMLTableElement.border')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLTableElement-partial
+  @deprecated // deprecated
   void set border(String value) native "HTMLTableElement_border_Setter";
 
   @DomName('HTMLTableElement.caption')
@@ -21103,6 +21852,7 @@
 @DomName('HTMLTemplateElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#template-element
 class TemplateElement extends _Element_Merged {
   TemplateElement.internal() : super.internal();
 
@@ -21258,6 +22008,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://www.w3.org/Bugs/Public/show_bug.cgi?id=21067
   Node get insertionParent native "Text_webkitInsertionParent_Getter";
 
   @DomName('Text.wholeText')
@@ -21266,6 +22017,8 @@
 
   @DomName('Text.replaceWholeText')
   @DocsEditable
+  // http://dom.spec.whatwg.org/#dom-text-replacewholetext
+  @deprecated // deprecated
   Text replaceWholeText(String content) native "Text_replaceWholeText_Callback";
 
   @DomName('Text.splitText')
@@ -21350,10 +22103,14 @@
 
   @DomName('HTMLTextAreaElement.dirName')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#dom-textarea-dirname
+  @Experimental
   String get dirName native "HTMLTextAreaElement_dirName_Getter";
 
   @DomName('HTMLTextAreaElement.dirName')
   @DocsEditable
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#dom-textarea-dirname
+  @Experimental
   void set dirName(String value) native "HTMLTextAreaElement_dirName_Setter";
 
   @DomName('HTMLTextAreaElement.disabled')
@@ -21370,6 +22127,7 @@
 
   @DomName('HTMLTextAreaElement.labels')
   @DocsEditable
+  @Unstable
   List<Node> get labels native "HTMLTextAreaElement_labels_Getter";
 
   @DomName('HTMLTextAreaElement.maxLength')
@@ -21530,6 +22288,7 @@
 
 
 @DomName('TextEvent')
+@Unstable
 class TextEvent extends UIEvent {
   factory TextEvent(String type,
     {bool canBubble: false, bool cancelable: false, Window view, String data}) {
@@ -21577,6 +22336,8 @@
 
 @DocsEditable
 @DomName('TextTrack')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttrack
+@Experimental
 class TextTrack extends EventTarget {
   TextTrack.internal() : super.internal();
 
@@ -21646,6 +22407,8 @@
 
 @DocsEditable
 @DomName('TextTrackCue')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttrackcue
+@Experimental
 class TextTrackCue extends EventTarget {
   TextTrackCue.internal() : super.internal();
 
@@ -21668,10 +22431,12 @@
 
   @DomName('TextTrackCue.align')
   @DocsEditable
+  @Experimental // nonstandard
   String get align native "TextTrackCue_align_Getter";
 
   @DomName('TextTrackCue.align')
   @DocsEditable
+  @Experimental // nonstandard
   void set align(String value) native "TextTrackCue_align_Setter";
 
   @DomName('TextTrackCue.endTime')
@@ -21692,10 +22457,12 @@
 
   @DomName('TextTrackCue.line')
   @DocsEditable
+  @Experimental // nonstandard
   int get line native "TextTrackCue_line_Getter";
 
   @DomName('TextTrackCue.line')
   @DocsEditable
+  @Experimental // nonstandard
   void set line(int value) native "TextTrackCue_line_Setter";
 
   @DomName('TextTrackCue.pauseOnExit')
@@ -21708,26 +22475,32 @@
 
   @DomName('TextTrackCue.position')
   @DocsEditable
+  @Experimental // nonstandard
   int get position native "TextTrackCue_position_Getter";
 
   @DomName('TextTrackCue.position')
   @DocsEditable
+  @Experimental // nonstandard
   void set position(int value) native "TextTrackCue_position_Setter";
 
   @DomName('TextTrackCue.size')
   @DocsEditable
+  @Experimental // nonstandard
   int get size native "TextTrackCue_size_Getter";
 
   @DomName('TextTrackCue.size')
   @DocsEditable
+  @Experimental // nonstandard
   void set size(int value) native "TextTrackCue_size_Setter";
 
   @DomName('TextTrackCue.snapToLines')
   @DocsEditable
+  @Experimental // nonstandard
   bool get snapToLines native "TextTrackCue_snapToLines_Getter";
 
   @DomName('TextTrackCue.snapToLines')
   @DocsEditable
+  @Experimental // nonstandard
   void set snapToLines(bool value) native "TextTrackCue_snapToLines_Setter";
 
   @DomName('TextTrackCue.startTime')
@@ -21740,10 +22513,12 @@
 
   @DomName('TextTrackCue.text')
   @DocsEditable
+  @Experimental // nonstandard
   String get text native "TextTrackCue_text_Getter";
 
   @DomName('TextTrackCue.text')
   @DocsEditable
+  @Experimental // nonstandard
   void set text(String value) native "TextTrackCue_text_Setter";
 
   @DomName('TextTrackCue.track')
@@ -21752,10 +22527,12 @@
 
   @DomName('TextTrackCue.vertical')
   @DocsEditable
+  @Experimental // nonstandard
   String get vertical native "TextTrackCue_vertical_Getter";
 
   @DomName('TextTrackCue.vertical')
   @DocsEditable
+  @Experimental // nonstandard
   void set vertical(String value) native "TextTrackCue_vertical_Setter";
 
   @DomName('TextTrackCue.addEventListener')
@@ -21768,6 +22545,7 @@
 
   @DomName('TextTrackCue.getCueAsHTML')
   @DocsEditable
+  @Experimental // nonstandard
   DocumentFragment getCueAsHtml() native "TextTrackCue_getCueAsHTML_Callback";
 
   @DomName('TextTrackCue.removeEventListener')
@@ -21792,6 +22570,8 @@
 
 @DocsEditable
 @DomName('TextTrackCueList')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttrackcuelist
+@Experimental
 class TextTrackCueList extends NativeFieldWrapperClass1 with ListMixin<TextTrackCue>, ImmutableListMixin<TextTrackCue> implements List<TextTrackCue> {
   TextTrackCueList.internal();
 
@@ -21862,6 +22642,8 @@
 
 @DocsEditable
 @DomName('TextTrackList')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttracklist
+@Experimental
 class TextTrackList extends EventTarget with ListMixin<TextTrack>, ImmutableListMixin<TextTrack> implements List<TextTrack> {
   TextTrackList.internal() : super.internal();
 
@@ -21948,6 +22730,7 @@
 
 @DocsEditable
 @DomName('TimeRanges')
+@Unstable
 class TimeRanges extends NativeFieldWrapperClass1 {
   TimeRanges.internal();
 
@@ -21971,6 +22754,7 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('TimeoutHandler')
 typedef void TimeoutHandler();
 // 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
@@ -21996,6 +22780,8 @@
 
 @DocsEditable
 @DomName('Touch')
+// http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+@Experimental
 class Touch extends NativeFieldWrapperClass1 {
   Touch.internal();
 
@@ -22080,6 +22866,8 @@
 
 
 @DomName('TouchEvent')
+// http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+@Experimental
 class TouchEvent extends UIEvent {
   factory TouchEvent(TouchList touches, TouchList targetTouches,
       TouchList changedTouches, String type,
@@ -22150,6 +22938,8 @@
 
 
 @DomName('TouchList')
+// http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+@Experimental
 class TouchList extends NativeFieldWrapperClass1 with ListMixin<Touch>, ImmutableListMixin<Touch> implements List<Touch> {
   /// NB: This constructor likely does not work as you might expect it to! This
   /// constructor will simply fail (returning null) if you are not on a device
@@ -22226,6 +23016,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#the-track-element
+@Experimental
 class TrackElement extends _Element_Merged {
   TrackElement.internal() : super.internal();
 
@@ -22310,6 +23102,7 @@
 
 @DocsEditable
 @DomName('TrackEvent')
+@Unstable
 class TrackEvent extends Event {
   TrackEvent.internal() : super.internal();
 
@@ -22349,6 +23142,7 @@
 
 
 @DomName('TreeWalker')
+@Unstable
 class TreeWalker extends NativeFieldWrapperClass1 {
   factory TreeWalker(Node root, int whatToShow) {
     return document.$dom_createTreeWalker(root, whatToShow, null, false);
@@ -22365,6 +23159,8 @@
 
   @DomName('TreeWalker.expandEntityReferences')
   @DocsEditable
+  // http://dom.spec.whatwg.org/#dom-traversal
+  @deprecated // deprecated
   bool get expandEntityReferences native "TreeWalker_expandEntityReferences_Getter";
 
   @DomName('TreeWalker.filter')
@@ -22437,6 +23233,7 @@
 
   @DomName('UIEvent.charCode')
   @DocsEditable
+  @Unstable
   int get $dom_charCode native "UIEvent_charCode_Getter";
 
   @DomName('UIEvent.detail')
@@ -22445,22 +23242,31 @@
 
   @DomName('UIEvent.keyCode')
   @DocsEditable
+  @Unstable
   int get $dom_keyCode native "UIEvent_keyCode_Getter";
 
   @DomName('UIEvent.layerX')
   @DocsEditable
+  // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
+  @Experimental // nonstandard
   int get $dom_layerX native "UIEvent_layerX_Getter";
 
   @DomName('UIEvent.layerY')
   @DocsEditable
+  // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
+  @Experimental // nonstandard
   int get $dom_layerY native "UIEvent_layerY_Getter";
 
   @DomName('UIEvent.pageX')
   @DocsEditable
+  // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
+  @Experimental // nonstandard
   int get $dom_pageX native "UIEvent_pageX_Getter";
 
   @DomName('UIEvent.pageY')
   @DocsEditable
+  // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
+  @Experimental // nonstandard
   int get $dom_pageY native "UIEvent_pageY_Getter";
 
   @DomName('UIEvent.view')
@@ -22469,6 +23275,7 @@
 
   @DomName('UIEvent.which')
   @DocsEditable
+  @Unstable
   int get which native "UIEvent_which_Getter";
 
   @DomName('UIEvent.initUIEvent')
@@ -22662,6 +23469,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @deprecated // deprecated
   bool get displayingFullscreen native "HTMLVideoElement_webkitDisplayingFullscreen_Getter";
 
   @DomName('HTMLVideoElement.webkitDroppedFrameCount')
@@ -22676,6 +23485,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @deprecated // deprecated
   bool get supportsFullscreen native "HTMLVideoElement_webkitSupportsFullscreen_Getter";
 
   @DomName('HTMLVideoElement.width')
@@ -22691,6 +23502,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @deprecated // deprecated
   void enterFullScreen() native "HTMLVideoElement_webkitEnterFullScreen_Callback";
 
   @DomName('HTMLVideoElement.webkitEnterFullscreen')
@@ -22698,6 +23511,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   void enterFullscreen() native "HTMLVideoElement_webkitEnterFullscreen_Callback";
 
   @DomName('HTMLVideoElement.webkitExitFullScreen')
@@ -22705,6 +23519,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
+  @deprecated // deprecated
   void exitFullScreen() native "HTMLVideoElement_webkitExitFullScreen_Callback";
 
   @DomName('HTMLVideoElement.webkitExitFullscreen')
@@ -22712,6 +23528,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
   void exitFullscreen() native "HTMLVideoElement_webkitExitFullscreen_Callback";
 
 }
@@ -22722,6 +23539,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('VoidCallback')
+// http://www.w3.org/TR/file-system-api/#the-voidcallback-interface
+@Experimental
 typedef void VoidCallback();
 // 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
@@ -22770,6 +23590,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class WebSocket extends EventTarget {
   WebSocket.internal() : super.internal();
 
@@ -22834,6 +23655,7 @@
 
   @DomName('WebSocket.URL')
   @DocsEditable
+  @deprecated // deprecated
   String get Url native "WebSocket_URL_Getter";
 
   @DomName('WebSocket.binaryType')
@@ -22982,14 +23804,17 @@
 
   @DomName('WheelEvent.wheelDeltaX')
   @DocsEditable
+  @Experimental // non-standard
   int get _wheelDeltaX native "WheelEvent_wheelDeltaX_Getter";
 
   @DomName('WheelEvent.wheelDeltaY')
   @DocsEditable
+  @Experimental // non-standard
   int get _wheelDeltaY native "WheelEvent_wheelDeltaY_Getter";
 
   @DomName('WheelEvent.initWebKitWheelEvent')
   @DocsEditable
+  @Experimental
   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";
 
 
@@ -23127,14 +23952,19 @@
 
   @DomName('Window.DOMContentLoadedEvent')
   @DocsEditable
+  @Experimental // untriaged
   static const EventStreamProvider<Event> contentLoadedEvent = const EventStreamProvider<Event>('DOMContentLoaded');
 
   @DomName('Window.devicemotionEvent')
   @DocsEditable
+  // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
+  @Experimental
   static const EventStreamProvider<DeviceMotionEvent> deviceMotionEvent = const EventStreamProvider<DeviceMotionEvent>('devicemotion');
 
   @DomName('Window.deviceorientationEvent')
   @DocsEditable
+  // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
+  @Experimental
   static const EventStreamProvider<DeviceOrientationEvent> deviceOrientationEvent = const EventStreamProvider<DeviceOrientationEvent>('deviceorientation');
 
   @DomName('Window.hashchangeEvent')
@@ -23182,6 +24012,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // untriaged
   static const EventStreamProvider<AnimationEvent> animationEndEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationEnd');
 
   @DomName('Window.webkitAnimationIterationEvent')
@@ -23189,6 +24020,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // untriaged
   static const EventStreamProvider<AnimationEvent> animationIterationEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationIteration');
 
   @DomName('Window.webkitAnimationStartEvent')
@@ -23196,18 +24028,24 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  @Experimental // untriaged
   static const EventStreamProvider<AnimationEvent> animationStartEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationStart');
 
   @DomName('Window.PERSISTENT')
   @DocsEditable
+  // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
+  @Experimental
   static const int PERSISTENT = 1;
 
   @DomName('Window.TEMPORARY')
   @DocsEditable
+  // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
+  @Experimental
   static const int TEMPORARY = 0;
 
   @DomName('Window.CSS')
   @DocsEditable
+  @Experimental // untriaged
   Css get css native "DOMWindow_CSS_Getter";
 
   @DomName('Window.applicationCache')
@@ -23224,6 +24062,8 @@
 
   @DomName('Window.crypto')
   @DocsEditable
+  // http://www.w3.org/TR/WebCryptoAPI/
+  @Experimental
   Crypto get crypto native "DOMWindow_crypto_Getter";
 
   @DomName('Window.defaultStatus')
@@ -23236,14 +24076,18 @@
 
   @DomName('Window.defaultstatus')
   @DocsEditable
+  @Experimental // non-standard
   String get defaultstatus native "DOMWindow_defaultstatus_Getter";
 
   @DomName('Window.defaultstatus')
   @DocsEditable
+  @Experimental // non-standard
   void set defaultstatus(String value) native "DOMWindow_defaultstatus_Setter";
 
   @DomName('Window.devicePixelRatio')
   @DocsEditable
+  // http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html
+  @Experimental // non-standard
   num get devicePixelRatio native "DOMWindow_devicePixelRatio_Getter";
 
   @DomName('Window.document')
@@ -23252,6 +24096,7 @@
 
   @DomName('Window.event')
   @DocsEditable
+  @deprecated // deprecated
   Event get event native "DOMWindow_event_Getter";
 
   @DomName('Window.history')
@@ -23308,6 +24153,7 @@
 
   @DomName('Window.offscreenBuffering')
   @DocsEditable
+  @Experimental // non-standard
   bool get offscreenBuffering native "DOMWindow_offscreenBuffering_Getter";
 
   @DomName('Window.opener')
@@ -23343,6 +24189,8 @@
 
   @DomName('Window.personalbar')
   @DocsEditable
+  // https://developer.mozilla.org/en-US/docs/DOM/window.personalbar
+  @deprecated // deprecated
   BarInfo get personalbar native "DOMWindow_personalbar_Getter";
 
   @DomName('Window.screen')
@@ -23387,6 +24235,7 @@
 
   @DomName('Window.speechSynthesis')
   @DocsEditable
+  @Experimental // untriaged
   SpeechSynthesis get speechSynthesis native "DOMWindow_speechSynthesis_Getter";
 
   @DomName('Window.status')
@@ -23403,6 +24252,8 @@
 
   @DomName('Window.styleMedia')
   @DocsEditable
+  // http://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html
+  @Experimental // nonstandard
   StyleMedia get styleMedia native "DOMWindow_styleMedia_Getter";
 
   @DomName('Window.toolbar')
@@ -23418,6 +24269,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // https://plus.sandbox.google.com/u/0/+GoogleChromeDevelopers/posts/8vWo8hq4pDm?e=Showroom
+  @deprecated // deprecated
   NotificationCenter get notifications native "DOMWindow_webkitNotifications_Getter";
 
   @DomName('Window.webkitStorageInfo')
@@ -23425,6 +24278,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.w3.org/TR/file-system-api/
+  @deprecated // deprecated
   StorageInfo get storageInfo native "DOMWindow_webkitStorageInfo_Getter";
 
   @DomName('Window.window')
@@ -23453,6 +24308,8 @@
 
   @DomName('Window.captureEvents')
   @DocsEditable
+  // http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-capture
+  @deprecated // deprecated
   void captureEvents() native "DOMWindow_captureEvents_Callback";
 
   @DomName('Window.clearInterval')
@@ -23477,6 +24334,7 @@
 
   @DomName('Window.find')
   @DocsEditable
+  @Experimental // non-standard
   bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) native "DOMWindow_find_Callback";
 
   @DomName('Window.getComputedStyle')
@@ -23485,6 +24343,7 @@
 
   @DomName('Window.getMatchedCSSRules')
   @DocsEditable
+  @Experimental // non-standard
   List<CssRule> getMatchedCssRules(Element element, String pseudoElement) native "DOMWindow_getMatchedCSSRules_Callback";
 
   @DomName('Window.getSelection')
@@ -23512,6 +24371,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.w3.org/TR/webdatabase/
+  @Experimental // deprecated
   SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "DOMWindow_openDatabase_Callback";
 
   @DomName('Window.postMessage')
@@ -23524,6 +24385,8 @@
 
   @DomName('Window.releaseEvents')
   @DocsEditable
+  // http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-capture
+  @deprecated // deprecated
   void releaseEvents() native "DOMWindow_releaseEvents_Callback";
 
   @DomName('Window.removeEventListener')
@@ -23579,6 +24442,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://developer.apple.com/library/safari/#documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html
   _DomPoint _convertPointFromNodeToPage(Node node, _DomPoint p) native "DOMWindow_webkitConvertPointFromNodeToPage_Callback";
 
   @DomName('Window.webkitConvertPointFromPageToNode')
@@ -23586,12 +24450,14 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://developer.apple.com/library/safari/#documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html
   _DomPoint _convertPointFromPageToNode(Node node, _DomPoint p) native "DOMWindow_webkitConvertPointFromPageToNode_Callback";
 
   @DomName('Window.webkitRequestFileSystem')
   @DocsEditable
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental
+  // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
   void __requestFileSystem(int type, int size, _FileSystemCallback successCallback, [_ErrorCallback errorCallback]) native "DOMWindow_webkitRequestFileSystem_Callback";
 
   Future<FileSystem> _requestFileSystem(int type, int size) {
@@ -23606,6 +24472,7 @@
   @DocsEditable
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental
+  // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
   void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) native "DOMWindow_webkitResolveLocalFileSystemURL_Callback";
 
   Future<Entry> resolveLocalFileSystemUrl(String url) {
@@ -23618,6 +24485,7 @@
 
   @DomName('Window.onDOMContentLoaded')
   @DocsEditable
+  @Experimental // untriaged
   Stream<Event> get onContentLoaded => contentLoadedEvent.forTarget(this);
 
   @DomName('Window.onabort')
@@ -23646,10 +24514,14 @@
 
   @DomName('Window.ondevicemotion')
   @DocsEditable
+  // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
+  @Experimental
   Stream<DeviceMotionEvent> get onDeviceMotion => deviceMotionEvent.forTarget(this);
 
   @DomName('Window.ondeviceorientation')
   @DocsEditable
+  // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
+  @Experimental
   Stream<DeviceOrientationEvent> get onDeviceOrientation => deviceOrientationEvent.forTarget(this);
 
   @DomName('Window.ondrag')
@@ -23778,6 +24650,8 @@
 
   @DomName('Window.onsearch')
   @DocsEditable
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental
   Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
   @DomName('Window.onselect')
@@ -23794,18 +24668,26 @@
 
   @DomName('Window.ontouchcancel')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
 
   @DomName('Window.ontouchend')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
   @DomName('Window.ontouchmove')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
   @DomName('Window.ontouchstart')
   @DocsEditable
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental
   Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
   @DomName('Window.onunload')
@@ -23814,18 +24696,22 @@
 
   @DomName('Window.onwebkitAnimationEnd')
   @DocsEditable
+  @Experimental // untriaged
   Stream<AnimationEvent> get onAnimationEnd => animationEndEvent.forTarget(this);
 
   @DomName('Window.onwebkitAnimationIteration')
   @DocsEditable
+  @Experimental // untriaged
   Stream<AnimationEvent> get onAnimationIteration => animationIterationEvent.forTarget(this);
 
   @DomName('Window.onwebkitAnimationStart')
   @DocsEditable
+  @Experimental // untriaged
   Stream<AnimationEvent> get onAnimationStart => animationStartEvent.forTarget(this);
 
   @DomName('Window.onwebkitTransitionEnd')
   @DocsEditable
+  @deprecated
   Stream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent.forTarget(this);
 
 
@@ -23901,6 +24787,8 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#worker
+@Experimental // stable
 class Worker extends AbstractWorker {
   Worker.internal() : super.internal();
 
@@ -23942,6 +24830,8 @@
 
 @DocsEditable
 @DomName('XPathEvaluator')
+// http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator
+@deprecated // experimental
 class XPathEvaluator extends NativeFieldWrapperClass1 {
   XPathEvaluator.internal();
 
@@ -23976,6 +24866,8 @@
 
 @DocsEditable
 @DomName('XPathException')
+// http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathException
+@deprecated // experimental
 class XPathException extends NativeFieldWrapperClass1 {
   XPathException.internal();
 
@@ -23993,10 +24885,12 @@
 
   @DomName('XPathException.message')
   @DocsEditable
+  @Experimental // non-standard
   String get message native "XPathException_message_Getter";
 
   @DomName('XPathException.name')
   @DocsEditable
+  @Experimental // non-standard
   String get name native "XPathException_name_Getter";
 
   @DomName('XPathException.toString')
@@ -24013,6 +24907,8 @@
 
 @DocsEditable
 @DomName('XPathExpression')
+// http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathExpression
+@deprecated // experimental
 class XPathExpression extends NativeFieldWrapperClass1 {
   XPathExpression.internal();
 
@@ -24030,6 +24926,8 @@
 
 @DocsEditable
 @DomName('XPathNSResolver')
+// http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathNSResolver
+@deprecated // experimental
 class XPathNSResolver extends NativeFieldWrapperClass1 {
   XPathNSResolver.internal();
 
@@ -24047,6 +24945,8 @@
 
 @DocsEditable
 @DomName('XPathResult')
+// http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult
+@deprecated // experimental
 class XPathResult extends NativeFieldWrapperClass1 {
   XPathResult.internal();
 
@@ -24136,6 +25036,8 @@
 
 @DocsEditable
 @DomName('XMLSerializer')
+// http://domparsing.spec.whatwg.org/#the-xmlserializer-interface
+@deprecated // stable
 class XmlSerializer extends NativeFieldWrapperClass1 {
   XmlSerializer.internal();
 
@@ -24165,6 +25067,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@deprecated // nonstandard
 class XsltProcessor extends NativeFieldWrapperClass1 {
   XsltProcessor.internal();
 
@@ -24222,6 +25125,8 @@
 
 @DocsEditable
 @DomName('CSSPrimitiveValue')
+// http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface
+@deprecated // deprecated
 abstract class _CSSPrimitiveValue extends _CSSValue {
   _CSSPrimitiveValue.internal() : super.internal();
 
@@ -24235,6 +25140,8 @@
 
 @DocsEditable
 @DomName('CSSValue')
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 abstract class _CSSValue extends NativeFieldWrapperClass1 {
   _CSSValue.internal();
 
@@ -24440,6 +25347,8 @@
 
 @DocsEditable
 @DomName('Counter')
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 abstract class _Counter extends NativeFieldWrapperClass1 {
   _Counter.internal();
 
@@ -24519,6 +25428,8 @@
 
 @DocsEditable
 @DomName('CSSValueList')
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 class _CssValueList extends _CSSValue with ListMixin<_CSSValue>, ImmutableListMixin<_CSSValue> implements List<_CSSValue> {
   _CssValueList.internal() : super.internal();
 
@@ -24587,6 +25498,7 @@
 @DomName('DOMFileSystemSync')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
+// http://www.w3.org/TR/file-system-api/#the-filesystemsync-interface
 abstract class _DOMFileSystemSync extends NativeFieldWrapperClass1 {
   _DOMFileSystemSync.internal();
 
@@ -24603,6 +25515,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/webdatabase/#databasesync
+@deprecated // deprecated
 abstract class _DatabaseSync extends NativeFieldWrapperClass1 {
   _DatabaseSync.internal();
 
@@ -24616,6 +25530,8 @@
 
 @DocsEditable
 @DomName('DedicatedWorkerContext')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html
+@Experimental
 abstract class _DedicatedWorkerContext extends _WorkerContext {
   _DedicatedWorkerContext.internal() : super.internal();
 
@@ -24629,6 +25545,8 @@
 
 @DocsEditable
 @DomName('DirectoryEntrySync')
+// http://www.w3.org/TR/file-system-api/#the-directoryentrysync-interface
+@Experimental
 abstract class _DirectoryEntrySync extends _EntrySync {
   _DirectoryEntrySync.internal() : super.internal();
 
@@ -24642,6 +25560,8 @@
 
 @DocsEditable
 @DomName('DirectoryReaderSync')
+// http://www.w3.org/TR/file-system-api/#idl-def-DirectoryReaderSync
+@Experimental
 abstract class _DirectoryReaderSync extends NativeFieldWrapperClass1 {
   _DirectoryReaderSync.internal();
 
@@ -24658,6 +25578,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://developer.apple.com/library/safari/#documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html
+@Experimental // non-standard
 class _DomPoint extends NativeFieldWrapperClass1 {
   _DomPoint.internal();
   factory _DomPoint(num x, num y) => _create(x, y);
@@ -24767,10 +25689,14 @@
 
   @DomName('HTMLElement.spellcheck')
   @DocsEditable
+  // http://blog.whatwg.org/the-road-to-html-5-spellchecking
+  @Experimental // nonstandard
   bool get spellcheck native "HTMLElement_spellcheck_Getter";
 
   @DomName('HTMLElement.spellcheck')
   @DocsEditable
+  // http://blog.whatwg.org/the-road-to-html-5-spellchecking
+  @Experimental // nonstandard
   void set spellcheck(bool value) native "HTMLElement_spellcheck_Setter";
 
   @DomName('HTMLElement.tabIndex')
@@ -24802,6 +25728,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
   String get dropzone native "HTMLElement_webkitdropzone_Getter";
 
   @DomName('HTMLElement.webkitdropzone')
@@ -24809,6 +25736,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
   void set dropzone(String value) native "HTMLElement_webkitdropzone_Setter";
 
   @DomName('HTMLElement.click')
@@ -24817,6 +25745,7 @@
 
   @DomName('HTMLElement.insertAdjacentElement')
   @DocsEditable
+  @Experimental // non-standard
   Element insertAdjacentElement(String where, Element element) native "HTMLElement_insertAdjacentElement_Callback";
 
   @DomName('HTMLElement.insertAdjacentHTML')
@@ -24825,6 +25754,7 @@
 
   @DomName('HTMLElement.insertAdjacentText')
   @DocsEditable
+  @Experimental // non-standard
   void insertAdjacentText(String where, String text) native "HTMLElement_insertAdjacentText_Callback";
 
 }
@@ -24837,6 +25767,7 @@
 
 @DocsEditable
 @DomName('EntityReference')
+@deprecated // deprecated
 abstract class _EntityReference extends Node {
   _EntityReference.internal() : super.internal();
 
@@ -24850,6 +25781,8 @@
 
 @DocsEditable
 @DomName('EntryArray')
+// http://www.w3.org/TR/file-system-api/#the-entry-interface
+@Experimental
 class _EntryArray extends NativeFieldWrapperClass1 with ListMixin<Entry>, ImmutableListMixin<Entry> implements List<Entry> {
   _EntryArray.internal();
 
@@ -24916,6 +25849,8 @@
 
 @DocsEditable
 @DomName('EntryArraySync')
+// http://www.w3.org/TR/file-system-api/#idl-def-EntrySync
+@Experimental
 class _EntryArraySync extends NativeFieldWrapperClass1 with ListMixin<_EntrySync>, ImmutableListMixin<_EntrySync> implements List<_EntrySync> {
   _EntryArraySync.internal();
 
@@ -24982,6 +25917,8 @@
 
 @DocsEditable
 @DomName('EntrySync')
+// http://www.w3.org/TR/file-system-api/#idl-def-EntrySync
+@Experimental
 abstract class _EntrySync extends NativeFieldWrapperClass1 {
   _EntrySync.internal();
 
@@ -24995,6 +25932,8 @@
 
 @DocsEditable
 @DomName('FileEntrySync')
+// http://www.w3.org/TR/file-system-api/#the-fileentrysync-interface
+@Experimental
 abstract class _FileEntrySync extends _EntrySync {
   _FileEntrySync.internal() : super.internal();
 
@@ -25008,6 +25947,8 @@
 
 @DocsEditable
 @DomName('FileReaderSync')
+// http://www.w3.org/TR/FileAPI/#FileReaderSync
+@Experimental
 abstract class _FileReaderSync extends NativeFieldWrapperClass1 {
   _FileReaderSync.internal();
 
@@ -25030,6 +25971,8 @@
 
 @DocsEditable
 @DomName('FileWriterSync')
+// http://www.w3.org/TR/file-writer-api/#idl-def-FileWriterSync
+@Experimental
 abstract class _FileWriterSync extends NativeFieldWrapperClass1 {
   _FileWriterSync.internal();
 
@@ -25043,6 +25986,8 @@
 
 @DocsEditable
 @DomName('GamepadList')
+// https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html
+@Experimental
 class _GamepadList extends NativeFieldWrapperClass1 with ListMixin<Gamepad>, ImmutableListMixin<Gamepad> implements List<Gamepad> {
   _GamepadList.internal();
 
@@ -25109,6 +26054,8 @@
 
 @DocsEditable
 @DomName('HTMLAppletElement')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-applet-element
+@deprecated // deprecated
 abstract class _HTMLAppletElement extends _Element_Merged {
   _HTMLAppletElement.internal() : super.internal();
 
@@ -25122,6 +26069,8 @@
 
 @DocsEditable
 @DomName('HTMLBaseFontElement')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#basefont
+@deprecated // deprecated
 abstract class _HTMLBaseFontElement extends _Element_Merged {
   _HTMLBaseFontElement.internal() : super.internal();
 
@@ -25135,6 +26084,8 @@
 
 @DocsEditable
 @DomName('HTMLDirectoryElement')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dir
+@deprecated // deprecated
 abstract class _HTMLDirectoryElement extends _Element_Merged {
   _HTMLDirectoryElement.internal() : super.internal();
 
@@ -25148,6 +26099,8 @@
 
 @DocsEditable
 @DomName('HTMLFontElement')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlfontelement
+@deprecated // deprecated
 abstract class _HTMLFontElement extends _Element_Merged {
   _HTMLFontElement.internal() : super.internal();
 
@@ -25161,6 +26114,8 @@
 
 @DocsEditable
 @DomName('HTMLFrameElement')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlframeelement
+@deprecated // deprecated
 abstract class _HTMLFrameElement extends _Element_Merged {
   _HTMLFrameElement.internal() : super.internal();
 
@@ -25174,6 +26129,8 @@
 
 @DocsEditable
 @DomName('HTMLFrameSetElement')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#frameset
+@deprecated // deprecated
 abstract class _HTMLFrameSetElement extends _Element_Merged {
   _HTMLFrameSetElement.internal() : super.internal();
 
@@ -25187,6 +26144,8 @@
 
 @DocsEditable
 @DomName('HTMLMarqueeElement')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-marquee-element
+@deprecated // deprecated
 abstract class _HTMLMarqueeElement extends _Element_Merged {
   _HTMLMarqueeElement.internal() : super.internal();
 
@@ -25200,6 +26159,8 @@
 
 @DocsEditable
 @DomName('NamedNodeMap')
+// http://dom.spec.whatwg.org/#namednodemap
+@deprecated // deprecated
 class _NamedNodeMap extends NativeFieldWrapperClass1 with ListMixin<Node>, ImmutableListMixin<Node> implements List<Node> {
   _NamedNodeMap.internal();
 
@@ -25290,6 +26251,7 @@
 
 @DocsEditable
 @DomName('PagePopupController')
+@deprecated // nonstandard
 abstract class _PagePopupController extends NativeFieldWrapperClass1 {
   _PagePopupController.internal();
 
@@ -25303,6 +26265,8 @@
 
 @DocsEditable
 @DomName('RGBColor')
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 abstract class _RGBColor extends NativeFieldWrapperClass1 {
   _RGBColor.internal();
 
@@ -25326,6 +26290,8 @@
 
 @DocsEditable
 @DomName('Rect')
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 abstract class _Rect extends NativeFieldWrapperClass1 {
   _Rect.internal();
 
@@ -25339,6 +26305,8 @@
 
 @DocsEditable
 @DomName('SharedWorker')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#shared-workers-and-the-sharedworker-interface
+@Experimental
 abstract class _SharedWorker extends AbstractWorker {
   _SharedWorker.internal() : super.internal();
 
@@ -25361,6 +26329,8 @@
 
 @DocsEditable
 @DomName('SharedWorkerContext')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#shared-workers-and-the-sharedworkerglobalscope-interface
+@Experimental // nonstandard
 abstract class _SharedWorkerContext extends _WorkerContext {
   _SharedWorkerContext.internal() : super.internal();
 
@@ -25374,6 +26344,8 @@
 
 @DocsEditable
 @DomName('SpeechInputResultList')
+// http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#speech_input_result_list_interface
+@Experimental
 class _SpeechInputResultList extends NativeFieldWrapperClass1 with ListMixin<SpeechInputResult>, ImmutableListMixin<SpeechInputResult> implements List<SpeechInputResult> {
   _SpeechInputResultList.internal();
 
@@ -25440,6 +26412,8 @@
 
 @DocsEditable
 @DomName('SpeechRecognitionResultList')
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechrecognitionresultlist
+@Experimental
 class _SpeechRecognitionResultList extends NativeFieldWrapperClass1 with ListMixin<SpeechRecognitionResult>, ImmutableListMixin<SpeechRecognitionResult> implements List<SpeechRecognitionResult> {
   _SpeechRecognitionResultList.internal();
 
@@ -25572,6 +26546,8 @@
 
 @DocsEditable
 @DomName('WebKitCSSFilterValue')
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 abstract class _WebKitCSSFilterValue extends _CssValueList {
   _WebKitCSSFilterValue.internal() : super.internal();
 
@@ -25588,6 +26564,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 abstract class _WebKitCSSMatrix extends NativeFieldWrapperClass1 {
   _WebKitCSSMatrix.internal();
 
@@ -25610,6 +26588,8 @@
 
 @DocsEditable
 @DomName('WebKitCSSMixFunctionValue')
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 abstract class _WebKitCSSMixFunctionValue extends _CssValueList {
   _WebKitCSSMixFunctionValue.internal() : super.internal();
 
@@ -25623,6 +26603,8 @@
 
 @DocsEditable
 @DomName('WebKitCSSTransformValue')
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 abstract class _WebKitCSSTransformValue extends _CssValueList {
   _WebKitCSSTransformValue.internal() : super.internal();
 
@@ -25636,6 +26618,8 @@
 
 @DocsEditable
 @DomName('WorkerContext')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#WorkerGlobalScope-partial
+@Experimental // stable
 abstract class _WorkerContext extends EventTarget {
   _WorkerContext.internal() : super.internal();
 
@@ -25649,6 +26633,8 @@
 
 @DocsEditable
 @DomName('WorkerLocation')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workerlocation
+@Experimental
 abstract class _WorkerLocation extends NativeFieldWrapperClass1 {
   _WorkerLocation.internal();
 
@@ -25662,6 +26648,8 @@
 
 @DocsEditable
 @DomName('WorkerNavigator')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workernavigator
+@Experimental
 abstract class _WorkerNavigator extends NativeFieldWrapperClass1 {
   _WorkerNavigator.internal();
 
diff --git a/sdk/lib/html/html_common/metadata.dart b/sdk/lib/html/html_common/metadata.dart
index d77557d..82e0be9 100644
--- a/sdk/lib/html/html_common/metadata.dart
+++ b/sdk/lib/html/html_common/metadata.dart
@@ -42,7 +42,7 @@
 
 
 /**
- * Metadata that specifies the DOM name associated with the element.
+ * Annotation that specifies that a member is editable through generate files.
  *
  * This is used for API generation.
  *
@@ -54,6 +54,15 @@
 }
 
 
-/// Metadata that specifies that that member is editable through generated
-/// files.
+/**
+ * Metadata that specifies that that member is editable through generated
+ * files.
+ */
 class DocsEditable {}
+
+
+/**
+ * Annotation that indicates that an API is not expected to change but has
+ * not undergone enough testing to be considered stable.
+ */
+class Unstable {}
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index 80671f8..b8427c5 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -138,6 +138,7 @@
 
 
 @DomName('IDBCursor')
+@Unstable
 class Cursor native "IDBCursor" {
   @DomName('IDBCursor.delete')
   Future delete() {
@@ -209,6 +210,7 @@
 
 @DocsEditable
 @DomName('IDBCursorWithValue')
+@Unstable
 class CursorWithValue extends Cursor native "IDBCursorWithValue" {
 
   dynamic get value => _convertNativeToDart_IDBAny(this._get_value);
@@ -230,6 +232,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @Experimental
+@Unstable
 class Database extends EventTarget native "IDBDatabase" {
   @DomName('IDBDatabase.createObjectStore')
   @DocsEditable
@@ -352,6 +355,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @Experimental
+@Unstable
 class IdbFactory native "IDBFactory" {
   /**
    * Checks to see if Indexed DB is supported on the current platform.
@@ -481,6 +485,7 @@
 
 
 @DomName('IDBIndex')
+@Unstable
 class Index native "IDBIndex" {
   @DomName('IDBIndex.count')
   Future<int> count([key_OR_range]) {
@@ -639,6 +644,7 @@
 
 
 @DomName('IDBKeyRange')
+@Unstable
 class KeyRange native "IDBKeyRange" {
   @DomName('IDBKeyRange.only')
   factory KeyRange.only(/*Key*/ value) =>
@@ -702,6 +708,7 @@
 
 
 @DomName('IDBObjectStore')
+@Unstable
 class ObjectStore native "IDBObjectStore" {
 
   @DomName('IDBObjectStore.add')
@@ -1030,6 +1037,7 @@
 
 @DocsEditable
 @DomName('IDBOpenDBRequest')
+@Unstable
 class OpenDBRequest extends Request implements EventTarget native "IDBOpenDBRequest" {
 
   @DomName('IDBOpenDBRequest.blockedEvent')
@@ -1055,6 +1063,7 @@
 
 @DocsEditable
 @DomName('IDBRequest')
+@Unstable
 class Request extends EventTarget native "IDBRequest" {
 
   @DomName('IDBRequest.errorEvent')
@@ -1125,6 +1134,7 @@
 
 
 @DomName('IDBTransaction')
+@Unstable
 class Transaction extends EventTarget native "IDBTransaction" {
 
   /**
@@ -1227,6 +1237,7 @@
 
 @DocsEditable
 @DomName('IDBVersionChangeEvent')
+@Unstable
 class VersionChangeEvent extends Event native "IDBVersionChangeEvent" {
 
   @DomName('IDBVersionChangeEvent.newVersion')
@@ -1244,5 +1255,6 @@
 
 @DocsEditable
 @DomName('IDBAny')
+@deprecated // nonstandard
 abstract class _IDBAny 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 71b47ad..15076fb 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -39,6 +39,7 @@
 
 
 @DomName('IDBCursor')
+@Unstable
 class Cursor extends NativeFieldWrapperClass1 {
   @DomName('IDBCursor.delete')
   Future delete() {
@@ -86,6 +87,7 @@
 
   @DomName('IDBCursor.next')
   @DocsEditable
+  @Experimental // non-standard
   void next([Object key]) native "IDBCursor_next_Callback";
 
   @DomName('IDBCursor.update')
@@ -102,6 +104,7 @@
 
 @DocsEditable
 @DomName('IDBCursorWithValue')
+@Unstable
 class CursorWithValue extends Cursor {
   CursorWithValue.internal() : super.internal();
 
@@ -121,6 +124,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @Experimental
+@Unstable
 class Database extends EventTarget {
   @DomName('IDBDatabase.createObjectStore')
   @DocsEditable
@@ -229,6 +233,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @Experimental
+@Unstable
 class IdbFactory extends NativeFieldWrapperClass1 {
   /**
    * Checks to see if Indexed DB is supported on the current platform.
@@ -353,6 +358,7 @@
 
 
 @DomName('IDBIndex')
+@Unstable
 class Index extends NativeFieldWrapperClass1 {
   @DomName('IDBIndex.count')
   Future<int> count([key_OR_range]) {
@@ -544,6 +550,7 @@
 
 
 @DomName('IDBKeyRange')
+@Unstable
 class KeyRange extends NativeFieldWrapperClass1 {
   @DomName('IDBKeyRange.only')
   factory KeyRange.only(/*Key*/ value) =>
@@ -583,18 +590,22 @@
 
   @DomName('IDBKeyRange.bound_')
   @DocsEditable
+  @Experimental // non-standard
   static KeyRange bound_(Object lower, Object upper, [bool lowerOpen, bool upperOpen]) native "IDBKeyRange_bound__Callback";
 
   @DomName('IDBKeyRange.lowerBound_')
   @DocsEditable
+  @Experimental // non-standard
   static KeyRange lowerBound_(Object bound, [bool open]) native "IDBKeyRange_lowerBound__Callback";
 
   @DomName('IDBKeyRange.only_')
   @DocsEditable
+  @Experimental // non-standard
   static KeyRange only_(Object value) native "IDBKeyRange_only__Callback";
 
   @DomName('IDBKeyRange.upperBound_')
   @DocsEditable
+  @Experimental // non-standard
   static KeyRange upperBound_(Object bound, [bool open]) native "IDBKeyRange_upperBound__Callback";
 
 }
@@ -604,6 +615,7 @@
 
 
 @DomName('IDBObjectStore')
+@Unstable
 class ObjectStore extends NativeFieldWrapperClass1 {
 
   @DomName('IDBObjectStore.add')
@@ -888,6 +900,7 @@
 
 @DocsEditable
 @DomName('IDBOpenDBRequest')
+@Unstable
 class OpenDBRequest extends Request implements EventTarget {
   OpenDBRequest.internal() : super.internal();
 
@@ -917,6 +930,7 @@
 
 @DocsEditable
 @DomName('IDBRequest')
+@Unstable
 class Request extends EventTarget {
   Request.internal() : super.internal();
 
@@ -982,6 +996,7 @@
 
 
 @DomName('IDBTransaction')
+@Unstable
 class Transaction extends EventTarget {
 
   /**
@@ -1084,6 +1099,7 @@
 
 @DocsEditable
 @DomName('IDBVersionChangeEvent')
+@Unstable
 class VersionChangeEvent extends Event {
   VersionChangeEvent.internal() : super.internal();
 
@@ -1105,6 +1121,7 @@
 
 @DocsEditable
 @DomName('IDBAny')
+@deprecated // nonstandard
 abstract class _IDBAny extends NativeFieldWrapperClass1 {
   _IDBAny.internal();
 
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index c749ceb..dec3633 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -542,38 +542,38 @@
   StreamSubscription _subscription;
   Completer _closeCompleter = new Completer();
   Completer _completer;
+  bool _socketError = false;
 
   _HttpOutboundConsumer(_HttpOutboundMessage this._outbound);
 
-  void _onPause() {
-    if (_controller.isPaused) {
-      _subscription.pause();
-    } else {
-      _subscription.resume();
-    }
-  }
-
-  void _onListen() {
-    if (!_controller.hasListener && _subscription != null) {
+  void _cancel() {
+    if (_subscription != null) {
       _subscription.cancel();
     }
   }
 
   _ensureController() {
     if (_controller != null) return;
-    _controller = new StreamController(onPause: _onPause,
-                                       onResume: _onPause,
-                                       onListen: _onListen,
-                                       onCancel: _onListen);
+    _controller = new StreamController(onPause: () => _subscription.pause(),
+                                       onResume: () => _subscription.resume(),
+                                       onCancel: _cancel);
     _outbound._addStream(_controller.stream)
         .then((_) {
-                _onListen();  // Make sure we unsubscribe.
+                _cancel();
                 _done();
                 _closeCompleter.complete(_outbound);
               },
               onError: (error) {
-                if (!_done(error)) {
-                  _closeCompleter.completeError(error);
+                _socketError = true;
+                if (error is SocketIOException &&
+                    _outbound is HttpResponse) {
+                  _cancel();
+                  _done();
+                  _closeCompleter.complete(_outbound);
+                } else {
+                  if (!_done(error)) {
+                    _closeCompleter.completeError(error);
+                  }
                 }
               });
   }
@@ -590,7 +590,12 @@
   }
 
   Future addStream(var stream) {
-    _ensureController();
+    // If we saw a socket error subscribe and then cancel, to ignore any data
+    // on the stream.
+    if (_socketError) {
+      stream.listen(null).cancel();
+      return new Future.value(_outbound);
+    }
     _completer = new Completer();
     _subscription = stream.listen(
         (data) {
@@ -603,11 +608,13 @@
           _done(error);
         },
         cancelOnError: true);
+    _ensureController();
     return _completer.future;
   }
 
   Future close() {
     Future closeOutbound() {
+      if (_socketError) return new Future.value(_outbound);
       return _outbound._close().then((_) => _outbound);
     }
     if (_controller == null) return closeOutbound();
@@ -1759,7 +1766,7 @@
           destroy();
         },
         onError: (error) {
-          _httpServer._handleError(error);
+          // Ignore failed requests that was closed before headers was received.
           destroy();
         });
   }
diff --git a/sdk/lib/io/process.dart b/sdk/lib/io/process.dart
index 6e9b1cd..a8e7bbc 100644
--- a/sdk/lib/io/process.dart
+++ b/sdk/lib/io/process.dart
@@ -72,83 +72,67 @@
    * process. If the process cannot be started the returned [Future]
    * completes with an exception.
    *
-   * An optional [ProcessOptions] object can be passed to specify
-   * options other than the executable and the arguments.
+   * Use [workingDirectory] to set the working directory for the process. Note
+   * that the change of directory occurs before executing the process on some
+   * platforms, which may have impact when using relative paths for the
+   * executable and the arguments.
+   *
+   * Use [environment] to set the environment variables for the process. If not
+   * set the environment of the parent process is inherited. Currently, only
+   * US-ASCII environment variables are supported and errors are likely to occur
+   * if an environment variable with code-points outside the US-ASCII range is
+   * passed in.
+   *
+   * If [runInShell] is true, the process will be spawned through a system
+   * shell. On Linux and Mac OS, [:/bin/sh:] is used, while
+   * [:%WINDIR%\system32\cmd.exe:] is used on Windows.
    *
    * Users must read all data coming on the [stdout] and [stderr]
    * streams of processes started with [:Process.start:]. If the user
    * does not read all data on the streams the underlying system
    * resources will not be freed since there is still pending data.
    */
-  external static Future<Process> start(String executable,
-                                        List<String> arguments,
-                                        [ProcessOptions options]);
+  external static Future<Process> start(
+      String executable,
+      List<String> arguments,
+      {String workingDirectory,
+       Map<String, String> environment,
+       bool runInShell: false});
 
   /**
    * Starts a process and runs it non-interactively to completion. The
    * process run is [executable] with the specified [arguments].
    *
-   * An optional [ProcessOptions] object can be passed to specify
-   * options other than the executable and the arguments.
+   * Use [workingDirectory] to set the working directory for the process. Note
+   * that the change of directory occurs before executing the process on some
+   * platforms, which may have impact when using relative paths for the
+   * executable and the arguments.
+   *
+   * Use [environment] to set the environment variables for the process. If not
+   * set the environment of the parent process is inherited. Currently, only
+   * US-ASCII environment variables are supported and errors are likely to occur
+   * if an environment variable with code-points outside the US-ASCII range is
+   * passed in.
+   *
+   * If [runInShell] is true, the process will be spawned through a system
+   * shell. On Linux and Mac OS, [:/bin/sh:] is used, while
+   * [:%WINDIR%\system32\cmd.exe:] is used on Windows.
+   *
+   * The encoding used for text on stdout and stderr can be set by changing
+   * [stdoutEncoding] and [stderrEncoding]. The default encoding is SYSTEM.
    *
    * Returns a [:Future<ProcessResult>:] that completes with the
    * result of running the process, i.e., exit code, standard out and
    * standard in.
    */
-  external static Future<ProcessResult> run(String executable,
-                                            List<String> arguments,
-                                            [ProcessOptions options]);
-
-  /**
-   * Starts a process in the system shell and runs it non-interactively to
-   * completion.
-   *
-   * On Linux and Mac OS, [:/bin/sh:] is used to execute the [executable].
-   * On Windows, [:%WINDIR%\system32\cmd.exe:] is used.
-   *
-   * An optional [ProcessOptions] object can be passed to specify
-   * options other than the executable and the arguments.
-   *
-   * Returns a [:Future<ProcessResult>:] that completes with the
-   * result of running the process, i.e., exit code, standard out and
-   * standard in.
-   */
-  static Future<ProcessResult> runShell(String executable,
-                                        List<String> arguments,
-                                        [ProcessOptions options])
-      => run(_getShellCommand(),
-             _getShellArguments(executable, arguments),
-             options);
-
-  static String _getShellCommand() {
-    if (Platform.operatingSystem == 'windows') {
-      return 'cmd.exe';
-    }
-    return '/bin/sh';
-  }
-
-  static List<String> _getShellArguments(String executable,
-                                         List<String> arguments) {
-    List<String> shellArguments = [];
-    if (Platform.operatingSystem == 'windows') {
-      shellArguments.add('/c');
-      shellArguments.add(executable);
-      for (var arg in arguments) {
-        arg = arg.replaceAll('"', r'\"');
-        shellArguments.add(arg);
-      }
-    } else {
-      var commandLine = new StringBuffer();
-      commandLine.write(executable);
-      shellArguments.add("-c");
-      for (var arg in arguments) {
-        arg = arg.replaceAll("'", "'\"'\"'");
-        commandLine.write(" '$arg'");
-      }
-      shellArguments.add(commandLine.toString());
-    }
-    return shellArguments;
-  }
+  external static Future<ProcessResult> run(
+      String executable,
+      List<String> arguments,
+      {String workingDirectory,
+       Map<String, String> environment,
+       bool runInShell: false,
+       Encoding stdoutEncoding: Encoding.SYSTEM,
+       Encoding stderrEncoding: Encoding.SYSTEM});
 
   /**
    * Returns the standard output stream of the process as a [:Stream:].
@@ -233,52 +217,6 @@
 
 
 /**
- * [ProcessOptions] represents the options that can be supplied when
- * starting a process.
- */
-class ProcessOptions {
-  /**
-   * The working directory from which the process is started.  Note
-   * that the change of directory occurs before executing the process
-   * on some platforms, which may have impact when using relative
-   * paths for the executable and the arguments.
-   */
-  String workingDirectory;
-
-  /**
-   * The encoding used for text on stdout when starting a
-   * non-interactive process with [:Process.run:].
-   *
-   * This option is ignored for interactive processes started with
-   * [:Process.start:].
-   *
-   * The default stdoutEncoding is SYSTEM.
-   */
-  Encoding stdoutEncoding;
-
-  /**
-   * The encoding used for text on stderr when starting a
-   * non-interactive process with [:Process.run:].
-   *
-   * This option is ignored for interactive processes started with
-   * [:Process.start:].
-   *
-   * The default stderrEncoding is SYSTEM.
-   */
-  Encoding stderrEncoding;
-
-  /**
-   * Provides the environment variables for the process. If not set
-   * the environment of the parent process is inherited.
-   *
-   * Currently, only ASCII environment variables are supported and
-   * errors are likely to occur if an environment variables with
-   * code-points outside the ASCII range is passed in.
-   */
-  Map<String, String> environment;
-}
-
-/**
  * On Posix systems, [ProcessSignal] is used to send a specific signal
  * to a child process, see [:Process.kill:].
  */
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index 564670f..62fb74b 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -63,6 +63,7 @@
 
 @DocsEditable
 @DomName('SVGAElement')
+@Unstable
 class AElement extends StyledElement implements UriReference, Tests, Transformable, ExternalResourcesRequired, LangSpace native "SVGAElement" {
 
   @DomName('SVGAElement.SVGAElement')
@@ -157,6 +158,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class AltGlyphElement extends TextPositioningElement implements UriReference native "SVGAltGlyphElement" {
 
   @DomName('SVGAltGlyphElement.SVGAltGlyphElement')
@@ -187,6 +189,7 @@
 
 @DocsEditable
 @DomName('SVGAngle')
+@Unstable
 class Angle native "SVGAngle" {
 
   @DomName('SVGAngle.SVG_ANGLETYPE_DEG')
@@ -243,6 +246,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class AnimateElement extends AnimationElement native "SVGAnimateElement" {
 
   @DomName('SVGAnimateElement.SVGAnimateElement')
@@ -262,6 +266,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class AnimateMotionElement extends AnimationElement native "SVGAnimateMotionElement" {
 
   @DomName('SVGAnimateMotionElement.SVGAnimateMotionElement')
@@ -281,6 +286,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class AnimateTransformElement extends AnimationElement native "SVGAnimateTransformElement" {
 
   @DomName('SVGAnimateTransformElement.SVGAnimateTransformElement')
@@ -297,6 +303,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedAngle')
+@Unstable
 class AnimatedAngle native "SVGAnimatedAngle" {
 
   @DomName('SVGAnimatedAngle.animVal')
@@ -314,6 +321,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedBoolean')
+@Unstable
 class AnimatedBoolean native "SVGAnimatedBoolean" {
 
   @DomName('SVGAnimatedBoolean.animVal')
@@ -331,6 +339,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedEnumeration')
+@Unstable
 class AnimatedEnumeration native "SVGAnimatedEnumeration" {
 
   @DomName('SVGAnimatedEnumeration.animVal')
@@ -348,6 +357,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedInteger')
+@Unstable
 class AnimatedInteger native "SVGAnimatedInteger" {
 
   @DomName('SVGAnimatedInteger.animVal')
@@ -365,6 +375,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedLength')
+@Unstable
 class AnimatedLength native "SVGAnimatedLength" {
 
   @DomName('SVGAnimatedLength.animVal')
@@ -382,6 +393,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedLengthList')
+@Unstable
 class AnimatedLengthList native "SVGAnimatedLengthList" {
 
   @DomName('SVGAnimatedLengthList.animVal')
@@ -399,6 +411,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedNumber')
+@Unstable
 class AnimatedNumber native "SVGAnimatedNumber" {
 
   @DomName('SVGAnimatedNumber.animVal')
@@ -416,6 +429,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedNumberList')
+@Unstable
 class AnimatedNumberList native "SVGAnimatedNumberList" {
 
   @DomName('SVGAnimatedNumberList.animVal')
@@ -433,6 +447,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedPreserveAspectRatio')
+@Unstable
 class AnimatedPreserveAspectRatio native "SVGAnimatedPreserveAspectRatio" {
 
   @DomName('SVGAnimatedPreserveAspectRatio.animVal')
@@ -450,6 +465,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedRect')
+@Unstable
 class AnimatedRect native "SVGAnimatedRect" {
 
   @DomName('SVGAnimatedRect.animVal')
@@ -467,6 +483,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedString')
+@Unstable
 class AnimatedString native "SVGAnimatedString" {
 
   @DomName('SVGAnimatedString.animVal')
@@ -484,6 +501,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedTransformList')
+@Unstable
 class AnimatedTransformList native "SVGAnimatedTransformList" {
 
   @DomName('SVGAnimatedTransformList.animVal')
@@ -501,6 +519,7 @@
 
 @DocsEditable
 @DomName('SVGAnimationElement')
+@Unstable
 class AnimationElement extends SvgElement implements Tests, ElementTimeControl, ExternalResourcesRequired native "SVGAnimationElement" {
 
   @DomName('SVGAnimationElement.SVGAnimationElement')
@@ -572,6 +591,7 @@
 
 @DocsEditable
 @DomName('SVGCircleElement')
+@Unstable
 class CircleElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace native "SVGCircleElement" {
 
   @DomName('SVGCircleElement.SVGCircleElement')
@@ -665,6 +685,7 @@
 
 @DocsEditable
 @DomName('SVGClipPathElement')
+@Unstable
 class ClipPathElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace native "SVGClipPathElement" {
 
   @DomName('SVGClipPathElement.SVGClipPathElement')
@@ -750,6 +771,7 @@
 
 @DocsEditable
 @DomName('SVGDefsElement')
+@Unstable
 class DefsElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace native "SVGDefsElement" {
 
   @DomName('SVGDefsElement.SVGDefsElement')
@@ -831,6 +853,7 @@
 
 @DocsEditable
 @DomName('SVGDescElement')
+@Unstable
 class DescElement extends StyledElement implements LangSpace native "SVGDescElement" {
 
   @DomName('SVGDescElement.SVGDescElement')
@@ -854,6 +877,7 @@
 
 @DocsEditable
 @DomName('SVGElementInstance')
+@Unstable
 class ElementInstance extends EventTarget native "SVGElementInstance" {
 
   @DomName('SVGElementInstance.abortEvent')
@@ -998,6 +1022,8 @@
 
   @DomName('SVGElementInstance.searchEvent')
   @DocsEditable
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental
   static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
 
   @DomName('SVGElementInstance.selectEvent')
@@ -1192,6 +1218,8 @@
 
   @DomName('SVGElementInstance.onsearch')
   @DocsEditable
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental
   Stream<Event> get onSearch => searchEvent.forTarget(this);
 
   @DomName('SVGElementInstance.onselect')
@@ -1216,6 +1244,7 @@
 
 
 @DomName('ElementTimeControl')
+@Unstable
 abstract class ElementTimeControl {
 
   void beginElement();
@@ -1233,6 +1262,7 @@
 
 @DocsEditable
 @DomName('SVGEllipseElement')
+@Unstable
 class EllipseElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace native "SVGEllipseElement" {
 
   @DomName('SVGEllipseElement.SVGEllipseElement')
@@ -1329,6 +1359,7 @@
 
 
 @DomName('SVGExternalResourcesRequired')
+@Unstable
 abstract class ExternalResourcesRequired {
 
   /// Checks if this type is supported on the current platform.
@@ -1347,6 +1378,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEBlendElement extends StyledElement implements FilterPrimitiveStandardAttributes native "SVGFEBlendElement" {
 
   @DomName('SVGFEBlendElement.SVGFEBlendElement')
@@ -1425,6 +1457,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEColorMatrixElement extends StyledElement implements FilterPrimitiveStandardAttributes native "SVGFEColorMatrixElement" {
 
   @DomName('SVGFEColorMatrixElement.SVGFEColorMatrixElement')
@@ -1499,6 +1532,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEComponentTransferElement extends StyledElement implements FilterPrimitiveStandardAttributes native "SVGFEComponentTransferElement" {
 
   @DomName('SVGFEComponentTransferElement.SVGFEComponentTransferElement')
@@ -1541,6 +1575,7 @@
 
 @DocsEditable
 @DomName('SVGFECompositeElement')
+@Unstable
 class FECompositeElement extends StyledElement implements FilterPrimitiveStandardAttributes native "SVGFECompositeElement" {
 
   @DomName('SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC')
@@ -1632,6 +1667,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEConvolveMatrixElement extends StyledElement implements FilterPrimitiveStandardAttributes native "SVGFEConvolveMatrixElement" {
 
   @DomName('SVGFEConvolveMatrixElement.SVGFEConvolveMatrixElement')
@@ -1738,6 +1774,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEDiffuseLightingElement extends StyledElement implements FilterPrimitiveStandardAttributes native "SVGFEDiffuseLightingElement" {
 
   @DomName('SVGFEDiffuseLightingElement.SVGFEDiffuseLightingElement')
@@ -1800,6 +1837,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEDisplacementMapElement extends StyledElement implements FilterPrimitiveStandardAttributes native "SVGFEDisplacementMapElement" {
 
   @DomName('SVGFEDisplacementMapElement.SVGFEDisplacementMapElement')
@@ -1882,6 +1920,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEDistantLightElement extends SvgElement native "SVGFEDistantLightElement" {
 
   @DomName('SVGFEDistantLightElement.SVGFEDistantLightElement')
@@ -1910,6 +1949,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEFloodElement extends StyledElement implements FilterPrimitiveStandardAttributes native "SVGFEFloodElement" {
 
   @DomName('SVGFEFloodElement.SVGFEFloodElement')
@@ -1952,6 +1992,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEFuncAElement extends _SVGComponentTransferFunctionElement native "SVGFEFuncAElement" {
 
   @DomName('SVGFEFuncAElement.SVGFEFuncAElement')
@@ -1972,6 +2013,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEFuncBElement extends _SVGComponentTransferFunctionElement native "SVGFEFuncBElement" {
 
   @DomName('SVGFEFuncBElement.SVGFEFuncBElement')
@@ -1992,6 +2034,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEFuncGElement extends _SVGComponentTransferFunctionElement native "SVGFEFuncGElement" {
 
   @DomName('SVGFEFuncGElement.SVGFEFuncGElement')
@@ -2012,6 +2055,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEFuncRElement extends _SVGComponentTransferFunctionElement native "SVGFEFuncRElement" {
 
   @DomName('SVGFEFuncRElement.SVGFEFuncRElement')
@@ -2032,6 +2076,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEGaussianBlurElement extends StyledElement implements FilterPrimitiveStandardAttributes native "SVGFEGaussianBlurElement" {
 
   @DomName('SVGFEGaussianBlurElement.SVGFEGaussianBlurElement')
@@ -2090,6 +2135,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEImageElement extends StyledElement implements FilterPrimitiveStandardAttributes, UriReference, ExternalResourcesRequired, LangSpace native "SVGFEImageElement" {
 
   @DomName('SVGFEImageElement.SVGFEImageElement')
@@ -2158,6 +2204,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEMergeElement extends StyledElement implements FilterPrimitiveStandardAttributes native "SVGFEMergeElement" {
 
   @DomName('SVGFEMergeElement.SVGFEMergeElement')
@@ -2200,6 +2247,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEMergeNodeElement extends SvgElement native "SVGFEMergeNodeElement" {
 
   @DomName('SVGFEMergeNodeElement.SVGFEMergeNodeElement')
@@ -2224,6 +2272,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEMorphologyElement extends StyledElement implements FilterPrimitiveStandardAttributes native "SVGFEMorphologyElement" {
 
   @DomName('SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE')
@@ -2291,6 +2340,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEOffsetElement extends StyledElement implements FilterPrimitiveStandardAttributes native "SVGFEOffsetElement" {
 
   @DomName('SVGFEOffsetElement.SVGFEOffsetElement')
@@ -2345,6 +2395,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEPointLightElement extends SvgElement native "SVGFEPointLightElement" {
 
   @DomName('SVGFEPointLightElement.SVGFEPointLightElement')
@@ -2377,6 +2428,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FESpecularLightingElement extends StyledElement implements FilterPrimitiveStandardAttributes native "SVGFESpecularLightingElement" {
 
   @DomName('SVGFESpecularLightingElement.SVGFESpecularLightingElement')
@@ -2435,6 +2487,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FESpotLightElement extends SvgElement native "SVGFESpotLightElement" {
 
   @DomName('SVGFESpotLightElement.SVGFESpotLightElement')
@@ -2487,6 +2540,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FETileElement extends StyledElement implements FilterPrimitiveStandardAttributes native "SVGFETileElement" {
 
   @DomName('SVGFETileElement.SVGFETileElement')
@@ -2533,6 +2587,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FETurbulenceElement extends StyledElement implements FilterPrimitiveStandardAttributes native "SVGFETurbulenceElement" {
 
   @DomName('SVGFETurbulenceElement.SVGFETurbulenceElement')
@@ -2623,6 +2678,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FilterElement extends StyledElement implements UriReference, ExternalResourcesRequired, LangSpace native "SVGFilterElement" {
 
   @DomName('SVGFilterElement.SVGFilterElement')
@@ -2696,6 +2752,7 @@
 
 
 @DomName('SVGFilterPrimitiveStandardAttributes')
+@Unstable
 abstract class FilterPrimitiveStandardAttributes {
 
   AnimatedLength height;
@@ -2714,6 +2771,7 @@
 
 
 @DomName('SVGFitToViewBox')
+@Unstable
 abstract class FitToViewBox {
 
   AnimatedPreserveAspectRatio preserveAspectRatio;
@@ -2730,6 +2788,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class ForeignObjectElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace native "SVGForeignObjectElement" {
 
   @DomName('SVGForeignObjectElement.SVGForeignObjectElement')
@@ -2830,6 +2889,7 @@
 
 @DocsEditable
 @DomName('SVGGElement')
+@Unstable
 class GElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace native "SVGGElement" {
 
   @DomName('SVGGElement.SVGGElement')
@@ -2911,6 +2971,7 @@
 
 @DocsEditable
 @DomName('SVGImageElement')
+@Unstable
 class ImageElement extends StyledElement implements UriReference, Tests, Transformable, ExternalResourcesRequired, LangSpace native "SVGImageElement" {
 
   @DomName('SVGImageElement.SVGImageElement')
@@ -3017,6 +3078,7 @@
 
 
 @DomName('SVGLangSpace')
+@Unstable
 abstract class LangSpace {
 
   /// Checks if this type is supported on the current platform.
@@ -3033,6 +3095,7 @@
 
 @DocsEditable
 @DomName('SVGLength')
+@Unstable
 class Length native "SVGLength" {
 
   @DomName('SVGLength.SVG_LENGTHTYPE_CM')
@@ -3110,6 +3173,7 @@
 
 @DocsEditable
 @DomName('SVGLengthList')
+@Unstable
 class LengthList extends Interceptor with ListMixin<Length>, ImmutableListMixin<Length> implements JavaScriptIndexingBehavior, List<Length> native "SVGLengthList" {
 
   @DomName('SVGLengthList.numberOfItems')
@@ -3197,6 +3261,7 @@
 
 @DocsEditable
 @DomName('SVGLineElement')
+@Unstable
 class LineElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace native "SVGLineElement" {
 
   @DomName('SVGLineElement.SVGLineElement')
@@ -3294,6 +3359,7 @@
 
 @DocsEditable
 @DomName('SVGLinearGradientElement')
+@Unstable
 class LinearGradientElement extends _GradientElement native "SVGLinearGradientElement" {
 
   @DomName('SVGLinearGradientElement.SVGLinearGradientElement')
@@ -3322,6 +3388,7 @@
 
 
 @DomName('SVGLocatable')
+@Unstable
 abstract class Locatable {
 
   SvgElement farthestViewportElement;
@@ -3343,6 +3410,7 @@
 
 @DocsEditable
 @DomName('SVGMarkerElement')
+@Unstable
 class MarkerElement extends StyledElement implements FitToViewBox, ExternalResourcesRequired, LangSpace native "SVGMarkerElement" {
 
   @DomName('SVGMarkerElement.SVGMarkerElement')
@@ -3442,6 +3510,7 @@
 
 @DocsEditable
 @DomName('SVGMaskElement')
+@Unstable
 class MaskElement extends StyledElement implements Tests, ExternalResourcesRequired, LangSpace native "SVGMaskElement" {
 
   @DomName('SVGMaskElement.SVGMaskElement')
@@ -3513,6 +3582,7 @@
 
 @DocsEditable
 @DomName('SVGMatrix')
+@Unstable
 class Matrix native "SVGMatrix" {
 
   @DomName('SVGMatrix.a')
@@ -3590,6 +3660,7 @@
 
 @DocsEditable
 @DomName('SVGMetadataElement')
+@Unstable
 class MetadataElement extends SvgElement native "SVGMetadataElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3599,6 +3670,7 @@
 
 @DocsEditable
 @DomName('SVGNumber')
+@Unstable
 class Number native "SVGNumber" {
 
   @DomName('SVGNumber.value')
@@ -3612,6 +3684,7 @@
 
 @DocsEditable
 @DomName('SVGNumberList')
+@Unstable
 class NumberList extends Interceptor with ListMixin<Number>, ImmutableListMixin<Number> implements JavaScriptIndexingBehavior, List<Number> native "SVGNumberList" {
 
   @DomName('SVGNumberList.numberOfItems')
@@ -3699,6 +3772,7 @@
 
 @DocsEditable
 @DomName('SVGPathElement')
+@Unstable
 class PathElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace native "SVGPathElement" {
 
   @DomName('SVGPathElement.SVGPathElement')
@@ -3907,6 +3981,7 @@
 
 @DocsEditable
 @DomName('SVGPathSeg')
+@Unstable
 class PathSeg native "SVGPathSeg" {
 
   @DomName('SVGPathSeg.PATHSEG_ARC_ABS')
@@ -4004,6 +4079,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegArcAbs')
+@Unstable
 class PathSegArcAbs extends PathSeg native "SVGPathSegArcAbs" {
 
   @DomName('SVGPathSegArcAbs.angle')
@@ -4041,6 +4117,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegArcRel')
+@Unstable
 class PathSegArcRel extends PathSeg native "SVGPathSegArcRel" {
 
   @DomName('SVGPathSegArcRel.angle')
@@ -4078,6 +4155,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegClosePath')
+@Unstable
 class PathSegClosePath extends PathSeg native "SVGPathSegClosePath" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4087,6 +4165,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegCurvetoCubicAbs')
+@Unstable
 class PathSegCurvetoCubicAbs extends PathSeg native "SVGPathSegCurvetoCubicAbs" {
 
   @DomName('SVGPathSegCurvetoCubicAbs.x')
@@ -4120,6 +4199,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegCurvetoCubicRel')
+@Unstable
 class PathSegCurvetoCubicRel extends PathSeg native "SVGPathSegCurvetoCubicRel" {
 
   @DomName('SVGPathSegCurvetoCubicRel.x')
@@ -4153,6 +4233,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegCurvetoCubicSmoothAbs')
+@Unstable
 class PathSegCurvetoCubicSmoothAbs extends PathSeg native "SVGPathSegCurvetoCubicSmoothAbs" {
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
@@ -4178,6 +4259,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegCurvetoCubicSmoothRel')
+@Unstable
 class PathSegCurvetoCubicSmoothRel extends PathSeg native "SVGPathSegCurvetoCubicSmoothRel" {
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
@@ -4203,6 +4285,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegCurvetoQuadraticAbs')
+@Unstable
 class PathSegCurvetoQuadraticAbs extends PathSeg native "SVGPathSegCurvetoQuadraticAbs" {
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x')
@@ -4228,6 +4311,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegCurvetoQuadraticRel')
+@Unstable
 class PathSegCurvetoQuadraticRel extends PathSeg native "SVGPathSegCurvetoQuadraticRel" {
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x')
@@ -4253,6 +4337,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegCurvetoQuadraticSmoothAbs')
+@Unstable
 class PathSegCurvetoQuadraticSmoothAbs extends PathSeg native "SVGPathSegCurvetoQuadraticSmoothAbs" {
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
@@ -4270,6 +4355,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegCurvetoQuadraticSmoothRel')
+@Unstable
 class PathSegCurvetoQuadraticSmoothRel extends PathSeg native "SVGPathSegCurvetoQuadraticSmoothRel" {
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
@@ -4287,6 +4373,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegLinetoAbs')
+@Unstable
 class PathSegLinetoAbs extends PathSeg native "SVGPathSegLinetoAbs" {
 
   @DomName('SVGPathSegLinetoAbs.x')
@@ -4304,6 +4391,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegLinetoHorizontalAbs')
+@Unstable
 class PathSegLinetoHorizontalAbs extends PathSeg native "SVGPathSegLinetoHorizontalAbs" {
 
   @DomName('SVGPathSegLinetoHorizontalAbs.x')
@@ -4317,6 +4405,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegLinetoHorizontalRel')
+@Unstable
 class PathSegLinetoHorizontalRel extends PathSeg native "SVGPathSegLinetoHorizontalRel" {
 
   @DomName('SVGPathSegLinetoHorizontalRel.x')
@@ -4330,6 +4419,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegLinetoRel')
+@Unstable
 class PathSegLinetoRel extends PathSeg native "SVGPathSegLinetoRel" {
 
   @DomName('SVGPathSegLinetoRel.x')
@@ -4347,6 +4437,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegLinetoVerticalAbs')
+@Unstable
 class PathSegLinetoVerticalAbs extends PathSeg native "SVGPathSegLinetoVerticalAbs" {
 
   @DomName('SVGPathSegLinetoVerticalAbs.y')
@@ -4360,6 +4451,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegLinetoVerticalRel')
+@Unstable
 class PathSegLinetoVerticalRel extends PathSeg native "SVGPathSegLinetoVerticalRel" {
 
   @DomName('SVGPathSegLinetoVerticalRel.y')
@@ -4373,6 +4465,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegList')
+@Unstable
 class PathSegList extends Interceptor with ListMixin<PathSeg>, ImmutableListMixin<PathSeg> implements JavaScriptIndexingBehavior, List<PathSeg> native "SVGPathSegList" {
 
   @DomName('SVGPathSegList.numberOfItems')
@@ -4460,6 +4553,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegMovetoAbs')
+@Unstable
 class PathSegMovetoAbs extends PathSeg native "SVGPathSegMovetoAbs" {
 
   @DomName('SVGPathSegMovetoAbs.x')
@@ -4477,6 +4571,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegMovetoRel')
+@Unstable
 class PathSegMovetoRel extends PathSeg native "SVGPathSegMovetoRel" {
 
   @DomName('SVGPathSegMovetoRel.x')
@@ -4494,6 +4589,7 @@
 
 @DocsEditable
 @DomName('SVGPatternElement')
+@Unstable
 class PatternElement extends StyledElement implements FitToViewBox, UriReference, Tests, ExternalResourcesRequired, LangSpace native "SVGPatternElement" {
 
   @DomName('SVGPatternElement.SVGPatternElement')
@@ -4585,6 +4681,7 @@
 
 @DocsEditable
 @DomName('SVGPoint')
+@Unstable
 class Point native "SVGPoint" {
 
   @DomName('SVGPoint.x')
@@ -4606,6 +4703,7 @@
 
 @DocsEditable
 @DomName('SVGPointList')
+@Unstable
 class PointList native "SVGPointList" {
 
   @DomName('SVGPointList.numberOfItems')
@@ -4647,6 +4745,7 @@
 
 @DocsEditable
 @DomName('SVGPolygonElement')
+@Unstable
 class PolygonElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace native "SVGPolygonElement" {
 
   @DomName('SVGPolygonElement.SVGPolygonElement')
@@ -4736,6 +4835,7 @@
 
 @DocsEditable
 @DomName('SVGPolylineElement')
+@Unstable
 class PolylineElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace native "SVGPolylineElement" {
 
   @DomName('SVGPolylineElement.SVGPolylineElement')
@@ -4825,6 +4925,7 @@
 
 @DocsEditable
 @DomName('SVGPreserveAspectRatio')
+@Unstable
 class PreserveAspectRatio native "SVGPreserveAspectRatio" {
 
   @DomName('SVGPreserveAspectRatio.SVG_MEETORSLICE_MEET')
@@ -4898,6 +4999,7 @@
 
 @DocsEditable
 @DomName('SVGRadialGradientElement')
+@Unstable
 class RadialGradientElement extends _GradientElement native "SVGRadialGradientElement" {
 
   @DomName('SVGRadialGradientElement.SVGRadialGradientElement')
@@ -4935,6 +5037,7 @@
 
 @DocsEditable
 @DomName('SVGRect')
+@Unstable
 class Rect native "SVGRect" {
 
   @DomName('SVGRect.height')
@@ -4960,6 +5063,7 @@
 
 @DocsEditable
 @DomName('SVGRectElement')
+@Unstable
 class RectElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace native "SVGRectElement" {
 
   @DomName('SVGRectElement.SVGRectElement')
@@ -5065,6 +5169,7 @@
 
 @DocsEditable
 @DomName('SVGRenderingIntent')
+@Unstable
 class RenderingIntent native "SVGRenderingIntent" {
 
   @DomName('SVGRenderingIntent.RENDERING_INTENT_ABSOLUTE_COLORIMETRIC')
@@ -5098,6 +5203,7 @@
 
 @DocsEditable
 @DomName('SVGScriptElement')
+@Unstable
 class ScriptElement extends SvgElement implements UriReference, ExternalResourcesRequired native "SVGScriptElement" {
 
   @DomName('SVGScriptElement.SVGScriptElement')
@@ -5130,6 +5236,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class SetElement extends AnimationElement native "SVGSetElement" {
 
   @DomName('SVGSetElement.SVGSetElement')
@@ -5146,6 +5253,7 @@
 
 @DocsEditable
 @DomName('SVGStopElement')
+@Unstable
 class StopElement extends StyledElement native "SVGStopElement" {
 
   @DomName('SVGStopElement.SVGStopElement')
@@ -5164,6 +5272,7 @@
 
 @DocsEditable
 @DomName('SVGStringList')
+@Unstable
 class StringList extends Interceptor with ListMixin<String>, ImmutableListMixin<String> implements JavaScriptIndexingBehavior, List<String> native "SVGStringList" {
 
   @DomName('SVGStringList.numberOfItems')
@@ -5251,6 +5360,8 @@
 
 @DocsEditable
 @DomName('SVGStyleElement')
+// http://www.w3.org/TR/SVG/types.html#InterfaceSVGStylable
+@Experimental // nonstandard
 class StyleElement extends SvgElement implements LangSpace native "SVGStyleElement" {
 
   @DomName('SVGStyleElement.SVGStyleElement')
@@ -5293,6 +5404,7 @@
 
 @DocsEditable
 @DomName('SVGStyledElement')
+@Unstable
 class StyledElement extends SvgElement native "SVGStyledElement" {
 
   // Shadowing definition.
@@ -5308,6 +5420,7 @@
 
 @DocsEditable
 @DomName('SVGDocument')
+@Unstable
 class SvgDocument extends Document native "SVGDocument" {
 
   @DomName('SVGDocument.rootElement')
@@ -5351,6 +5464,7 @@
 }
 
 @DomName('SVGElement')
+@Unstable
 class SvgElement extends Element native "SVGElement" {
   factory SvgElement.tag(String tag) =>
       _SvgElementFactoryProvider.createSvgElement_tag(tag);
@@ -5459,6 +5573,7 @@
 
 @DocsEditable
 @DomName('SVGException')
+@Unstable
 class SvgException native "SVGException" {
 
   @DomName('SVGException.SVG_INVALID_VALUE_ERR')
@@ -5479,10 +5594,12 @@
 
   @DomName('SVGException.message')
   @DocsEditable
+  @Experimental // nonstandard
   final String message;
 
   @DomName('SVGException.name')
   @DocsEditable
+  @Experimental // nonstandard
   final String name;
 
   @DomName('SVGException.toString')
@@ -5495,6 +5612,7 @@
 
 
 @DomName('SVGSVGElement')
+@Unstable
 class SvgSvgElement extends StyledElement implements FitToViewBox, Transformable, Tests, ExternalResourcesRequired, ZoomAndPan, LangSpace native "SVGSVGElement" {
   factory SvgSvgElement() => _SvgSvgElementFactoryProvider.createSvgSvgElement();
 
@@ -5755,6 +5873,7 @@
 
 @DocsEditable
 @DomName('SVGSwitchElement')
+@Unstable
 class SwitchElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace native "SVGSwitchElement" {
 
   @DomName('SVGSwitchElement.SVGSwitchElement')
@@ -5836,6 +5955,7 @@
 
 @DocsEditable
 @DomName('SVGSymbolElement')
+@Unstable
 class SymbolElement extends StyledElement implements FitToViewBox, ExternalResourcesRequired, LangSpace native "SVGSymbolElement" {
 
   @DomName('SVGSymbolElement.SVGSymbolElement')
@@ -5875,6 +5995,7 @@
 
 @DocsEditable
 @DomName('SVGTSpanElement')
+@Unstable
 class TSpanElement extends TextPositioningElement native "SVGTSpanElement" {
 
   @DomName('SVGTSpanElement.SVGTSpanElement')
@@ -5887,6 +6008,7 @@
 
 
 @DomName('SVGTests')
+@Unstable
 abstract class Tests {
 
   StringList requiredExtensions;
@@ -5904,6 +6026,7 @@
 
 @DocsEditable
 @DomName('SVGTextContentElement')
+@Unstable
 class TextContentElement extends StyledElement implements Tests, ExternalResourcesRequired, LangSpace native "SVGTextContentElement" {
 
   @DomName('SVGTextContentElement.LENGTHADJUST_SPACING')
@@ -6003,6 +6126,7 @@
 
 @DocsEditable
 @DomName('SVGTextElement')
+@Unstable
 class TextElement extends TextPositioningElement implements Transformable native "SVGTextElement" {
 
   @DomName('SVGTextElement.SVGTextElement')
@@ -6050,6 +6174,7 @@
 
 @DocsEditable
 @DomName('SVGTextPathElement')
+@Unstable
 class TextPathElement extends TextContentElement implements UriReference native "SVGTextPathElement" {
 
   @DomName('SVGTextPathElement.TEXTPATH_METHODTYPE_ALIGN')
@@ -6101,6 +6226,7 @@
 
 @DocsEditable
 @DomName('SVGTextPositioningElement')
+@Unstable
 class TextPositioningElement extends TextContentElement native "SVGTextPositioningElement" {
 
   @DomName('SVGTextPositioningElement.dx')
@@ -6130,6 +6256,7 @@
 
 @DocsEditable
 @DomName('SVGTitleElement')
+@Unstable
 class TitleElement extends StyledElement implements LangSpace native "SVGTitleElement" {
 
   @DomName('SVGTitleElement.SVGTitleElement')
@@ -6153,6 +6280,7 @@
 
 @DocsEditable
 @DomName('SVGTransform')
+@Unstable
 class Transform native "SVGTransform" {
 
   @DomName('SVGTransform.SVG_TRANSFORM_MATRIX')
@@ -6226,6 +6354,7 @@
 
 @DocsEditable
 @DomName('SVGTransformList')
+@Unstable
 class TransformList extends Interceptor with ListMixin<Transform>, ImmutableListMixin<Transform> implements List<Transform>, JavaScriptIndexingBehavior native "SVGTransformList" {
 
   @DomName('SVGTransformList.numberOfItems')
@@ -6321,6 +6450,7 @@
 
 
 @DomName('SVGTransformable')
+@Unstable
 abstract class Transformable implements Locatable {
 
   AnimatedTransformList transform;
@@ -6346,6 +6476,7 @@
 
 @DocsEditable
 @DomName('SVGUnitTypes')
+@Unstable
 class UnitTypes native "SVGUnitTypes" {
 
   @DomName('SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX')
@@ -6366,6 +6497,7 @@
 
 
 @DomName('SVGURIReference')
+@Unstable
 abstract class UriReference {
 
   AnimatedString href;
@@ -6377,6 +6509,7 @@
 
 @DocsEditable
 @DomName('SVGUseElement')
+@Unstable
 class UseElement extends StyledElement implements UriReference, Tests, Transformable, ExternalResourcesRequired, LangSpace native "SVGUseElement" {
 
   @DomName('SVGUseElement.SVGUseElement')
@@ -6488,6 +6621,7 @@
 
 @DocsEditable
 @DomName('SVGViewElement')
+@Unstable
 class ViewElement extends SvgElement implements FitToViewBox, ExternalResourcesRequired, ZoomAndPan native "SVGViewElement" {
 
   @DomName('SVGViewElement.SVGViewElement')
@@ -6527,10 +6661,12 @@
 
 @DocsEditable
 @DomName('SVGViewSpec')
+@Unstable
 class ViewSpec native "SVGViewSpec" {
 
   @DomName('SVGViewSpec.preserveAspectRatio')
   @DocsEditable
+  @Experimental // nonstandard
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
   @DomName('SVGViewSpec.preserveAspectRatioString')
@@ -6547,6 +6683,7 @@
 
   @DomName('SVGViewSpec.viewBox')
   @DocsEditable
+  @Experimental // nonstandard
   final AnimatedRect viewBox;
 
   @DomName('SVGViewSpec.viewBoxString')
@@ -6563,6 +6700,7 @@
 
   @DomName('SVGViewSpec.zoomAndPan')
   @DocsEditable
+  @Experimental // nonstandard
   int zoomAndPan;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6571,6 +6709,7 @@
 
 
 @DomName('SVGZoomAndPan')
+@Unstable
 abstract class ZoomAndPan {
 
   @DomName('SVGZoomAndPan.SVG_ZOOMANDPAN_DISABLE')
@@ -6594,6 +6733,7 @@
 
 @DocsEditable
 @DomName('SVGZoomEvent')
+@Unstable
 class ZoomEvent extends UIEvent native "SVGZoomEvent" {
 
   @DomName('SVGZoomEvent.newScale')
@@ -6623,6 +6763,7 @@
 
 @DocsEditable
 @DomName('SVGElementInstanceList')
+@Unstable
 class _ElementInstanceList extends Interceptor with ListMixin<ElementInstance>, ImmutableListMixin<ElementInstance> implements JavaScriptIndexingBehavior, List<ElementInstance> native "SVGElementInstanceList" {
 
   @DomName('SVGElementInstanceList.length')
@@ -6684,6 +6825,7 @@
 
 @DocsEditable
 @DomName('SVGGradientElement')
+@Unstable
 class _GradientElement extends StyledElement implements UriReference, ExternalResourcesRequired native "SVGGradientElement" {
 
   @DomName('SVGGradientElement.SVG_SPREADMETHOD_PAD')
@@ -6733,6 +6875,7 @@
 
 @DocsEditable
 @DomName('SVGAltGlyphDefElement')
+@Unstable
 abstract class _SVGAltGlyphDefElement extends SvgElement native "SVGAltGlyphDefElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6742,6 +6885,7 @@
 
 @DocsEditable
 @DomName('SVGAltGlyphItemElement')
+@Unstable
 abstract class _SVGAltGlyphItemElement extends SvgElement native "SVGAltGlyphItemElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6751,6 +6895,7 @@
 
 @DocsEditable
 @DomName('SVGAnimateColorElement')
+@Unstable
 abstract class _SVGAnimateColorElement extends AnimationElement native "SVGAnimateColorElement" {
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -6762,6 +6907,7 @@
 // type entirely but can't.
 @DocsEditable
 @DomName('SVGColor')
+@Unstable
 class _SVGColor native "SVGColor" {
   _SVGColor.internal();
 }
@@ -6772,6 +6918,7 @@
 
 @DocsEditable
 @DomName('SVGComponentTransferFunctionElement')
+@Unstable
 abstract class _SVGComponentTransferFunctionElement extends SvgElement native "SVGComponentTransferFunctionElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6781,6 +6928,7 @@
 
 @DocsEditable
 @DomName('SVGCursorElement')
+@Unstable
 abstract class _SVGCursorElement extends SvgElement implements UriReference, Tests, ExternalResourcesRequired native "SVGCursorElement" {
 
   @DomName('SVGCursorElement.SVGCursorElement')
@@ -6803,6 +6951,7 @@
 
 @DocsEditable
 @DomName('SVGFEDropShadowElement')
+@Experimental // nonstandard
 abstract class _SVGFEDropShadowElement extends StyledElement implements FilterPrimitiveStandardAttributes native "SVGFEDropShadowElement" {
 
   // From SVGFilterPrimitiveStandardAttributes
@@ -6814,6 +6963,7 @@
 
 @DocsEditable
 @DomName('SVGFontElement')
+@Unstable
 abstract class _SVGFontElement extends SvgElement native "SVGFontElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6823,6 +6973,7 @@
 
 @DocsEditable
 @DomName('SVGFontFaceElement')
+@Unstable
 abstract class _SVGFontFaceElement extends SvgElement native "SVGFontFaceElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6832,6 +6983,7 @@
 
 @DocsEditable
 @DomName('SVGFontFaceFormatElement')
+@Unstable
 abstract class _SVGFontFaceFormatElement extends SvgElement native "SVGFontFaceFormatElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6841,6 +6993,7 @@
 
 @DocsEditable
 @DomName('SVGFontFaceNameElement')
+@Unstable
 abstract class _SVGFontFaceNameElement extends SvgElement native "SVGFontFaceNameElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6850,6 +7003,7 @@
 
 @DocsEditable
 @DomName('SVGFontFaceSrcElement')
+@Unstable
 abstract class _SVGFontFaceSrcElement extends SvgElement native "SVGFontFaceSrcElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6859,6 +7013,7 @@
 
 @DocsEditable
 @DomName('SVGFontFaceUriElement')
+@Unstable
 abstract class _SVGFontFaceUriElement extends SvgElement native "SVGFontFaceUriElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6868,6 +7023,7 @@
 
 @DocsEditable
 @DomName('SVGGlyphElement')
+@Unstable
 abstract class _SVGGlyphElement extends SvgElement native "SVGGlyphElement" {
 
   @DomName('SVGGlyphElement.SVGGlyphElement')
@@ -6881,6 +7037,7 @@
 
 @DocsEditable
 @DomName('SVGGlyphRefElement')
+@Unstable
 abstract class _SVGGlyphRefElement extends StyledElement implements UriReference native "SVGGlyphRefElement" {
 
   // From SVGURIReference
@@ -6892,6 +7049,7 @@
 
 @DocsEditable
 @DomName('SVGHKernElement')
+@Unstable
 abstract class _SVGHKernElement extends SvgElement native "SVGHKernElement" {
 
   @DomName('SVGHKernElement.SVGHKernElement')
@@ -6922,6 +7080,7 @@
 
 @DocsEditable
 @DomName('SVGMissingGlyphElement')
+@Unstable
 abstract class _SVGMissingGlyphElement extends StyledElement native "SVGMissingGlyphElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6931,6 +7090,7 @@
 
 @DocsEditable
 @DomName('SVGPaint')
+@Unstable
 abstract class _SVGPaint extends _SVGColor native "SVGPaint" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6940,6 +7100,7 @@
 
 @DocsEditable
 @DomName('SVGTRefElement')
+@Unstable
 abstract class _SVGTRefElement extends TextPositioningElement implements UriReference native "SVGTRefElement" {
 
   @DomName('SVGTRefElement.SVGTRefElement')
@@ -6955,6 +7116,7 @@
 
 @DocsEditable
 @DomName('SVGVKernElement')
+@Unstable
 abstract class _SVGVKernElement extends SvgElement native "SVGVKernElement" {
 
   @DomName('SVGVKernElement.SVGVKernElement')
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index d8d92c2..713e9ab 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -62,6 +62,7 @@
 
 @DocsEditable
 @DomName('SVGAElement')
+@Unstable
 class AElement extends StyledElement implements UriReference, Tests, Transformable, ExternalResourcesRequired, LangSpace {
   AElement.internal() : super.internal();
 
@@ -154,6 +155,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class AltGlyphElement extends TextPositioningElement implements UriReference {
   AltGlyphElement.internal() : super.internal();
 
@@ -194,6 +196,7 @@
 
 @DocsEditable
 @DomName('SVGAngle')
+@Unstable
 class Angle extends NativeFieldWrapperClass1 {
   Angle.internal();
 
@@ -266,6 +269,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class AnimateElement extends AnimationElement {
   AnimateElement.internal() : super.internal();
 
@@ -289,6 +293,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class AnimateMotionElement extends AnimationElement {
   AnimateMotionElement.internal() : super.internal();
 
@@ -312,6 +317,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class AnimateTransformElement extends AnimationElement {
   AnimateTransformElement.internal() : super.internal();
 
@@ -332,6 +338,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedAngle')
+@Unstable
 class AnimatedAngle extends NativeFieldWrapperClass1 {
   AnimatedAngle.internal();
 
@@ -353,6 +360,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedBoolean')
+@Unstable
 class AnimatedBoolean extends NativeFieldWrapperClass1 {
   AnimatedBoolean.internal();
 
@@ -378,6 +386,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedEnumeration')
+@Unstable
 class AnimatedEnumeration extends NativeFieldWrapperClass1 {
   AnimatedEnumeration.internal();
 
@@ -403,6 +412,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedInteger')
+@Unstable
 class AnimatedInteger extends NativeFieldWrapperClass1 {
   AnimatedInteger.internal();
 
@@ -428,6 +438,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedLength')
+@Unstable
 class AnimatedLength extends NativeFieldWrapperClass1 {
   AnimatedLength.internal();
 
@@ -449,6 +460,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedLengthList')
+@Unstable
 class AnimatedLengthList extends NativeFieldWrapperClass1 {
   AnimatedLengthList.internal();
 
@@ -470,6 +482,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedNumber')
+@Unstable
 class AnimatedNumber extends NativeFieldWrapperClass1 {
   AnimatedNumber.internal();
 
@@ -495,6 +508,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedNumberList')
+@Unstable
 class AnimatedNumberList extends NativeFieldWrapperClass1 {
   AnimatedNumberList.internal();
 
@@ -516,6 +530,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedPreserveAspectRatio')
+@Unstable
 class AnimatedPreserveAspectRatio extends NativeFieldWrapperClass1 {
   AnimatedPreserveAspectRatio.internal();
 
@@ -537,6 +552,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedRect')
+@Unstable
 class AnimatedRect extends NativeFieldWrapperClass1 {
   AnimatedRect.internal();
 
@@ -558,6 +574,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedString')
+@Unstable
 class AnimatedString extends NativeFieldWrapperClass1 {
   AnimatedString.internal();
 
@@ -583,6 +600,7 @@
 
 @DocsEditable
 @DomName('SVGAnimatedTransformList')
+@Unstable
 class AnimatedTransformList extends NativeFieldWrapperClass1 {
   AnimatedTransformList.internal();
 
@@ -604,6 +622,7 @@
 
 @DocsEditable
 @DomName('SVGAnimationElement')
+@Unstable
 class AnimationElement extends SvgElement implements Tests, ElementTimeControl, ExternalResourcesRequired {
   AnimationElement.internal() : super.internal();
 
@@ -673,6 +692,7 @@
 
 @DocsEditable
 @DomName('SVGCircleElement')
+@Unstable
 class CircleElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace {
   CircleElement.internal() : super.internal();
 
@@ -766,6 +786,7 @@
 
 @DocsEditable
 @DomName('SVGClipPathElement')
+@Unstable
 class ClipPathElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace {
   ClipPathElement.internal() : super.internal();
 
@@ -851,6 +872,7 @@
 
 @DocsEditable
 @DomName('SVGDefsElement')
+@Unstable
 class DefsElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace {
   DefsElement.internal() : super.internal();
 
@@ -932,6 +954,7 @@
 
 @DocsEditable
 @DomName('SVGDescElement')
+@Unstable
 class DescElement extends StyledElement implements LangSpace {
   DescElement.internal() : super.internal();
 
@@ -965,6 +988,7 @@
 
 @DocsEditable
 @DomName('SVGElementInstance')
+@Unstable
 class ElementInstance extends EventTarget {
   ElementInstance.internal() : super.internal();
 
@@ -1110,6 +1134,8 @@
 
   @DomName('SVGElementInstance.searchEvent')
   @DocsEditable
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental
   static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
 
   @DomName('SVGElementInstance.selectEvent')
@@ -1302,6 +1328,8 @@
 
   @DomName('SVGElementInstance.onsearch')
   @DocsEditable
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental
   Stream<Event> get onSearch => searchEvent.forTarget(this);
 
   @DomName('SVGElementInstance.onselect')
@@ -1330,6 +1358,7 @@
 
 @DocsEditable
 @DomName('ElementTimeControl')
+@Unstable
 class ElementTimeControl extends NativeFieldWrapperClass1 {
   ElementTimeControl.internal();
 
@@ -1359,6 +1388,7 @@
 
 @DocsEditable
 @DomName('SVGEllipseElement')
+@Unstable
 class EllipseElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace {
   EllipseElement.internal() : super.internal();
 
@@ -1456,6 +1486,7 @@
 
 @DocsEditable
 @DomName('SVGExternalResourcesRequired')
+@Unstable
 class ExternalResourcesRequired extends NativeFieldWrapperClass1 {
   ExternalResourcesRequired.internal();
 
@@ -1480,6 +1511,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEBlendElement extends StyledElement implements FilterPrimitiveStandardAttributes {
   FEBlendElement.internal() : super.internal();
 
@@ -1560,6 +1592,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEColorMatrixElement extends StyledElement implements FilterPrimitiveStandardAttributes {
   FEColorMatrixElement.internal() : super.internal();
 
@@ -1636,6 +1669,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEComponentTransferElement extends StyledElement implements FilterPrimitiveStandardAttributes {
   FEComponentTransferElement.internal() : super.internal();
 
@@ -1680,6 +1714,7 @@
 
 @DocsEditable
 @DomName('SVGFECompositeElement')
+@Unstable
 class FECompositeElement extends StyledElement implements FilterPrimitiveStandardAttributes {
   FECompositeElement.internal() : super.internal();
 
@@ -1773,6 +1808,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEConvolveMatrixElement extends StyledElement implements FilterPrimitiveStandardAttributes {
   FEConvolveMatrixElement.internal() : super.internal();
 
@@ -1881,6 +1917,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEDiffuseLightingElement extends StyledElement implements FilterPrimitiveStandardAttributes {
   FEDiffuseLightingElement.internal() : super.internal();
 
@@ -1945,6 +1982,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEDisplacementMapElement extends StyledElement implements FilterPrimitiveStandardAttributes {
   FEDisplacementMapElement.internal() : super.internal();
 
@@ -2029,6 +2067,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEDistantLightElement extends SvgElement {
   FEDistantLightElement.internal() : super.internal();
 
@@ -2061,6 +2100,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEFloodElement extends StyledElement implements FilterPrimitiveStandardAttributes {
   FEFloodElement.internal() : super.internal();
 
@@ -2105,6 +2145,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEFuncAElement extends _SVGComponentTransferFunctionElement {
   FEFuncAElement.internal() : super.internal();
 
@@ -2129,6 +2170,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEFuncBElement extends _SVGComponentTransferFunctionElement {
   FEFuncBElement.internal() : super.internal();
 
@@ -2153,6 +2195,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEFuncGElement extends _SVGComponentTransferFunctionElement {
   FEFuncGElement.internal() : super.internal();
 
@@ -2177,6 +2220,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEFuncRElement extends _SVGComponentTransferFunctionElement {
   FEFuncRElement.internal() : super.internal();
 
@@ -2201,6 +2245,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEGaussianBlurElement extends StyledElement implements FilterPrimitiveStandardAttributes {
   FEGaussianBlurElement.internal() : super.internal();
 
@@ -2261,6 +2306,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEImageElement extends StyledElement implements FilterPrimitiveStandardAttributes, UriReference, ExternalResourcesRequired, LangSpace {
   FEImageElement.internal() : super.internal();
 
@@ -2333,6 +2379,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEMergeElement extends StyledElement implements FilterPrimitiveStandardAttributes {
   FEMergeElement.internal() : super.internal();
 
@@ -2377,6 +2424,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEMergeNodeElement extends SvgElement {
   FEMergeNodeElement.internal() : super.internal();
 
@@ -2405,6 +2453,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEMorphologyElement extends StyledElement implements FilterPrimitiveStandardAttributes {
   FEMorphologyElement.internal() : super.internal();
 
@@ -2474,6 +2523,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEOffsetElement extends StyledElement implements FilterPrimitiveStandardAttributes {
   FEOffsetElement.internal() : super.internal();
 
@@ -2530,6 +2580,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FEPointLightElement extends SvgElement {
   FEPointLightElement.internal() : super.internal();
 
@@ -2566,6 +2617,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FESpecularLightingElement extends StyledElement implements FilterPrimitiveStandardAttributes {
   FESpecularLightingElement.internal() : super.internal();
 
@@ -2626,6 +2678,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FESpotLightElement extends SvgElement {
   FESpotLightElement.internal() : super.internal();
 
@@ -2682,6 +2735,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FETileElement extends StyledElement implements FilterPrimitiveStandardAttributes {
   FETileElement.internal() : super.internal();
 
@@ -2730,6 +2784,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FETurbulenceElement extends StyledElement implements FilterPrimitiveStandardAttributes {
   FETurbulenceElement.internal() : super.internal();
 
@@ -2822,6 +2877,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class FilterElement extends StyledElement implements UriReference, ExternalResourcesRequired, LangSpace {
   FilterElement.internal() : super.internal();
 
@@ -2902,6 +2958,7 @@
 
 @DocsEditable
 @DomName('SVGFilterPrimitiveStandardAttributes')
+@Unstable
 class FilterPrimitiveStandardAttributes extends NativeFieldWrapperClass1 {
   FilterPrimitiveStandardAttributes.internal();
 
@@ -2935,6 +2992,7 @@
 
 @DocsEditable
 @DomName('SVGFitToViewBox')
+@Unstable
 class FitToViewBox extends NativeFieldWrapperClass1 {
   FitToViewBox.internal();
 
@@ -2959,6 +3017,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class ForeignObjectElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace {
   ForeignObjectElement.internal() : super.internal();
 
@@ -3059,6 +3118,7 @@
 
 @DocsEditable
 @DomName('SVGGElement')
+@Unstable
 class GElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace {
   GElement.internal() : super.internal();
 
@@ -3140,6 +3200,7 @@
 
 @DocsEditable
 @DomName('SVGImageElement')
+@Unstable
 class ImageElement extends StyledElement implements UriReference, Tests, Transformable, ExternalResourcesRequired, LangSpace {
   ImageElement.internal() : super.internal();
 
@@ -3245,6 +3306,7 @@
 
 @DocsEditable
 @DomName('SVGLangSpace')
+@Unstable
 class LangSpace extends NativeFieldWrapperClass1 {
   LangSpace.internal();
 
@@ -3277,6 +3339,7 @@
 
 @DocsEditable
 @DomName('SVGLength')
+@Unstable
 class Length extends NativeFieldWrapperClass1 {
   Length.internal();
 
@@ -3370,6 +3433,7 @@
 
 @DocsEditable
 @DomName('SVGLengthList')
+@Unstable
 class LengthList extends NativeFieldWrapperClass1 with ListMixin<Length>, ImmutableListMixin<Length> implements List<Length> {
   LengthList.internal();
 
@@ -3462,6 +3526,7 @@
 
 @DocsEditable
 @DomName('SVGLineElement')
+@Unstable
 class LineElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace {
   LineElement.internal() : super.internal();
 
@@ -3559,6 +3624,7 @@
 
 @DocsEditable
 @DomName('SVGLinearGradientElement')
+@Unstable
 class LinearGradientElement extends _GradientElement {
   LinearGradientElement.internal() : super.internal();
 
@@ -3592,6 +3658,7 @@
 
 @DocsEditable
 @DomName('SVGLocatable')
+@Unstable
 class Locatable extends NativeFieldWrapperClass1 {
   Locatable.internal();
 
@@ -3629,6 +3696,7 @@
 
 @DocsEditable
 @DomName('SVGMarkerElement')
+@Unstable
 class MarkerElement extends StyledElement implements FitToViewBox, ExternalResourcesRequired, LangSpace {
   MarkerElement.internal() : super.internal();
 
@@ -3734,6 +3802,7 @@
 
 @DocsEditable
 @DomName('SVGMaskElement')
+@Unstable
 class MaskElement extends StyledElement implements Tests, ExternalResourcesRequired, LangSpace {
   MaskElement.internal() : super.internal();
 
@@ -3811,6 +3880,7 @@
 
 @DocsEditable
 @DomName('SVGMatrix')
+@Unstable
 class Matrix extends NativeFieldWrapperClass1 {
   Matrix.internal();
 
@@ -3916,6 +3986,7 @@
 
 @DocsEditable
 @DomName('SVGMetadataElement')
+@Unstable
 class MetadataElement extends SvgElement {
   MetadataElement.internal() : super.internal();
 
@@ -3929,6 +4000,7 @@
 
 @DocsEditable
 @DomName('SVGNumber')
+@Unstable
 class Number extends NativeFieldWrapperClass1 {
   Number.internal();
 
@@ -3950,6 +4022,7 @@
 
 @DocsEditable
 @DomName('SVGNumberList')
+@Unstable
 class NumberList extends NativeFieldWrapperClass1 with ListMixin<Number>, ImmutableListMixin<Number> implements List<Number> {
   NumberList.internal();
 
@@ -4042,6 +4115,7 @@
 
 @DocsEditable
 @DomName('SVGPathElement')
+@Unstable
 class PathElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace {
   PathElement.internal() : super.internal();
 
@@ -4231,6 +4305,7 @@
 
 @DocsEditable
 @DomName('SVGPathSeg')
+@Unstable
 class PathSeg extends NativeFieldWrapperClass1 {
   PathSeg.internal();
 
@@ -4332,6 +4407,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegArcAbs')
+@Unstable
 class PathSegArcAbs extends PathSeg {
   PathSegArcAbs.internal() : super.internal();
 
@@ -4401,6 +4477,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegArcRel')
+@Unstable
 class PathSegArcRel extends PathSeg {
   PathSegArcRel.internal() : super.internal();
 
@@ -4470,6 +4547,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegClosePath')
+@Unstable
 class PathSegClosePath extends PathSeg {
   PathSegClosePath.internal() : super.internal();
 
@@ -4483,6 +4561,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegCurvetoCubicAbs')
+@Unstable
 class PathSegCurvetoCubicAbs extends PathSeg {
   PathSegCurvetoCubicAbs.internal() : super.internal();
 
@@ -4544,6 +4623,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegCurvetoCubicRel')
+@Unstable
 class PathSegCurvetoCubicRel extends PathSeg {
   PathSegCurvetoCubicRel.internal() : super.internal();
 
@@ -4605,6 +4685,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegCurvetoCubicSmoothAbs')
+@Unstable
 class PathSegCurvetoCubicSmoothAbs extends PathSeg {
   PathSegCurvetoCubicSmoothAbs.internal() : super.internal();
 
@@ -4650,6 +4731,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegCurvetoCubicSmoothRel')
+@Unstable
 class PathSegCurvetoCubicSmoothRel extends PathSeg {
   PathSegCurvetoCubicSmoothRel.internal() : super.internal();
 
@@ -4695,6 +4777,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegCurvetoQuadraticAbs')
+@Unstable
 class PathSegCurvetoQuadraticAbs extends PathSeg {
   PathSegCurvetoQuadraticAbs.internal() : super.internal();
 
@@ -4740,6 +4823,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegCurvetoQuadraticRel')
+@Unstable
 class PathSegCurvetoQuadraticRel extends PathSeg {
   PathSegCurvetoQuadraticRel.internal() : super.internal();
 
@@ -4785,6 +4869,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegCurvetoQuadraticSmoothAbs')
+@Unstable
 class PathSegCurvetoQuadraticSmoothAbs extends PathSeg {
   PathSegCurvetoQuadraticSmoothAbs.internal() : super.internal();
 
@@ -4814,6 +4899,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegCurvetoQuadraticSmoothRel')
+@Unstable
 class PathSegCurvetoQuadraticSmoothRel extends PathSeg {
   PathSegCurvetoQuadraticSmoothRel.internal() : super.internal();
 
@@ -4843,6 +4929,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegLinetoAbs')
+@Unstable
 class PathSegLinetoAbs extends PathSeg {
   PathSegLinetoAbs.internal() : super.internal();
 
@@ -4872,6 +4959,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegLinetoHorizontalAbs')
+@Unstable
 class PathSegLinetoHorizontalAbs extends PathSeg {
   PathSegLinetoHorizontalAbs.internal() : super.internal();
 
@@ -4893,6 +4981,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegLinetoHorizontalRel')
+@Unstable
 class PathSegLinetoHorizontalRel extends PathSeg {
   PathSegLinetoHorizontalRel.internal() : super.internal();
 
@@ -4914,6 +5003,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegLinetoRel')
+@Unstable
 class PathSegLinetoRel extends PathSeg {
   PathSegLinetoRel.internal() : super.internal();
 
@@ -4943,6 +5033,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegLinetoVerticalAbs')
+@Unstable
 class PathSegLinetoVerticalAbs extends PathSeg {
   PathSegLinetoVerticalAbs.internal() : super.internal();
 
@@ -4964,6 +5055,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegLinetoVerticalRel')
+@Unstable
 class PathSegLinetoVerticalRel extends PathSeg {
   PathSegLinetoVerticalRel.internal() : super.internal();
 
@@ -4985,6 +5077,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegList')
+@Unstable
 class PathSegList extends NativeFieldWrapperClass1 with ListMixin<PathSeg>, ImmutableListMixin<PathSeg> implements List<PathSeg> {
   PathSegList.internal();
 
@@ -5077,6 +5170,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegMovetoAbs')
+@Unstable
 class PathSegMovetoAbs extends PathSeg {
   PathSegMovetoAbs.internal() : super.internal();
 
@@ -5106,6 +5200,7 @@
 
 @DocsEditable
 @DomName('SVGPathSegMovetoRel')
+@Unstable
 class PathSegMovetoRel extends PathSeg {
   PathSegMovetoRel.internal() : super.internal();
 
@@ -5135,6 +5230,7 @@
 
 @DocsEditable
 @DomName('SVGPatternElement')
+@Unstable
 class PatternElement extends StyledElement implements FitToViewBox, UriReference, Tests, ExternalResourcesRequired, LangSpace {
   PatternElement.internal() : super.internal();
 
@@ -5228,6 +5324,7 @@
 
 @DocsEditable
 @DomName('SVGPoint')
+@Unstable
 class Point extends NativeFieldWrapperClass1 {
   Point.internal();
 
@@ -5261,6 +5358,7 @@
 
 @DocsEditable
 @DomName('SVGPointList')
+@Unstable
 class PointList extends NativeFieldWrapperClass1 {
   PointList.internal();
 
@@ -5306,6 +5404,7 @@
 
 @DocsEditable
 @DomName('SVGPolygonElement')
+@Unstable
 class PolygonElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace {
   PolygonElement.internal() : super.internal();
 
@@ -5395,6 +5494,7 @@
 
 @DocsEditable
 @DomName('SVGPolylineElement')
+@Unstable
 class PolylineElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace {
   PolylineElement.internal() : super.internal();
 
@@ -5484,6 +5584,7 @@
 
 @DocsEditable
 @DomName('SVGPreserveAspectRatio')
+@Unstable
 class PreserveAspectRatio extends NativeFieldWrapperClass1 {
   PreserveAspectRatio.internal();
 
@@ -5569,6 +5670,7 @@
 
 @DocsEditable
 @DomName('SVGRadialGradientElement')
+@Unstable
 class RadialGradientElement extends _GradientElement {
   RadialGradientElement.internal() : super.internal();
 
@@ -5610,6 +5712,7 @@
 
 @DocsEditable
 @DomName('SVGRect')
+@Unstable
 class Rect extends NativeFieldWrapperClass1 {
   Rect.internal();
 
@@ -5655,6 +5758,7 @@
 
 @DocsEditable
 @DomName('SVGRectElement')
+@Unstable
 class RectElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace {
   RectElement.internal() : super.internal();
 
@@ -5760,6 +5864,7 @@
 
 @DocsEditable
 @DomName('SVGRenderingIntent')
+@Unstable
 class RenderingIntent extends NativeFieldWrapperClass1 {
   RenderingIntent.internal();
 
@@ -5797,6 +5902,7 @@
 
 @DocsEditable
 @DomName('SVGScriptElement')
+@Unstable
 class ScriptElement extends SvgElement implements UriReference, ExternalResourcesRequired {
   ScriptElement.internal() : super.internal();
 
@@ -5833,6 +5939,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
+@Unstable
 class SetElement extends AnimationElement {
   SetElement.internal() : super.internal();
 
@@ -5853,6 +5960,7 @@
 
 @DocsEditable
 @DomName('SVGStopElement')
+@Unstable
 class StopElement extends StyledElement {
   StopElement.internal() : super.internal();
 
@@ -5874,6 +5982,7 @@
 
 @DocsEditable
 @DomName('SVGStringList')
+@Unstable
 class StringList extends NativeFieldWrapperClass1 with ListMixin<String>, ImmutableListMixin<String> implements List<String> {
   StringList.internal();
 
@@ -5966,6 +6075,8 @@
 
 @DocsEditable
 @DomName('SVGStyleElement')
+// http://www.w3.org/TR/SVG/types.html#InterfaceSVGStylable
+@Experimental // nonstandard
 class StyleElement extends SvgElement implements LangSpace {
   StyleElement.internal() : super.internal();
 
@@ -6031,6 +6142,7 @@
 
 @DocsEditable
 @DomName('SVGStyledElement')
+@Unstable
 class StyledElement extends SvgElement {
   StyledElement.internal() : super.internal();
 
@@ -6052,6 +6164,7 @@
 
 @DocsEditable
 @DomName('SVGDocument')
+@Unstable
 class SvgDocument extends Document {
   SvgDocument.internal() : super.internal();
 
@@ -6096,6 +6209,7 @@
 }
 
 @DomName('SVGElement')
+@Unstable
 class SvgElement extends Element {
   factory SvgElement.tag(String tag) =>
       _SvgElementFactoryProvider.createSvgElement_tag(tag);
@@ -6211,6 +6325,7 @@
 
 @DocsEditable
 @DomName('SVGException')
+@Unstable
 class SvgException extends NativeFieldWrapperClass1 {
   SvgException.internal();
 
@@ -6232,10 +6347,12 @@
 
   @DomName('SVGException.message')
   @DocsEditable
+  @Experimental // nonstandard
   String get message native "SVGException_message_Getter";
 
   @DomName('SVGException.name')
   @DocsEditable
+  @Experimental // nonstandard
   String get name native "SVGException_name_Getter";
 
   @DomName('SVGException.toString')
@@ -6249,6 +6366,7 @@
 
 
 @DomName('SVGSVGElement')
+@Unstable
 class SvgSvgElement extends StyledElement implements FitToViewBox, Transformable, Tests, ExternalResourcesRequired, ZoomAndPan, LangSpace {
   factory SvgSvgElement() => _SvgSvgElementFactoryProvider.createSvgSvgElement();
 
@@ -6508,6 +6626,7 @@
 
 @DocsEditable
 @DomName('SVGSwitchElement')
+@Unstable
 class SwitchElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace {
   SwitchElement.internal() : super.internal();
 
@@ -6589,6 +6708,7 @@
 
 @DocsEditable
 @DomName('SVGSymbolElement')
+@Unstable
 class SymbolElement extends StyledElement implements FitToViewBox, ExternalResourcesRequired, LangSpace {
   SymbolElement.internal() : super.internal();
 
@@ -6634,6 +6754,7 @@
 
 @DocsEditable
 @DomName('SVGTSpanElement')
+@Unstable
 class TSpanElement extends TextPositioningElement {
   TSpanElement.internal() : super.internal();
 
@@ -6651,6 +6772,7 @@
 
 @DocsEditable
 @DomName('SVGTests')
+@Unstable
 class Tests extends NativeFieldWrapperClass1 {
   Tests.internal();
 
@@ -6680,6 +6802,7 @@
 
 @DocsEditable
 @DomName('SVGTextContentElement')
+@Unstable
 class TextContentElement extends StyledElement implements Tests, ExternalResourcesRequired, LangSpace {
   TextContentElement.internal() : super.internal();
 
@@ -6785,6 +6908,7 @@
 
 @DocsEditable
 @DomName('SVGTextElement')
+@Unstable
 class TextElement extends TextPositioningElement implements Transformable {
   TextElement.internal() : super.internal();
 
@@ -6830,6 +6954,7 @@
 
 @DocsEditable
 @DomName('SVGTextPathElement')
+@Unstable
 class TextPathElement extends TextContentElement implements UriReference {
   TextPathElement.internal() : super.internal();
 
@@ -6883,6 +7008,7 @@
 
 @DocsEditable
 @DomName('SVGTextPositioningElement')
+@Unstable
 class TextPositioningElement extends TextContentElement {
   TextPositioningElement.internal() : super.internal();
 
@@ -6916,6 +7042,7 @@
 
 @DocsEditable
 @DomName('SVGTitleElement')
+@Unstable
 class TitleElement extends StyledElement implements LangSpace {
   TitleElement.internal() : super.internal();
 
@@ -6949,6 +7076,7 @@
 
 @DocsEditable
 @DomName('SVGTransform')
+@Unstable
 class Transform extends NativeFieldWrapperClass1 {
   Transform.internal();
 
@@ -7026,6 +7154,7 @@
 
 @DocsEditable
 @DomName('SVGTransformList')
+@Unstable
 class TransformList extends NativeFieldWrapperClass1 with ListMixin<Transform>, ImmutableListMixin<Transform> implements List<Transform> {
   TransformList.internal();
 
@@ -7126,6 +7255,7 @@
 
 @DocsEditable
 @DomName('SVGTransformable')
+@Unstable
 class Transformable extends NativeFieldWrapperClass1 implements Locatable {
   Transformable.internal();
 
@@ -7167,6 +7297,7 @@
 
 @DocsEditable
 @DomName('SVGUnitTypes')
+@Unstable
 class UnitTypes extends NativeFieldWrapperClass1 {
   UnitTypes.internal();
 
@@ -7192,6 +7323,7 @@
 
 @DocsEditable
 @DomName('SVGURIReference')
+@Unstable
 class UriReference extends NativeFieldWrapperClass1 {
   UriReference.internal();
 
@@ -7209,6 +7341,7 @@
 
 @DocsEditable
 @DomName('SVGUseElement')
+@Unstable
 class UseElement extends StyledElement implements UriReference, Tests, Transformable, ExternalResourcesRequired, LangSpace {
   UseElement.internal() : super.internal();
 
@@ -7318,6 +7451,7 @@
 
 @DocsEditable
 @DomName('SVGViewElement')
+@Unstable
 class ViewElement extends SvgElement implements FitToViewBox, ExternalResourcesRequired, ZoomAndPan {
   ViewElement.internal() : super.internal();
 
@@ -7359,11 +7493,13 @@
 
 @DocsEditable
 @DomName('SVGViewSpec')
+@Unstable
 class ViewSpec extends NativeFieldWrapperClass1 {
   ViewSpec.internal();
 
   @DomName('SVGViewSpec.preserveAspectRatio')
   @DocsEditable
+  @Experimental // nonstandard
   AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGViewSpec_preserveAspectRatio_Getter";
 
   @DomName('SVGViewSpec.preserveAspectRatioString')
@@ -7380,6 +7516,7 @@
 
   @DomName('SVGViewSpec.viewBox')
   @DocsEditable
+  @Experimental // nonstandard
   AnimatedRect get viewBox native "SVGViewSpec_viewBox_Getter";
 
   @DomName('SVGViewSpec.viewBoxString')
@@ -7396,10 +7533,12 @@
 
   @DomName('SVGViewSpec.zoomAndPan')
   @DocsEditable
+  @Experimental // nonstandard
   int get zoomAndPan native "SVGViewSpec_zoomAndPan_Getter";
 
   @DomName('SVGViewSpec.zoomAndPan')
   @DocsEditable
+  @Experimental // nonstandard
   void set zoomAndPan(int value) native "SVGViewSpec_zoomAndPan_Setter";
 
 }
@@ -7412,6 +7551,7 @@
 
 @DocsEditable
 @DomName('SVGZoomAndPan')
+@Unstable
 class ZoomAndPan extends NativeFieldWrapperClass1 {
   ZoomAndPan.internal();
 
@@ -7445,6 +7585,7 @@
 
 @DocsEditable
 @DomName('SVGZoomEvent')
+@Unstable
 class ZoomEvent extends UIEvent {
   ZoomEvent.internal() : super.internal();
 
@@ -7478,6 +7619,7 @@
 
 @DocsEditable
 @DomName('SVGElementInstanceList')
+@Unstable
 class _ElementInstanceList extends NativeFieldWrapperClass1 with ListMixin<ElementInstance>, ImmutableListMixin<ElementInstance> implements List<ElementInstance> {
   _ElementInstanceList.internal();
 
@@ -7544,6 +7686,7 @@
 
 @DocsEditable
 @DomName('SVGGradientElement')
+@Unstable
 class _GradientElement extends StyledElement implements UriReference, ExternalResourcesRequired {
   _GradientElement.internal() : super.internal();
 
@@ -7593,6 +7736,7 @@
 
 @DocsEditable
 @DomName('SVGAltGlyphDefElement')
+@Unstable
 abstract class _SVGAltGlyphDefElement extends SvgElement {
   _SVGAltGlyphDefElement.internal() : super.internal();
 
@@ -7606,6 +7750,7 @@
 
 @DocsEditable
 @DomName('SVGAltGlyphItemElement')
+@Unstable
 abstract class _SVGAltGlyphItemElement extends SvgElement {
   _SVGAltGlyphItemElement.internal() : super.internal();
 
@@ -7619,6 +7764,7 @@
 
 @DocsEditable
 @DomName('SVGAnimateColorElement')
+@Unstable
 abstract class _SVGAnimateColorElement extends AnimationElement {
   _SVGAnimateColorElement.internal() : super.internal();
 
@@ -7632,6 +7778,7 @@
 // type entirely but can't.
 @DocsEditable
 @DomName('SVGColor')
+@Unstable
 class _SVGColor {
   _SVGColor.internal();
 }
@@ -7644,6 +7791,7 @@
 
 @DocsEditable
 @DomName('SVGComponentTransferFunctionElement')
+@Unstable
 abstract class _SVGComponentTransferFunctionElement extends SvgElement {
   _SVGComponentTransferFunctionElement.internal() : super.internal();
 
@@ -7657,6 +7805,7 @@
 
 @DocsEditable
 @DomName('SVGCursorElement')
+@Unstable
 abstract class _SVGCursorElement extends SvgElement implements UriReference, Tests, ExternalResourcesRequired {
   _SVGCursorElement.internal() : super.internal();
 
@@ -7677,6 +7826,7 @@
 
 @DocsEditable
 @DomName('SVGFEDropShadowElement')
+@Experimental // nonstandard
 abstract class _SVGFEDropShadowElement extends StyledElement implements FilterPrimitiveStandardAttributes {
   _SVGFEDropShadowElement.internal() : super.internal();
 
@@ -7690,6 +7840,7 @@
 
 @DocsEditable
 @DomName('SVGFontElement')
+@Unstable
 abstract class _SVGFontElement extends SvgElement {
   _SVGFontElement.internal() : super.internal();
 
@@ -7703,6 +7854,7 @@
 
 @DocsEditable
 @DomName('SVGFontFaceElement')
+@Unstable
 abstract class _SVGFontFaceElement extends SvgElement {
   _SVGFontFaceElement.internal() : super.internal();
 
@@ -7716,6 +7868,7 @@
 
 @DocsEditable
 @DomName('SVGFontFaceFormatElement')
+@Unstable
 abstract class _SVGFontFaceFormatElement extends SvgElement {
   _SVGFontFaceFormatElement.internal() : super.internal();
 
@@ -7729,6 +7882,7 @@
 
 @DocsEditable
 @DomName('SVGFontFaceNameElement')
+@Unstable
 abstract class _SVGFontFaceNameElement extends SvgElement {
   _SVGFontFaceNameElement.internal() : super.internal();
 
@@ -7742,6 +7896,7 @@
 
 @DocsEditable
 @DomName('SVGFontFaceSrcElement')
+@Unstable
 abstract class _SVGFontFaceSrcElement extends SvgElement {
   _SVGFontFaceSrcElement.internal() : super.internal();
 
@@ -7755,6 +7910,7 @@
 
 @DocsEditable
 @DomName('SVGFontFaceUriElement')
+@Unstable
 abstract class _SVGFontFaceUriElement extends SvgElement {
   _SVGFontFaceUriElement.internal() : super.internal();
 
@@ -7768,6 +7924,7 @@
 
 @DocsEditable
 @DomName('SVGGlyphElement')
+@Unstable
 abstract class _SVGGlyphElement extends SvgElement {
   _SVGGlyphElement.internal() : super.internal();
 
@@ -7785,6 +7942,7 @@
 
 @DocsEditable
 @DomName('SVGGlyphRefElement')
+@Unstable
 abstract class _SVGGlyphRefElement extends StyledElement implements UriReference {
   _SVGGlyphRefElement.internal() : super.internal();
 
@@ -7798,6 +7956,7 @@
 
 @DocsEditable
 @DomName('SVGHKernElement')
+@Unstable
 abstract class _SVGHKernElement extends SvgElement {
   _SVGHKernElement.internal() : super.internal();
 
@@ -7832,6 +7991,7 @@
 
 @DocsEditable
 @DomName('SVGMissingGlyphElement')
+@Unstable
 abstract class _SVGMissingGlyphElement extends StyledElement {
   _SVGMissingGlyphElement.internal() : super.internal();
 
@@ -7845,6 +8005,7 @@
 
 @DocsEditable
 @DomName('SVGPaint')
+@Unstable
 abstract class _SVGPaint extends _SVGColor {
   _SVGPaint.internal() : super.internal();
 
@@ -7858,6 +8019,7 @@
 
 @DocsEditable
 @DomName('SVGTRefElement')
+@Unstable
 abstract class _SVGTRefElement extends TextPositioningElement implements UriReference {
   _SVGTRefElement.internal() : super.internal();
 
@@ -7875,6 +8037,7 @@
 
 @DocsEditable
 @DomName('SVGVKernElement')
+@Unstable
 abstract class _SVGVKernElement extends SvgElement {
   _SVGVKernElement.internal() : super.internal();
 
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index ece0a8c..83732db 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -23,6 +23,8 @@
 
 @DocsEditable
 @DomName('AnalyserNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AnalyserNode
+@Experimental
 class AnalyserNode extends AudioNode native "AnalyserNode" {
 
   @DomName('AnalyserNode.fftSize')
@@ -64,6 +66,8 @@
 
 @DocsEditable
 @DomName('AudioBuffer')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBuffer-section
+@Experimental
 class AudioBuffer native "AudioBuffer" {
 
   @DomName('AudioBuffer.duration')
@@ -97,6 +101,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('AudioBufferCallback')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBuffer-section
+@Experimental
 typedef void AudioBufferCallback(AudioBuffer audioBuffer);
 // 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
@@ -104,6 +111,8 @@
 
 
 @DomName('AudioBufferSourceNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBufferSourceNode-section
+@Experimental
 class AudioBufferSourceNode extends AudioSourceNode native "AudioBufferSourceNode" {
 
   // TODO(efortuna): Remove these methods when Chrome stable also uses start
@@ -182,14 +191,17 @@
 
   @DomName('AudioBufferSourceNode.noteGrainOn')
   @DocsEditable
+  @Experimental // untriaged
   void noteGrainOn(num when, num grainOffset, num grainDuration) native;
 
   @DomName('AudioBufferSourceNode.noteOff')
   @DocsEditable
+  @Experimental // untriaged
   void noteOff(num when) native;
 
   @DomName('AudioBufferSourceNode.noteOn')
   @DocsEditable
+  @Experimental // untriaged
   void noteOn(num when) native;
 
 }
@@ -199,6 +211,8 @@
 
 
 @DomName('AudioContext')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioContext-section
+@Experimental
 class AudioContext extends EventTarget native "AudioContext" {
 
   @DomName('AudioContext.completeEvent')
@@ -262,6 +276,7 @@
 
   @DomName('AudioContext.createDelayNode')
   @DocsEditable
+  @Experimental // untriaged
   DelayNode createDelayNode([num maxDelayTime]) native;
 
   @DomName('AudioContext.createDynamicsCompressor')
@@ -270,10 +285,12 @@
 
   @DomName('AudioContext.createGainNode')
   @DocsEditable
+  @Experimental // untriaged
   GainNode createGainNode() native;
 
   @DomName('AudioContext.createJavaScriptNode')
   @DocsEditable
+  @Experimental // untriaged
   ScriptProcessorNode createJavaScriptNode(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]) native;
 
   @DomName('AudioContext.createMediaElementSource')
@@ -350,6 +367,8 @@
 
 @DocsEditable
 @DomName('AudioDestinationNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioDestinationNode-section
+@Experimental
 class AudioDestinationNode extends AudioNode native "AudioDestinationNode" {
 
   @DomName('AudioDestinationNode.maxChannelCount')
@@ -363,6 +382,8 @@
 
 @DocsEditable
 @DomName('AudioListener')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioListener-section
+@Experimental
 class AudioListener native "AudioListener" {
 
   @DomName('AudioListener.dopplerFactor')
@@ -392,6 +413,8 @@
 
 @DocsEditable
 @DomName('AudioNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioNode-section
+@Experimental
 class AudioNode native "AudioNode" {
 
   @DomName('AudioNode.channelCount')
@@ -433,6 +456,8 @@
 
 @DocsEditable
 @DomName('AudioParam')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioParam
+@Experimental
 class AudioParam native "AudioParam" {
 
   @DomName('AudioParam.defaultValue')
@@ -477,6 +502,7 @@
 
   @DomName('AudioParam.setTargetValueAtTime')
   @DocsEditable
+  @Experimental // untriaged
   void setTargetValueAtTime(num targetValue, num time, num timeConstant) native;
 
   @DomName('AudioParam.setValueAtTime')
@@ -494,6 +520,8 @@
 
 @DocsEditable
 @DomName('AudioProcessingEvent')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioProcessingEvent-section
+@Experimental
 class AudioProcessingEvent extends Event native "AudioProcessingEvent" {
 
   @DomName('AudioProcessingEvent.inputBuffer')
@@ -511,6 +539,8 @@
 
 @DocsEditable
 @DomName('AudioSourceNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html
+@Experimental
 class AudioSourceNode extends AudioNode native "AudioSourceNode" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -520,6 +550,8 @@
 
 @DocsEditable
 @DomName('BiquadFilterNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#BiquadFilterNode-section
+@Experimental
 class BiquadFilterNode extends AudioNode native "BiquadFilterNode" {
 
   @DomName('BiquadFilterNode.ALLPASS')
@@ -585,6 +617,8 @@
 
 @DocsEditable
 @DomName('ChannelMergerNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ChannelMergerNode-section
+@Experimental
 class ChannelMergerNode extends AudioNode native "ChannelMergerNode" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -594,6 +628,8 @@
 
 @DocsEditable
 @DomName('ChannelSplitterNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ChannelSplitterNode-section
+@Experimental
 class ChannelSplitterNode extends AudioNode native "ChannelSplitterNode" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -603,6 +639,8 @@
 
 @DocsEditable
 @DomName('ConvolverNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ConvolverNode
+@Experimental
 class ConvolverNode extends AudioNode native "ConvolverNode" {
 
   @DomName('ConvolverNode.buffer')
@@ -620,6 +658,8 @@
 
 @DocsEditable
 @DomName('DelayNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#DelayNode
+@Experimental
 class DelayNode extends AudioNode native "DelayNode" {
 
   @DomName('DelayNode.delayTime')
@@ -633,6 +673,8 @@
 
 @DocsEditable
 @DomName('DynamicsCompressorNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#DynamicsCompressorNode
+@Experimental
 class DynamicsCompressorNode extends AudioNode native "DynamicsCompressorNode" {
 
   @DomName('DynamicsCompressorNode.attack')
@@ -666,6 +708,8 @@
 
 @DocsEditable
 @DomName('GainNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#GainNode
+@Experimental
 class GainNode extends AudioNode native "GainNode" {
 
   @DomName('GainNode.gain')
@@ -679,10 +723,13 @@
 
 @DocsEditable
 @DomName('MediaElementAudioSourceNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaElementAudioSourceNode
+@Experimental
 class MediaElementAudioSourceNode extends AudioSourceNode native "MediaElementAudioSourceNode" {
 
   @DomName('MediaElementAudioSourceNode.mediaElement')
   @DocsEditable
+  @Experimental // non-standard
   final MediaElement mediaElement;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -692,6 +739,8 @@
 
 @DocsEditable
 @DomName('MediaStreamAudioDestinationNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaStreamAudioDestinationNode
+@Experimental
 class MediaStreamAudioDestinationNode extends AudioSourceNode native "MediaStreamAudioDestinationNode" {
 
   @DomName('MediaStreamAudioDestinationNode.stream')
@@ -705,6 +754,8 @@
 
 @DocsEditable
 @DomName('MediaStreamAudioSourceNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaStreamAudioSourceNode
+@Experimental
 class MediaStreamAudioSourceNode extends AudioSourceNode native "MediaStreamAudioSourceNode" {
 
   @DomName('MediaStreamAudioSourceNode.mediaStream')
@@ -718,6 +769,8 @@
 
 @DocsEditable
 @DomName('OfflineAudioCompletionEvent')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#OfflineAudioCompletionEvent-section
+@Experimental
 class OfflineAudioCompletionEvent extends Event native "OfflineAudioCompletionEvent" {
 
   @DomName('OfflineAudioCompletionEvent.renderedBuffer')
@@ -731,6 +784,8 @@
 
 @DocsEditable
 @DomName('OfflineAudioContext')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#OfflineAudioContext-section
+@Experimental
 class OfflineAudioContext extends AudioContext implements EventTarget native "OfflineAudioContext" {
 
   @DomName('OfflineAudioContext.OfflineAudioContext')
@@ -747,10 +802,14 @@
 
 @DocsEditable
 @DomName('OscillatorNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#dfn-OscillatorNode
+@Experimental
 class OscillatorNode extends AudioSourceNode native "OscillatorNode" {
 
   @DomName('OscillatorNode.CUSTOM')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int CUSTOM = 4;
 
   @DomName('OscillatorNode.FINISHED_STATE')
@@ -763,6 +822,8 @@
 
   @DomName('OscillatorNode.SAWTOOTH')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int SAWTOOTH = 2;
 
   @DomName('OscillatorNode.SCHEDULED_STATE')
@@ -771,14 +832,20 @@
 
   @DomName('OscillatorNode.SINE')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int SINE = 0;
 
   @DomName('OscillatorNode.SQUARE')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int SQUARE = 1;
 
   @DomName('OscillatorNode.TRIANGLE')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int TRIANGLE = 3;
 
   @DomName('OscillatorNode.UNSCHEDULED_STATE')
@@ -803,10 +870,12 @@
 
   @DomName('OscillatorNode.noteOff')
   @DocsEditable
+  @Experimental // untriaged
   void noteOff(num when) native;
 
   @DomName('OscillatorNode.noteOn')
   @DocsEditable
+  @Experimental // untriaged
   void noteOn(num when) native;
 
   @DomName('OscillatorNode.setWaveTable')
@@ -828,30 +897,44 @@
 
 @DocsEditable
 @DomName('PannerNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#PannerNode
+@Experimental
 class PannerNode extends AudioNode native "PannerNode" {
 
   @DomName('PannerNode.EQUALPOWER')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int EQUALPOWER = 0;
 
   @DomName('PannerNode.EXPONENTIAL_DISTANCE')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int EXPONENTIAL_DISTANCE = 2;
 
   @DomName('PannerNode.HRTF')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int HRTF = 1;
 
   @DomName('PannerNode.INVERSE_DISTANCE')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int INVERSE_DISTANCE = 1;
 
   @DomName('PannerNode.LINEAR_DISTANCE')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int LINEAR_DISTANCE = 0;
 
   @DomName('PannerNode.SOUNDFIELD')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int SOUNDFIELD = 2;
 
   @DomName('PannerNode.coneInnerAngle')
@@ -904,6 +987,8 @@
 
 
 @DomName('ScriptProcessorNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ScriptProcessorNode
+@Experimental
 class ScriptProcessorNode extends AudioNode native "ScriptProcessorNode" {
   Stream<AudioProcessingEvent> _eventStream;
 
@@ -950,6 +1035,8 @@
 
 @DocsEditable
 @DomName('WaveShaperNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#dfn-WaveShaperNode
+@Experimental
 class WaveShaperNode extends AudioNode native "WaveShaperNode" {
 
   @DomName('WaveShaperNode.curve')
@@ -963,5 +1050,7 @@
 
 @DocsEditable
 @DomName('WaveTable')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#WaveTable-section
+@Experimental
 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 0556cf3..6c60ae1 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -22,6 +22,8 @@
 
 @DocsEditable
 @DomName('AnalyserNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AnalyserNode
+@Experimental
 class AnalyserNode extends AudioNode {
   AnalyserNode.internal() : super.internal();
 
@@ -83,6 +85,8 @@
 
 @DocsEditable
 @DomName('AudioBuffer')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBuffer-section
+@Experimental
 class AudioBuffer extends NativeFieldWrapperClass1 {
   AudioBuffer.internal();
 
@@ -122,6 +126,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('AudioBufferCallback')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBuffer-section
+@Experimental
 typedef void AudioBufferCallback(AudioBuffer audioBuffer);
 // 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
@@ -132,6 +139,8 @@
 
 @DocsEditable
 @DomName('AudioBufferSourceNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBufferSourceNode-section
+@Experimental
 class AudioBufferSourceNode extends AudioSourceNode {
   AudioBufferSourceNode.internal() : super.internal();
 
@@ -197,14 +206,17 @@
 
   @DomName('AudioBufferSourceNode.noteGrainOn')
   @DocsEditable
+  @Experimental // untriaged
   void noteGrainOn(num when, num grainOffset, num grainDuration) native "AudioBufferSourceNode_noteGrainOn_Callback";
 
   @DomName('AudioBufferSourceNode.noteOff')
   @DocsEditable
+  @Experimental // untriaged
   void noteOff(num when) native "AudioBufferSourceNode_noteOff_Callback";
 
   @DomName('AudioBufferSourceNode.noteOn')
   @DocsEditable
+  @Experimental // untriaged
   void noteOn(num when) native "AudioBufferSourceNode_noteOn_Callback";
 
   void start(num when, [num grainOffset, num grainDuration]) {
@@ -240,6 +252,8 @@
 
 
 @DomName('AudioContext')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioContext-section
+@Experimental
 class AudioContext extends EventTarget {
   AudioContext.internal() : super.internal();
 
@@ -358,6 +372,7 @@
 
   @DomName('AudioContext.createGainNode')
   @DocsEditable
+  @Experimental // untriaged
   GainNode createGainNode() native "AudioContext_createGainNode_Callback";
 
   ScriptProcessorNode createJavaScriptNode(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]) {
@@ -442,6 +457,8 @@
 
 @DocsEditable
 @DomName('AudioDestinationNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioDestinationNode-section
+@Experimental
 class AudioDestinationNode extends AudioNode {
   AudioDestinationNode.internal() : super.internal();
 
@@ -459,6 +476,8 @@
 
 @DocsEditable
 @DomName('AudioListener')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioListener-section
+@Experimental
 class AudioListener extends NativeFieldWrapperClass1 {
   AudioListener.internal();
 
@@ -500,6 +519,8 @@
 
 @DocsEditable
 @DomName('AudioNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioNode-section
+@Experimental
 class AudioNode extends NativeFieldWrapperClass1 {
   AudioNode.internal();
 
@@ -569,6 +590,8 @@
 
 @DocsEditable
 @DomName('AudioParam')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioParam
+@Experimental
 class AudioParam extends NativeFieldWrapperClass1 {
   AudioParam.internal();
 
@@ -618,6 +641,7 @@
 
   @DomName('AudioParam.setTargetValueAtTime')
   @DocsEditable
+  @Experimental // untriaged
   void setTargetValueAtTime(num targetValue, num time, num timeConstant) native "AudioParam_setTargetValueAtTime_Callback";
 
   @DomName('AudioParam.setValueAtTime')
@@ -638,6 +662,8 @@
 
 @DocsEditable
 @DomName('AudioProcessingEvent')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioProcessingEvent-section
+@Experimental
 class AudioProcessingEvent extends Event {
   AudioProcessingEvent.internal() : super.internal();
 
@@ -659,6 +685,8 @@
 
 @DocsEditable
 @DomName('AudioSourceNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html
+@Experimental
 class AudioSourceNode extends AudioNode {
   AudioSourceNode.internal() : super.internal();
 
@@ -672,6 +700,8 @@
 
 @DocsEditable
 @DomName('BiquadFilterNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#BiquadFilterNode-section
+@Experimental
 class BiquadFilterNode extends AudioNode {
   BiquadFilterNode.internal() : super.internal();
 
@@ -745,6 +775,8 @@
 
 @DocsEditable
 @DomName('ChannelMergerNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ChannelMergerNode-section
+@Experimental
 class ChannelMergerNode extends AudioNode {
   ChannelMergerNode.internal() : super.internal();
 
@@ -758,6 +790,8 @@
 
 @DocsEditable
 @DomName('ChannelSplitterNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ChannelSplitterNode-section
+@Experimental
 class ChannelSplitterNode extends AudioNode {
   ChannelSplitterNode.internal() : super.internal();
 
@@ -771,6 +805,8 @@
 
 @DocsEditable
 @DomName('ConvolverNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ConvolverNode
+@Experimental
 class ConvolverNode extends AudioNode {
   ConvolverNode.internal() : super.internal();
 
@@ -800,6 +836,8 @@
 
 @DocsEditable
 @DomName('DelayNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#DelayNode
+@Experimental
 class DelayNode extends AudioNode {
   DelayNode.internal() : super.internal();
 
@@ -817,6 +855,8 @@
 
 @DocsEditable
 @DomName('DynamicsCompressorNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#DynamicsCompressorNode
+@Experimental
 class DynamicsCompressorNode extends AudioNode {
   DynamicsCompressorNode.internal() : super.internal();
 
@@ -854,6 +894,8 @@
 
 @DocsEditable
 @DomName('GainNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#GainNode
+@Experimental
 class GainNode extends AudioNode {
   GainNode.internal() : super.internal();
 
@@ -871,11 +913,14 @@
 
 @DocsEditable
 @DomName('MediaElementAudioSourceNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaElementAudioSourceNode
+@Experimental
 class MediaElementAudioSourceNode extends AudioSourceNode {
   MediaElementAudioSourceNode.internal() : super.internal();
 
   @DomName('MediaElementAudioSourceNode.mediaElement')
   @DocsEditable
+  @Experimental // non-standard
   MediaElement get mediaElement native "MediaElementAudioSourceNode_mediaElement_Getter";
 
 }
@@ -888,6 +933,8 @@
 
 @DocsEditable
 @DomName('MediaStreamAudioDestinationNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaStreamAudioDestinationNode
+@Experimental
 class MediaStreamAudioDestinationNode extends AudioSourceNode {
   MediaStreamAudioDestinationNode.internal() : super.internal();
 
@@ -905,6 +952,8 @@
 
 @DocsEditable
 @DomName('MediaStreamAudioSourceNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaStreamAudioSourceNode
+@Experimental
 class MediaStreamAudioSourceNode extends AudioSourceNode {
   MediaStreamAudioSourceNode.internal() : super.internal();
 
@@ -922,6 +971,8 @@
 
 @DocsEditable
 @DomName('OfflineAudioCompletionEvent')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#OfflineAudioCompletionEvent-section
+@Experimental
 class OfflineAudioCompletionEvent extends Event {
   OfflineAudioCompletionEvent.internal() : super.internal();
 
@@ -939,6 +990,8 @@
 
 @DocsEditable
 @DomName('OfflineAudioContext')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#OfflineAudioContext-section
+@Experimental
 class OfflineAudioContext extends AudioContext implements EventTarget {
   OfflineAudioContext.internal() : super.internal();
 
@@ -961,11 +1014,15 @@
 
 @DocsEditable
 @DomName('OscillatorNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#dfn-OscillatorNode
+@Experimental
 class OscillatorNode extends AudioSourceNode {
   OscillatorNode.internal() : super.internal();
 
   @DomName('OscillatorNode.CUSTOM')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int CUSTOM = 4;
 
   @DomName('OscillatorNode.FINISHED_STATE')
@@ -978,6 +1035,8 @@
 
   @DomName('OscillatorNode.SAWTOOTH')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int SAWTOOTH = 2;
 
   @DomName('OscillatorNode.SCHEDULED_STATE')
@@ -986,14 +1045,20 @@
 
   @DomName('OscillatorNode.SINE')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int SINE = 0;
 
   @DomName('OscillatorNode.SQUARE')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int SQUARE = 1;
 
   @DomName('OscillatorNode.TRIANGLE')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int TRIANGLE = 3;
 
   @DomName('OscillatorNode.UNSCHEDULED_STATE')
@@ -1022,10 +1087,12 @@
 
   @DomName('OscillatorNode.noteOff')
   @DocsEditable
+  @Experimental // untriaged
   void noteOff(num when) native "OscillatorNode_noteOff_Callback";
 
   @DomName('OscillatorNode.noteOn')
   @DocsEditable
+  @Experimental // untriaged
   void noteOn(num when) native "OscillatorNode_noteOn_Callback";
 
   @DomName('OscillatorNode.setWaveTable')
@@ -1050,31 +1117,45 @@
 
 @DocsEditable
 @DomName('PannerNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#PannerNode
+@Experimental
 class PannerNode extends AudioNode {
   PannerNode.internal() : super.internal();
 
   @DomName('PannerNode.EQUALPOWER')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int EQUALPOWER = 0;
 
   @DomName('PannerNode.EXPONENTIAL_DISTANCE')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int EXPONENTIAL_DISTANCE = 2;
 
   @DomName('PannerNode.HRTF')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int HRTF = 1;
 
   @DomName('PannerNode.INVERSE_DISTANCE')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int INVERSE_DISTANCE = 1;
 
   @DomName('PannerNode.LINEAR_DISTANCE')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int LINEAR_DISTANCE = 0;
 
   @DomName('PannerNode.SOUNDFIELD')
   @DocsEditable
+  // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
+  @deprecated // deprecated
   static const int SOUNDFIELD = 2;
 
   @DomName('PannerNode.coneInnerAngle')
@@ -1160,6 +1241,8 @@
 
 
 @DomName('ScriptProcessorNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ScriptProcessorNode
+@Experimental
 class ScriptProcessorNode extends AudioNode {
   Stream<AudioProcessingEvent> _eventStream;
 
@@ -1197,6 +1280,7 @@
 
   @DomName('ScriptProcessorNode._setEventListener')
   @DocsEditable
+  @Experimental // non-standard
   void _setEventListener(EventListener eventListener) native "ScriptProcessorNode__setEventListener_Callback";
 
 }
@@ -1209,6 +1293,8 @@
 
 @DocsEditable
 @DomName('WaveShaperNode')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#dfn-WaveShaperNode
+@Experimental
 class WaveShaperNode extends AudioNode {
   WaveShaperNode.internal() : super.internal();
 
@@ -1230,6 +1316,8 @@
 
 @DocsEditable
 @DomName('WaveTable')
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#WaveTable-section
+@Experimental
 class WaveTable extends NativeFieldWrapperClass1 {
   WaveTable.internal();
 
diff --git a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
index 1ab1cd79c..ae64061 100644
--- a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -324,6 +324,7 @@
 
 @DocsEditable
 @DomName('WebGLActiveInfo')
+@Unstable
 class ActiveInfo native "WebGLActiveInfo" {
 
   @DomName('WebGLActiveInfo.name')
@@ -345,6 +346,7 @@
 
 @DocsEditable
 @DomName('WebGLBuffer')
+@Unstable
 class Buffer native "WebGLBuffer" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -354,6 +356,8 @@
 
 @DocsEditable
 @DomName('WebGLCompressedTextureATC')
+// http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_atc/
+@Experimental
 class CompressedTextureAtc native "WebGLCompressedTextureATC" {
 
   @DomName('WebGLCompressedTextureATC.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL')
@@ -375,6 +379,8 @@
 
 @DocsEditable
 @DomName('WebGLCompressedTexturePVRTC')
+// http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_pvrtc/
+@Experimental // experimental
 class CompressedTexturePvrtc native "WebGLCompressedTexturePVRTC" {
 
   @DomName('WebGLCompressedTexturePVRTC.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG')
@@ -400,6 +406,8 @@
 
 @DocsEditable
 @DomName('WebGLCompressedTextureS3TC')
+// http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/
+@Experimental // experimental
 class CompressedTextureS3TC native "WebGLCompressedTextureS3TC" {
 
   @DomName('WebGLCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT1_EXT')
@@ -425,6 +433,7 @@
 
 @DocsEditable
 @DomName('WebGLContextAttributes')
+@Unstable
 class ContextAttributes native "WebGLContextAttributes" {
 
   @DomName('WebGLContextAttributes.alpha')
@@ -458,6 +467,7 @@
 
 @DocsEditable
 @DomName('WebGLContextEvent')
+@Unstable
 class ContextEvent extends Event native "WebGLContextEvent" {
 
   @DomName('WebGLContextEvent.statusMessage')
@@ -471,6 +481,8 @@
 
 @DocsEditable
 @DomName('WebGLDebugRendererInfo')
+// http://www.khronos.org/registry/webgl/extensions/WEBGL_debug_renderer_info/
+@Experimental // experimental
 class DebugRendererInfo native "WebGLDebugRendererInfo" {
 
   @DomName('WebGLDebugRendererInfo.UNMASKED_RENDERER_WEBGL')
@@ -488,6 +500,8 @@
 
 @DocsEditable
 @DomName('WebGLDebugShaders')
+// http://www.khronos.org/registry/webgl/extensions/WEBGL_debug_shaders/
+@Experimental // experimental
 class DebugShaders native "WebGLDebugShaders" {
 
   @DomName('WebGLDebugShaders.getTranslatedShaderSource')
@@ -501,6 +515,8 @@
 
 @DocsEditable
 @DomName('WebGLDepthTexture')
+// http://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/
+@Experimental // experimental
 class DepthTexture native "WebGLDepthTexture" {
 
   @DomName('WebGLDepthTexture.UNSIGNED_INT_24_8_WEBGL')
@@ -514,6 +530,8 @@
 
 @DocsEditable
 @DomName('EXTDrawBuffers')
+// http://www.khronos.org/registry/webgl/specs/latest/
+@Experimental // stable
 class ExtDrawBuffers native "EXTDrawBuffers" {
 
   @DomName('EXTDrawBuffers.COLOR_ATTACHMENT0_EXT')
@@ -659,6 +677,8 @@
 
 @DocsEditable
 @DomName('EXTTextureFilterAnisotropic')
+// http://www.khronos.org/registry/webgl/extensions/EXT_texture_filter_anisotropic/
+@Experimental
 class ExtTextureFilterAnisotropic native "EXTTextureFilterAnisotropic" {
 
   @DomName('EXTTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT')
@@ -676,6 +696,7 @@
 
 @DocsEditable
 @DomName('WebGLFramebuffer')
+@Unstable
 class Framebuffer native "WebGLFramebuffer" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -685,6 +706,8 @@
 
 @DocsEditable
 @DomName('WebGLLoseContext')
+// http://www.khronos.org/registry/webgl/extensions/WEBGL_lose_context/
+@Experimental
 class LoseContext native "WebGLLoseContext" {
 
   @DomName('WebGLLoseContext.loseContext')
@@ -702,6 +725,8 @@
 
 @DocsEditable
 @DomName('OESElementIndexUint')
+// http://www.khronos.org/registry/webgl/extensions/OES_element_index_uint/
+@Experimental // experimental
 class OesElementIndexUint native "OESElementIndexUint" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -711,6 +736,8 @@
 
 @DocsEditable
 @DomName('OESStandardDerivatives')
+// http://www.khronos.org/registry/webgl/extensions/OES_standard_derivatives/
+@Experimental // experimental
 class OesStandardDerivatives native "OESStandardDerivatives" {
 
   @DomName('OESStandardDerivatives.FRAGMENT_SHADER_DERIVATIVE_HINT_OES')
@@ -724,6 +751,8 @@
 
 @DocsEditable
 @DomName('OESTextureFloat')
+// http://www.khronos.org/registry/webgl/extensions/OES_texture_float/
+@Experimental // experimental
 class OesTextureFloat native "OESTextureFloat" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -733,10 +762,13 @@
 
 @DocsEditable
 @DomName('OESTextureHalfFloat')
+// http://www.khronos.org/registry/webgl/extensions/OES_texture_half_float/
+@Experimental // experimental
 class OesTextureHalfFloat native "OESTextureHalfFloat" {
 
   @DomName('OESTextureHalfFloat.HALF_FLOAT_OES')
   @DocsEditable
+  @Experimental // untriaged
   static const int HALF_FLOAT_OES = 0x8D61;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -746,6 +778,8 @@
 
 @DocsEditable
 @DomName('OESVertexArrayObject')
+// http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/
+@Experimental // experimental
 class OesVertexArrayObject native "OESVertexArrayObject" {
 
   @DomName('OESVertexArrayObject.VERTEX_ARRAY_BINDING_OES')
@@ -779,6 +813,7 @@
 
 @DocsEditable
 @DomName('WebGLProgram')
+@Unstable
 class Program native "WebGLProgram" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -788,6 +823,7 @@
 
 @DocsEditable
 @DomName('WebGLRenderbuffer')
+@Unstable
 class Renderbuffer native "WebGLRenderbuffer" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -800,6 +836,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @Experimental
+@Unstable
 class RenderingContext extends CanvasRenderingContext native "WebGLRenderingContext" {
 
   /// Checks if this type is supported on the current platform.
@@ -2402,7 +2439,7 @@
   @DomName('WebGLRenderingContext.texImage2D')
   @DocsEditable
   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, TypedData pixels]) {
-    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null)) {
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && ?format && ?type && ?pixels) {
       _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
       return;
     }
@@ -2457,7 +2494,7 @@
   @DomName('WebGLRenderingContext.texSubImage2D')
   @DocsEditable
   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, TypedData pixels]) {
-    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null)) {
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && ?type && ?pixels) {
       _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
       return;
     }
@@ -2680,5 +2717,7 @@
 
 @DocsEditable
 @DomName('WebGLVertexArrayObjectOES')
+// http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/
+@Experimental // experimental
 class VertexArrayObject native "WebGLVertexArrayObjectOES" {
 }
diff --git a/sdk/lib/web_gl/dartium/web_gl_dartium.dart b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
index a200ad4..586ee44 100644
--- a/sdk/lib/web_gl/dartium/web_gl_dartium.dart
+++ b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
@@ -324,6 +324,7 @@
 
 @DocsEditable
 @DomName('WebGLActiveInfo')
+@Unstable
 class ActiveInfo extends NativeFieldWrapperClass1 {
   ActiveInfo.internal();
 
@@ -349,6 +350,7 @@
 
 @DocsEditable
 @DomName('WebGLBuffer')
+@Unstable
 class Buffer extends NativeFieldWrapperClass1 {
   Buffer.internal();
 
@@ -362,6 +364,8 @@
 
 @DocsEditable
 @DomName('WebGLCompressedTextureATC')
+// http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_atc/
+@Experimental
 class CompressedTextureAtc extends NativeFieldWrapperClass1 {
   CompressedTextureAtc.internal();
 
@@ -387,6 +391,8 @@
 
 @DocsEditable
 @DomName('WebGLCompressedTexturePVRTC')
+// http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_pvrtc/
+@Experimental // experimental
 class CompressedTexturePvrtc extends NativeFieldWrapperClass1 {
   CompressedTexturePvrtc.internal();
 
@@ -416,6 +422,8 @@
 
 @DocsEditable
 @DomName('WebGLCompressedTextureS3TC')
+// http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/
+@Experimental // experimental
 class CompressedTextureS3TC extends NativeFieldWrapperClass1 {
   CompressedTextureS3TC.internal();
 
@@ -445,6 +453,7 @@
 
 @DocsEditable
 @DomName('WebGLContextAttributes')
+@Unstable
 class ContextAttributes extends NativeFieldWrapperClass1 {
   ContextAttributes.internal();
 
@@ -506,6 +515,7 @@
 
 @DocsEditable
 @DomName('WebGLContextEvent')
+@Unstable
 class ContextEvent extends Event {
   ContextEvent.internal() : super.internal();
 
@@ -523,6 +533,8 @@
 
 @DocsEditable
 @DomName('WebGLDebugRendererInfo')
+// http://www.khronos.org/registry/webgl/extensions/WEBGL_debug_renderer_info/
+@Experimental // experimental
 class DebugRendererInfo extends NativeFieldWrapperClass1 {
   DebugRendererInfo.internal();
 
@@ -544,6 +556,8 @@
 
 @DocsEditable
 @DomName('WebGLDebugShaders')
+// http://www.khronos.org/registry/webgl/extensions/WEBGL_debug_shaders/
+@Experimental // experimental
 class DebugShaders extends NativeFieldWrapperClass1 {
   DebugShaders.internal();
 
@@ -561,6 +575,8 @@
 
 @DocsEditable
 @DomName('WebGLDepthTexture')
+// http://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/
+@Experimental // experimental
 class DepthTexture extends NativeFieldWrapperClass1 {
   DepthTexture.internal();
 
@@ -578,6 +594,8 @@
 
 @DocsEditable
 @DomName('EXTDrawBuffers')
+// http://www.khronos.org/registry/webgl/specs/latest/
+@Experimental // stable
 class ExtDrawBuffers extends NativeFieldWrapperClass1 {
   ExtDrawBuffers.internal();
 
@@ -727,6 +745,8 @@
 
 @DocsEditable
 @DomName('EXTTextureFilterAnisotropic')
+// http://www.khronos.org/registry/webgl/extensions/EXT_texture_filter_anisotropic/
+@Experimental
 class ExtTextureFilterAnisotropic extends NativeFieldWrapperClass1 {
   ExtTextureFilterAnisotropic.internal();
 
@@ -748,6 +768,7 @@
 
 @DocsEditable
 @DomName('WebGLFramebuffer')
+@Unstable
 class Framebuffer extends NativeFieldWrapperClass1 {
   Framebuffer.internal();
 
@@ -761,6 +782,8 @@
 
 @DocsEditable
 @DomName('WebGLLoseContext')
+// http://www.khronos.org/registry/webgl/extensions/WEBGL_lose_context/
+@Experimental
 class LoseContext extends NativeFieldWrapperClass1 {
   LoseContext.internal();
 
@@ -782,6 +805,8 @@
 
 @DocsEditable
 @DomName('OESElementIndexUint')
+// http://www.khronos.org/registry/webgl/extensions/OES_element_index_uint/
+@Experimental // experimental
 class OesElementIndexUint extends NativeFieldWrapperClass1 {
   OesElementIndexUint.internal();
 
@@ -795,6 +820,8 @@
 
 @DocsEditable
 @DomName('OESStandardDerivatives')
+// http://www.khronos.org/registry/webgl/extensions/OES_standard_derivatives/
+@Experimental // experimental
 class OesStandardDerivatives extends NativeFieldWrapperClass1 {
   OesStandardDerivatives.internal();
 
@@ -812,6 +839,8 @@
 
 @DocsEditable
 @DomName('OESTextureFloat')
+// http://www.khronos.org/registry/webgl/extensions/OES_texture_float/
+@Experimental // experimental
 class OesTextureFloat extends NativeFieldWrapperClass1 {
   OesTextureFloat.internal();
 
@@ -825,11 +854,14 @@
 
 @DocsEditable
 @DomName('OESTextureHalfFloat')
+// http://www.khronos.org/registry/webgl/extensions/OES_texture_half_float/
+@Experimental // experimental
 class OesTextureHalfFloat extends NativeFieldWrapperClass1 {
   OesTextureHalfFloat.internal();
 
   @DomName('OESTextureHalfFloat.HALF_FLOAT_OES')
   @DocsEditable
+  @Experimental // untriaged
   static const int HALF_FLOAT_OES = 0x8D61;
 
 }
@@ -842,6 +874,8 @@
 
 @DocsEditable
 @DomName('OESVertexArrayObject')
+// http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/
+@Experimental // experimental
 class OesVertexArrayObject extends NativeFieldWrapperClass1 {
   OesVertexArrayObject.internal();
 
@@ -875,6 +909,7 @@
 
 @DocsEditable
 @DomName('WebGLProgram')
+@Unstable
 class Program extends NativeFieldWrapperClass1 {
   Program.internal();
 
@@ -888,6 +923,7 @@
 
 @DocsEditable
 @DomName('WebGLRenderbuffer')
+@Unstable
 class Renderbuffer extends NativeFieldWrapperClass1 {
   Renderbuffer.internal();
 
@@ -904,6 +940,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @Experimental
+@Unstable
 class RenderingContext extends CanvasRenderingContext {
   RenderingContext.internal() : super.internal();
 
@@ -2806,6 +2843,8 @@
 
 @DocsEditable
 @DomName('WebGLVertexArrayObjectOES')
+// http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/
+@Experimental // experimental
 class VertexArrayObject extends NativeFieldWrapperClass1 {
   VertexArrayObject.internal();
 
diff --git a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
index b4990c4..0ef2334 100644
--- a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
+++ b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
@@ -32,6 +32,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('SQLStatementCallback')
+// http://www.w3.org/TR/webdatabase/#sqlstatementcallback
+@Experimental // deprecated
 typedef void SqlStatementCallback(SqlTransaction transaction, SqlResultSet resultSet);
 // 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
@@ -40,6 +43,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('SQLStatementErrorCallback')
+// http://www.w3.org/TR/webdatabase/#sqlstatementerrorcallback
+@Experimental // deprecated
 typedef void SqlStatementErrorCallback(SqlTransaction transaction, SqlError 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
@@ -48,6 +54,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('SQLTransactionCallback')
+// http://www.w3.org/TR/webdatabase/#sqltransactioncallback
+@Experimental // deprecated
 typedef void SqlTransactionCallback(SqlTransaction transaction);
 // 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
@@ -56,6 +65,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('SQLTransactionErrorCallback')
+// http://www.w3.org/TR/webdatabase/#sqltransactionerrorcallback
+@Experimental // deprecated
 typedef void SqlTransactionErrorCallback(SqlError 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
@@ -67,6 +79,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/webdatabase/#asynchronous-database-api
+@Experimental // deprecated
 class SqlDatabase native "Database" {
 
   /// Checks if this type is supported on the current platform.
@@ -107,6 +121,8 @@
 
 @DocsEditable
 @DomName('SQLError')
+// http://www.w3.org/TR/webdatabase/#sqlerror
+@Experimental // deprecated
 class SqlError native "SQLError" {
 
   @DomName('SQLError.CONSTRAINT_ERR')
@@ -156,6 +172,8 @@
 
 @DocsEditable
 @DomName('SQLException')
+// http://www.w3.org/TR/webdatabase/#sqlexception
+@Experimental // deprecated
 class SqlException native "SQLException" {
 
   @DomName('SQLException.CONSTRAINT_ERR')
@@ -205,6 +223,8 @@
 
 @DocsEditable
 @DomName('SQLResultSet')
+// http://www.w3.org/TR/webdatabase/#sqlresultset
+@Experimental // deprecated
 class SqlResultSet native "SQLResultSet" {
 
   @DomName('SQLResultSet.insertId')
@@ -226,6 +246,8 @@
 
 @DocsEditable
 @DomName('SQLResultSetRowList')
+// http://www.w3.org/TR/webdatabase/#sqlresultsetrowlist
+@Experimental // deprecated
 class SqlResultSetRowList extends Interceptor with ListMixin<Map>, ImmutableListMixin<Map> implements JavaScriptIndexingBehavior, List<Map> native "SQLResultSetRowList" {
 
   @DomName('SQLResultSetRowList.length')
@@ -298,6 +320,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/webdatabase/#sqltransaction
+@deprecated // deprecated
 class SqlTransaction native "SQLTransaction" {
 
   @DomName('SQLTransaction.executeSql')
@@ -314,5 +338,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/webdatabase/#sqltransactionsync
+@Experimental // deprecated
 abstract class _SQLTransactionSync native "SQLTransactionSync" {
 }
diff --git a/sdk/lib/web_sql/dartium/web_sql_dartium.dart b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
index f33d285..b057cc8 100644
--- a/sdk/lib/web_sql/dartium/web_sql_dartium.dart
+++ b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
@@ -30,6 +30,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('SQLStatementCallback')
+// http://www.w3.org/TR/webdatabase/#sqlstatementcallback
+@Experimental // deprecated
 typedef void SqlStatementCallback(SqlTransaction transaction, SqlResultSet resultSet);
 // 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
@@ -38,6 +41,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('SQLStatementErrorCallback')
+// http://www.w3.org/TR/webdatabase/#sqlstatementerrorcallback
+@Experimental // deprecated
 typedef void SqlStatementErrorCallback(SqlTransaction transaction, SqlError 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
@@ -46,6 +52,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('SQLTransactionCallback')
+// http://www.w3.org/TR/webdatabase/#sqltransactioncallback
+@Experimental // deprecated
 typedef void SqlTransactionCallback(SqlTransaction transaction);
 // 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
@@ -54,6 +63,9 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('SQLTransactionErrorCallback')
+// http://www.w3.org/TR/webdatabase/#sqltransactionerrorcallback
+@Experimental // deprecated
 typedef void SqlTransactionErrorCallback(SqlError 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
@@ -67,6 +79,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/webdatabase/#asynchronous-database-api
+@Experimental // deprecated
 class SqlDatabase extends NativeFieldWrapperClass1 {
   SqlDatabase.internal();
 
@@ -111,6 +125,8 @@
 
 @DocsEditable
 @DomName('SQLError')
+// http://www.w3.org/TR/webdatabase/#sqlerror
+@Experimental // deprecated
 class SqlError extends NativeFieldWrapperClass1 {
   SqlError.internal();
 
@@ -164,6 +180,8 @@
 
 @DocsEditable
 @DomName('SQLException')
+// http://www.w3.org/TR/webdatabase/#sqlexception
+@Experimental // deprecated
 class SqlException extends NativeFieldWrapperClass1 {
   SqlException.internal();
 
@@ -217,6 +235,8 @@
 
 @DocsEditable
 @DomName('SQLResultSet')
+// http://www.w3.org/TR/webdatabase/#sqlresultset
+@Experimental // deprecated
 class SqlResultSet extends NativeFieldWrapperClass1 {
   SqlResultSet.internal();
 
@@ -242,6 +262,8 @@
 
 @DocsEditable
 @DomName('SQLResultSetRowList')
+// http://www.w3.org/TR/webdatabase/#sqlresultsetrowlist
+@Experimental // deprecated
 class SqlResultSetRowList extends NativeFieldWrapperClass1 with ListMixin<Map>, ImmutableListMixin<Map> implements List<Map> {
   SqlResultSetRowList.internal();
 
@@ -311,6 +333,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/webdatabase/#sqltransaction
+@deprecated // deprecated
 class SqlTransaction extends NativeFieldWrapperClass1 {
   SqlTransaction.internal();
 
@@ -331,6 +355,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// http://www.w3.org/TR/webdatabase/#sqltransactionsync
+@Experimental // deprecated
 abstract class _SQLTransactionSync extends NativeFieldWrapperClass1 {
   _SQLTransactionSync.internal();
 
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index 2a350af..63668be 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -55,7 +55,6 @@
 Language/11_Expressions/01_Constants_A16_t03: fail
 Language/11_Expressions/01_Constants_A17_t03: fail
 Language/11_Expressions/01_Constants_A19_t04: fail
-Language/11_Expressions/01_Constants_A20_t02: fail
 Language/11_Expressions/03_Numbers_A01_t01: fail
 Language/11_Expressions/03_Numbers_A01_t02: fail
 Language/11_Expressions/03_Numbers_A01_t03: fail
@@ -81,7 +80,6 @@
 Language/11_Expressions/11_Instance_Creation/2_Const_A10_t01: fail
 Language/11_Expressions/11_Instance_Creation_A05_t02: fail
 Language/11_Expressions/14_Function_Invocation/1_Actual_Argument_List_Evaluation_A02_t01: fail
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A04_t01: fail
 Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t05: fail
 Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A02_t01: fail
 Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: fail
@@ -127,21 +125,6 @@
 LibTest/core/AssertionError/failedAssertion_A01_t01: fail
 LibTest/core/AssertionError/line_A01_t02: fail
 LibTest/core/AssertionError/url_A01_t01: fail
-LibTest/core/Iterable/where_A01_t07: fail
-LibTest/core/List/List.fixedLength_A01_t01: fail
-LibTest/core/List/List_A01_t02: fail
-LibTest/core/List/addLast_A01_t01: fail
-LibTest/core/List/addLast_A01_t03: fail
-LibTest/core/List/addLast_A02_t01: fail
-LibTest/core/List/every_A01_t01: fail
-LibTest/core/List/insertRange_A01_t01: fail
-LibTest/core/List/insertRange_A02_t01: fail
-LibTest/core/List/insertRange_A03_t01: fail
-LibTest/core/List/insertRange_A04_t01: fail
-LibTest/core/List/insertRange_A05_t01: fail
-LibTest/core/List/insertRange_A06_t01: fail
-LibTest/core/List/insertRange_A07_t01: fail
-LibTest/core/List/insertRange_A08_t01: fail
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t02: fail
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A04_t01: fail
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: fail
@@ -176,6 +159,28 @@
 # fails locally, passes on bot
 Language/13_Libraries_and_Scripts/3_Parts_A02_t03: skip
 
+# co19 issue #397, List.addLast removed
+LibTest/core/Iterable/where_A01_t07: fail, OK
+LibTest/core/List/addLast_A01_t01: fail, OK
+LibTest/core/List/addLast_A01_t03: fail, OK
+LibTest/core/List/addLast_A02_t01: fail, OK
+
+# co19 issue #400, collection library reorg
+LibTest/core/List/List.fixedLength_A01_t01: fail, OK
+LibTest/core/List/operator_subscript_A01_t02: fail, OK
+
+# co19 issue #403
+LibTest/core/List/List_A01_t02: fail, OK
+LibTest/core/List/every_A01_t01: fail, OK
+LibTest/core/List/insertRange_A01_t01: fail, OK
+LibTest/core/List/insertRange_A02_t01: fail, OK
+LibTest/core/List/insertRange_A03_t01: fail, OK
+LibTest/core/List/insertRange_A04_t01: fail, OK
+LibTest/core/List/insertRange_A05_t01: fail, OK
+LibTest/core/List/insertRange_A06_t01: fail, OK
+LibTest/core/List/insertRange_A07_t01: fail, OK
+LibTest/core/List/insertRange_A08_t01: fail, OK
+
 # co19 issue #412, using 'null' as operand
 Language/11_Expressions/01_Constants_A11_t01: fail, OK
 Language/11_Expressions/01_Constants_A12_t01: fail, OK
@@ -188,7 +193,7 @@
 Language/03_Overview/1_Scoping_A02_t07: fail, OK
 Language/12_Statements/04_Local_Function_Declaration_A01_t01: fail, OK
 
-# co19 issue $417, 'if', 'while' and 'do-while' don't create scope
+# co19 issue #417, 'if', 'while' and 'do-while' don't create scope
 Language/03_Overview/1_Scoping_A02_t11: fail, OK
 Language/03_Overview/1_Scoping_A02_t12: fail, OK
 Language/03_Overview/1_Scoping_A02_t16: fail, OK
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index 7567121..d9e50ce 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -557,10 +557,10 @@
 LibTest/async/Future/Future.immediateError_A01_t01: Fail # No AsyncError anymore. Issue 407
 LibTest/async/Future/catchError_A02_t01: Fail # No AsyncError anymore. Issue 407
 
-LibTest/async/Completer/complete_A01_t03: Fail # Completer is now asynchronous. Issue TODO
-LibTest/async/Completer/complete_A01_t04: Fail # Completer is now asynchronous. Issue TODO
-LibTest/async/Future/then_A01_t01: Fail # Completer is now asynchronous. Issue TODO
-LibTest/async/Future/then_A01_t04: Fail # Completer is now asynchronous. Issue TODO
+LibTest/async/Completer/complete_A01_t03: Fail # Completer is now asynchronous. Issue 419
+LibTest/async/Completer/complete_A01_t04: Fail # Completer is now asynchronous. Issue 419
+LibTest/async/Future/then_A01_t01: Fail # Completer is now asynchronous. Issue 419
+LibTest/async/Future/then_A01_t04: Fail # Completer is now asynchronous. Issue 419
 
 Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail # Issue 397
 Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail # Issue 397
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index ecc143f..4cf42f1 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -133,7 +133,6 @@
 LibTest/core/List/List_A01_t02: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/double/INFINITY_A01_t04: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/double/NEGATIVE_INFINITY_A01_t04: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/double/parse_A01_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/double/toStringAsExponential_A02_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/int/toStringAsExponential_A02_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/math/pow_A01_t01: Fail # TODO(ahe): Please triage this failure.
@@ -201,7 +200,7 @@
 
 # These tests are passing with 'runtime == ie9' but are either skipped or fail
 # on other configurations
-[ $compiler == dart2js && ($runtime == ie10 || $runtime == ff || $runtime == chrome || $runtime == drt || $runtime == safari || $runtime == opera || $runtime == d8 || $runtime == jsshell) ]
+[ $compiler == dart2js && ($runtime == ie10 || $runtime == ff || $runtime == chrome || $runtime == chromeOnAndroid || $runtime == drt || $runtime == safari || $runtime == opera || $runtime == d8 || $runtime == jsshell) ]
 LibTest/math/exp_A01_t01: Fail, OK # co19 issue 44
 LibTest/math/sin_A01_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/math/tan_A01_t01: Fail # TODO(ahe): Please triage this failure.
@@ -525,10 +524,12 @@
 LibTest/async/Future/Future.immediateError_A01_t01: Fail # No AsyncError anymore. Issue 407
 LibTest/async/Future/catchError_A02_t01: Fail # No AsyncError anymore. Issue 407
 
-LibTest/async/Completer/complete_A01_t03: Fail # Completer is now asynchronous. Issue TODO
-LibTest/async/Completer/complete_A01_t04: Fail # Completer is now asynchronous. Issue TODO
-LibTest/async/Future/then_A01_t01: Fail # Completer is now asynchronous. Issue TODO
-LibTest/async/Future/then_A01_t04: Fail # Completer is now asynchronous. Issue TODO
+LibTest/async/Completer/complete_A01_t03: Fail # Completer is now asynchronous. Issue 419
+LibTest/async/Completer/complete_A01_t04: Fail # Completer is now asynchronous. Issue 419
+LibTest/async/Future/then_A01_t01: Fail # Completer is now asynchronous. Issue 419
+LibTest/async/Future/then_A01_t04: Fail # Completer is now asynchronous. Issue 419
+
+LibTest/core/double/parse_A02_t01: Fail # Issue 418
 
 Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: Fail, OK # co19 issue 409
 Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail, OK # co19 issue 409
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 99470a9..850976f 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -4,6 +4,7 @@
 
 [ $runtime == vm ]
 Language/11_Expressions/33_Argument_Definition_Test_A02_t02: Crash, Pass # http://dartbug.com/9597
+Language/07_Classes/6_Constructors_A02_t01: Skip # co19 issue 415.
 
 [ $compiler == none && $runtime == vm && $unchecked ]
 Language/11_Expressions/11_Instance_Creation_A05_t02: Fail # TODO(vm-team): Please triage this failure.
@@ -176,7 +177,7 @@
 Language/13_Libraries_and_Scripts/5_URIs_A01_t21: Fail # Dart issue 6352
 Language/14_Types/5_Function_Types_A01_t10: Fail # co19 issue 392
 Language/14_Types/5_Function_Types_A02_t06: Fail # co19 issue 392
-LibTest/core/double/parse_A02_t01: Fail # Dart issue 1929
+LibTest/core/double/parse_A02_t01: Fail # co19 issue 418
 LibTest/math/pow_A01_t01: Fail # Dart issue 7318
 LibTest/math/pow_A11_t01: Fail # Dart issue 449
 LibTest/math/pow_A13_t01: Fail # Dart issue 449
@@ -484,10 +485,10 @@
 LibTest/async/Future/Future.immediateError_A01_t01: Fail # No AsyncError anymore. Issue 407
 LibTest/async/Future/catchError_A02_t01: Fail # No AsyncError anymore. Issue 407
 
-LibTest/async/Completer/complete_A01_t03: Fail # Completer is now asynchronous. Issue TODO
-LibTest/async/Completer/complete_A01_t04: Fail # Completer is now asynchronous. Issue TODO
-LibTest/async/Future/then_A01_t01: Fail # Completer is now asynchronous. Issue TODO
-LibTest/async/Future/then_A01_t04: Fail # Completer is now asynchronous. Issue TODO
+LibTest/async/Completer/complete_A01_t03: Fail # Completer is now asynchronous. Issue 419
+LibTest/async/Completer/complete_A01_t04: Fail # Completer is now asynchronous. Issue 419
+LibTest/async/Future/then_A01_t01: Fail # Completer is now asynchronous. Issue 419
+LibTest/async/Future/then_A01_t04: Fail # Completer is now asynchronous. Issue 419
 
 [ $compiler == none && $runtime == vm && $checked ]
 LibTest/core/Set/intersection_A01_t01: Fail # issue 390
diff --git a/tests/compiler/dart2js/analyze_api_test.dart b/tests/compiler/dart2js/analyze_api_test.dart
index 1cc88e4..4e75440 100644
--- a/tests/compiler/dart2js/analyze_api_test.dart
+++ b/tests/compiler/dart2js/analyze_api_test.dart
@@ -29,7 +29,6 @@
 const Map<String,List<String>> WHITE_LIST = const {
   'html_dart2js.dart':
       const ['Warning: Using "new Symbol"', // Issue 10565.
-             'Warning: unreachable code', // Issue 10617.
              // Issue 10688:
              'Warning: no property named',
              "Warning: 'UnsupportedError' is not callable",
diff --git a/tests/compiler/dart2js/class_codegen_test.dart b/tests/compiler/dart2js/class_codegen_test.dart
index 676682e..3380a43 100644
--- a/tests/compiler/dart2js/class_codegen_test.dart
+++ b/tests/compiler/dart2js/class_codegen_test.dart
@@ -65,14 +65,14 @@
 
 twoClasses() {
   String generated = compileAll(TEST_ONE);
-  Expect.isTrue(generated.contains('\$.A = {"": "Object;"'));
-  Expect.isTrue(generated.contains('\$.B = {"": "Object;"'));
+  Expect.isTrue(generated.contains('A: {"": "Object;"'));
+  Expect.isTrue(generated.contains('B: {"": "Object;"'));
 }
 
 subClass() {
   checkOutput(String generated) {
-    Expect.isTrue(generated.contains('\$.A = {"": "Object;"'));
-    Expect.isTrue(generated.contains('\$.B = {"": "A;"'));
+    Expect.isTrue(generated.contains('A: {"": "Object;"'));
+    Expect.isTrue(generated.contains('B: {"": "A;"'));
   }
 
   checkOutput(compileAll(TEST_TWO));
@@ -81,7 +81,7 @@
 
 fieldTest() {
   String generated = compileAll(TEST_FOUR);
-  Expect.isTrue(generated.contains(r"""$.B = {"": "A;y,z,x"}"""));
+  Expect.isTrue(generated.contains(r"""B: {"": "A;y,z,x"}"""));
 }
 
 constructor1() {
diff --git a/tests/compiler/dart2js/cpa_inference_test.dart b/tests/compiler/dart2js/cpa_inference_test.dart
index 334d825..5a53ec9 100644
--- a/tests/compiler/dart2js/cpa_inference_test.dart
+++ b/tests/compiler/dart2js/cpa_inference_test.dart
@@ -193,6 +193,20 @@
   result.checkNodeHasUnknownType('x');
 }
 
+testVariableDeclaration() {
+  final String source = r"""
+      main() {
+        var v1;
+        var v2;
+        v2 = 1;
+        v1; v2;
+      }
+      """;
+  AnalysisResult result = analyze(source);
+  result.checkNodeHasType('v1', [result.nullType]);
+  result.checkNodeHasType('v2', [result.int]);
+}
+
 testLiterals() {
   final String source = r"""
       main() {
@@ -312,6 +326,21 @@
   result.checkNodeHasType('bar', [result.int]);
 }
 
+testFor3() {
+  final String source = r"""
+      main() {
+        var i = 1;
+        for(;;) {
+          var x = 2;
+          i = x;
+        }
+        i;
+      }
+      """;
+  AnalysisResult result = analyze(source);
+  result.checkNodeHasType('i', [result.int]);
+}
+
 testToplevelVariable() {
   final String source = r"""
       final top = 'abc';
@@ -1326,6 +1355,7 @@
 
 void main() {
   testDynamicBackDoor();
+  testVariableDeclaration();
   testLiterals();
   testRedefinition();
   testIfThenElse();
@@ -1333,6 +1363,7 @@
   testWhile();
   testFor1();
   testFor2();
+  testFor3();
   testToplevelVariable();
   testNonRecusiveFunction();
   testRecusiveFunction();
diff --git a/tests/compiler/dart2js/js_parser_test.dart b/tests/compiler/dart2js/js_parser_test.dart
index 1d972f0..5109ccf 100644
--- a/tests/compiler/dart2js/js_parser_test.dart
+++ b/tests/compiler/dart2js/js_parser_test.dart
@@ -105,7 +105,6 @@
   // Bad keyword.
   testError('var typeof = 42', "Expected ALPHA");
   // Malformed decimal/hex.
-  testError('var x = 42.', "Unparseable number");
   testError('var x = 1.1.1', "Unparseable number");
   testError('var x = 0xabcdefga', "Unparseable number");
   testError('var x = 0xabcdef\$a', "Unparseable number");
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 9129573..63e8492 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -63,7 +63,8 @@
   S() {}
   throwExpression(e) {}
   unwrapException(e) {}
-  assertHelper(a){}
+  assertHelper(a) {}
+  isJsIndexable(a, b) {}
   createRuntimeType(a) {}
   createInvocationMirror(a0, a1, a2, a3, a4, a5) {}
   throwNoSuchMethod(obj, name, arguments, expectedArgumentNames) {}
@@ -138,6 +139,7 @@
   }
   getInterceptor(x) {}
   getNativeInterceptor(x) {}
+  var dispatchPropertyName;
   getDispatchProperty(o) {}
   initializeDispatchProperty(f,p,i) {}
   initializeDispatchPropertyCSP(f,p,i) {}
diff --git a/tests/compiler/dart2js/no_constructor_body_test.dart b/tests/compiler/dart2js/no_constructor_body_test.dart
index 0036e24..666afeb 100644
--- a/tests/compiler/dart2js/no_constructor_body_test.dart
+++ b/tests/compiler/dart2js/no_constructor_body_test.dart
@@ -19,5 +19,5 @@
 main() {
   String generated = compileAll(TEST);
   Expect.isTrue(
-      generated.contains('\$.A = {"": "Object;"}'));
+      generated.contains('A: {"": "Object;"}'));
 }
diff --git a/tests/compiler/dart2js/no_duplicate_constructor_body_test.dart b/tests/compiler/dart2js/no_duplicate_constructor_body_test.dart
index e25231b..3942536 100644
--- a/tests/compiler/dart2js/no_duplicate_constructor_body_test.dart
+++ b/tests/compiler/dart2js/no_duplicate_constructor_body_test.dart
@@ -16,7 +16,7 @@
 
 main() {
   String generated = compileAll(CODE);
-  RegExp regexp = new RegExp(r'\$.A = {"": "[A-za-z]+;"');
+  RegExp regexp = new RegExp(r'\A: {"": "[A-za-z]+;"');
   Iterator<Match> matches = regexp.allMatches(generated).iterator;
   checkNumberOfMatches(matches, 1);
 }
diff --git a/tests/compiler/dart2js/simple_inferrer_test.dart b/tests/compiler/dart2js/simple_inferrer_test.dart
index cc15222..2c8f602 100644
--- a/tests/compiler/dart2js/simple_inferrer_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_test.dart
@@ -222,6 +222,17 @@
   return 42;
 }
 
+testIsCheck20() {
+  var c = topLevelGetter();
+  if (c != null && c is! bool && c is! int) {
+    return 42;
+  } else if (c is String) {
+    return c;
+  } else {
+    return 68;
+  }
+}
+
 returnAsString() {
   return topLevelGetter() as String;
 }
@@ -284,6 +295,14 @@
   return b;
 }
 
+testSwitch4() {
+  switch(topLevelGetter) {
+    case 1: break;
+    default: break;
+  }
+  return 42;
+}
+
 testContinue1() {
   var a = 42;
   var b;
@@ -402,6 +421,7 @@
   testIsCheck17(topLevelGetter());
   testIsCheck18(topLevelGetter());
   testIsCheck19(topLevelGetter());
+  testIsCheck20();
   returnAsString();
   returnIntAsNum();
   returnAsTypedef();
@@ -411,6 +431,7 @@
   testSwitch1();
   testSwitch2();
   testSwitch3();
+  testSwitch4();
   testContinue1();
   testBreak1();
   testContinue2();
@@ -487,6 +508,7 @@
   checkReturn('testIsCheck17', intType);
   checkReturn('testIsCheck18', typesInferrer.dynamicType);
   checkReturn('testIsCheck19', typesInferrer.dynamicType);
+  checkReturn('testIsCheck20', typesInferrer.dynamicType.nonNullable());
   checkReturn('returnAsString',
       new TypeMask.subtype(compiler.stringClass.computeType(compiler)));
   checkReturn('returnIntAsNum', typesInferrer.intType);
@@ -498,6 +520,7 @@
       .union(typesInferrer.doubleType, compiler).nullable().simplify(compiler));
   checkReturn('testSwitch2', typesInferrer.intType);
   checkReturn('testSwitch3', interceptorType.nullable());
+  checkReturn('testSwitch4', typesInferrer.intType);
   checkReturn('testContinue1', interceptorType.nullable());
   checkReturn('testBreak1', interceptorType.nullable());
   checkReturn('testContinue2', interceptorType.nullable());
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index dc4effa..a9d9828 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -42,3 +42,6 @@
 [ $runtime == none ]
 timer_negative_test: Fail, OK # A negative runtime test.
 bailout8_test: Fail, OK # Mismatch in thrown exception.
+
+[ $csp ]
+mirrors_test: Fail # http://dartbug.com/6490
diff --git a/tests/corelib/string_trim2_test.dart b/tests/corelib/string_trim2_test.dart
index 0f0ccab..fc894a2 100644
--- a/tests/corelib/string_trim2_test.dart
+++ b/tests/corelib/string_trim2_test.dart
@@ -4,14 +4,14 @@
 
 import "package:expect/expect.dart";
 
-// TODO(floitsch): Test 0x85 when dart2js supports it.
 const WHITESPACE = const [
-  9,
-  10,
-  11,
-  12,
-  13,
+  0x09,
+  0x0A,
+  0x0B,
+  0x0C,
+  0x0D,
   0x20,
+  0x85,
   0xA0,
   0x1680,
   0x180E,
@@ -44,5 +44,6 @@
     Expect.equals("a", ("a" + c).trim());
     Expect.equals("a", (c + "a").trim());
     Expect.equals("a", (c + c + "a" + c + c).trim());
+    Expect.equals("a" + c + "a", (c + c + "a" + c + "a" + c + c).trim());
   }
 }
diff --git a/tests/html/canvasrenderingcontext2d_test.dart b/tests/html/canvasrenderingcontext2d_test.dart
index 8de0001..1aa0148 100644
--- a/tests/html/canvasrenderingcontext2d_test.dart
+++ b/tests/html/canvasrenderingcontext2d_test.dart
@@ -159,14 +159,15 @@
     });
 
     test('putImageData', () {
+      context.fillStyle = 'green';
+      context.fillRect(0, 0, canvas.width, canvas.height);
+
       ImageData expectedData = context.getImageData(0, 0, 10, 10);
       expectedData.data[0] = 25;
       expectedData.data[1] = 65;
       expectedData.data[2] = 255;
       // Set alpha to 255 to make the pixels show up.
       expectedData.data[3] = 255;
-      context.fillStyle = 'green';
-      context.fillRect(0, 0, canvas.width, canvas.height);
 
       context.putImageData(expectedData, 0, 0);
 
@@ -174,6 +175,72 @@
       // Make sure that we read back what we wrote.
       expect(resultingData.data, expectedData.data);
     });
+
+    test('putImageData dirty rectangle', () {
+      context.fillStyle = 'green';
+      context.fillRect(0, 0, canvas.width, canvas.height);
+
+      ImageData drawnData = context.getImageData(0, 0, 10, 10);
+      drawnData.data[0] = 25;
+      drawnData.data[1] = 65;
+      drawnData.data[2] = 255;
+      drawnData.data[3] = 255;
+
+      // Draw these pixels to the 2nd pixel.
+      drawnData.data[2 * 4 + 0] = 25;
+      drawnData.data[2 * 4 + 1] = 65;
+      drawnData.data[2 * 4 + 2] = 255;
+      drawnData.data[2 * 4 + 3] = 255;
+
+      // Draw these pixels to the 8th pixel.
+      drawnData.data[7 * 4 + 0] = 25;
+      drawnData.data[7 * 4 + 1] = 65;
+      drawnData.data[7 * 4 + 2] = 255;
+      drawnData.data[7 * 4 + 3] = 255;
+
+      // Use a dirty rectangle to limit what pixels are drawn.
+      context.putImageData(drawnData, 0, 0, 1, 0, 5, 5);
+
+      // Expect the data to be all green, as we skip all drawn pixels.
+      ImageData expectedData = context.createImageData(10, 10);
+      for (int i = 0; i < expectedData.data.length; i++) {
+        switch (i % 4) {
+          case 0:
+            expectedData.data[i] =  0;
+            break;
+          case 1:
+            expectedData.data[i] =  128;
+            break;
+          case 2:
+            expectedData.data[i] =  0;
+            break;
+          case 3:
+            expectedData.data[i] =  255;
+            break;
+        }
+      }
+      // Third pixel was copied.
+      expectedData.data[2 * 4 + 0] = 25;
+      expectedData.data[2 * 4 + 1] = 65;
+      expectedData.data[2 * 4 + 2] = 255;
+      expectedData.data[2 * 4 + 3] = 255;
+
+      // Make sure that our data is all green.
+      var resultingData = context.getImageData(0, 0, 10, 10);
+      expect(resultingData.data, expectedData.data);
+    });
+
+    test('putImageData throws with wrong number of arguments', () {
+      ImageData expectedData = context.getImageData(0, 0, 10, 10);
+
+      // TODO(antonm): in Dartium ArgumentError should be thrown too.
+      expect(() => context.putImageData(expectedData, 0, 0, 1),
+        throws);
+      expect(() => context.putImageData(expectedData, 0, 0, 1, 1),
+        throws);
+      expect(() => context.putImageData(expectedData, 0, 0, 1, 1, 5),
+        throws);
+    });
   });
 
   group('arc', () {
diff --git a/tests/html/html.status b/tests/html/html.status
index 5ff5505..40625a0 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -16,7 +16,7 @@
 [ $compiler == none && $runtime == drt && $system == windows ]
 worker_test/functional: Pass, Crash # Issue 9929.
 
-[ $compiler == dart2js && ($runtime == ie9 || $runtime == ie10 || $runtime == safari || $runtime == ff || $runtime == chrome || $runtime == opera || $runtime == drt || $runtime == dartium)]
+[ $compiler == dart2js && ($runtime == ie9 || $runtime == ie10 || $runtime == safari || $runtime == ff || $runtime == chrome || $runtime == chromeOnAndroid || $runtime == opera || $runtime == drt || $runtime == dartium)]
 dom_isolates_test: Skip # Need to migrate to new spawnDomFunction.
 
 [ $compiler == dart2js && $runtime == ie10 ]
@@ -41,10 +41,10 @@
 [ $runtime == chrome ]
 touchevent_test/supported: Fail
 
-[ $runtime == chrome || $runtime == drt ]
+[ $runtime == chrome || $runtime == chromeOnAndroid || $runtime == drt ]
 audiocontext_test: Skip # Issue 9322
 
-[$runtime == drt || $runtime == dartium || $runtime == chrome]
+[$runtime == drt || $runtime == dartium || $runtime == chrome || $runtime == chromeOnAndroid]
 webgl_1_test: Pass, Fail # Issue 8219
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium) ]
@@ -366,7 +366,7 @@
 [ $compiler == dart2js && $runtime == drt && $unchecked ]
 #indexeddb_5_test/functional: Fail, Pass # http://dartbug.com/8851
 
-[ $compiler == dart2js && $csp && ($runtime == drt || $runtime == safari || $runtime == ff || $runtime == chrome) ]
+[ $compiler == dart2js && $csp && ($runtime == drt || $runtime == safari || $runtime == ff || $runtime == chrome || $runtime == chromeOnAndroid) ]
 js_interop_1_test: Skip            # Test cannot run under CSP restrictions (times out).
 js_interop_2_test: Fail, OK        # Test cannot run under CSP restrictions.
 js_interop_3_test: Skip            # Test cannot run under CSP restrictions (times out).
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 6368aad..e45b9ed 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -67,7 +67,7 @@
 global_error_handler2_test: Pass, Fail # http://dartbug.com/9012 and http://dartbug.com/9024
 global_error_handler_stream2_test: Pass, Fail # http://dartbug.com/9012 and http://dartbug.com/9024
 
-[ $compiler == dart2js && ($runtime == drt || $runtime == ff || $runtime == chrome || $runtime == ie9 || $runtime == ie10 || $runtime == safari) ]
+[ $compiler == dart2js && ($runtime == drt || $runtime == ff || $runtime == chrome || $runtime == chromeOnAndroid || $runtime == ie9 || $runtime == ie10 || $runtime == safari) ]
 typed_data_message_test: Fail
 
 [ $runtime == safari ]
diff --git a/tests/language/external_test.dart b/tests/language/external_test.dart
index 324629a..f1c6c36 100644
--- a/tests/language/external_test.dart
+++ b/tests/language/external_test.dart
@@ -1,6 +1,7 @@
 // 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.
+// VMOptions=--compile_all
 
 class Foo {
   var x;
diff --git a/tests/language/field1_negative_test.dart b/tests/language/field1_negative_test.dart
index 4df4a95..e10f754 100644
--- a/tests/language/field1_negative_test.dart
+++ b/tests/language/field1_negative_test.dart
@@ -4,6 +4,7 @@
 // Dart test to catch error reporting bugs in class fields declarations.
 // Should be an error because we have setter/getter functions and fields
 // in the class.
+// VMOptions=--compile_all
 
 class C {
   var a;
diff --git a/tests/language/field2_negative_test.dart b/tests/language/field2_negative_test.dart
index 63ddca1..f37d307 100644
--- a/tests/language/field2_negative_test.dart
+++ b/tests/language/field2_negative_test.dart
@@ -4,6 +4,7 @@
 // Dart test to catch error reporting bugs in class fields declarations.
 // Should be an error because we have setter/getter functions and fields
 // in the class.
+// VMOptions=--compile_all
 
 class C {
   get a {
diff --git a/tests/language/field4_negative_test.dart b/tests/language/field4_negative_test.dart
index f038552..426fc0f 100644
--- a/tests/language/field4_negative_test.dart
+++ b/tests/language/field4_negative_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test to catch error reporting bugs in class fields declarations.
 // Should be an error because we have a field overriding a function name.
+// VMOptions=--compile_all
 
 class A {
   int a() {
diff --git a/tests/language/field5_negative_test.dart b/tests/language/field5_negative_test.dart
index f388b81..9e6da06 100644
--- a/tests/language/field5_negative_test.dart
+++ b/tests/language/field5_negative_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test to catch error reporting bugs in class fields declarations.
 // Should be an error because we have a function overriding a field name.
+// VMOptions=--compile_all
 
 class A {
   var a;
diff --git a/tests/language/field6_negative_test.dart b/tests/language/field6_negative_test.dart
index 3f37400..d841bbd 100644
--- a/tests/language/field6_negative_test.dart
+++ b/tests/language/field6_negative_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test to catch error reporting bugs in class fields declarations.
 // Should be an error because we have a getter overriding a function name.
+// VMOptions=--compile_all
 
 class A {
   int a() {
diff --git a/tests/language/field6a_negative_test.dart b/tests/language/field6a_negative_test.dart
index 348745e..8d8ac44 100644
--- a/tests/language/field6a_negative_test.dart
+++ b/tests/language/field6a_negative_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test to catch error reporting bugs in class fields declarations.
 // Should be an error because we have a function overriding a getter.
+// VMOptions=--compile_all
 
 class A {
   int get a {
diff --git a/tests/language/get_set_syntax_test.dart b/tests/language/get_set_syntax_test.dart
index 2882f45..9b304cf 100644
--- a/tests/language/get_set_syntax_test.dart
+++ b/tests/language/get_set_syntax_test.dart
@@ -1,6 +1,7 @@
 // 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.
+// VMOptions=--compile_all
 
 var get;
 var get a;            /// 00: compile-time error
diff --git a/tests/language/interface_static_method_negative_test.dart b/tests/language/interface_static_method_negative_test.dart
index f069d67..ef1925e 100644
--- a/tests/language/interface_static_method_negative_test.dart
+++ b/tests/language/interface_static_method_negative_test.dart
@@ -1,6 +1,7 @@
 // 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.
+// VMOptions=--compile_all
 
 abstract class A {
   static void foo();
diff --git a/tests/language/language.status b/tests/language/language.status
index a1fbeef..b61389a 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -312,6 +312,14 @@
 final_variable_assignment_test/03: Fail
 final_variable_assignment_test/04: Fail
 gc_test: Skip # Issue 1487
+field5_negative_test: Fail # Issue 10839
+field4_negative_test: Fail # Issue 10839
+field6_negative_test: Fail # Issue 10839
+non_const_super_negative_test: Fail # Issue 10839
+field2_negative_test: Fail # Issue 10839
+interface_static_method_negative_test: Fail # Issue 10839
+field1_negative_test: Fail # Issue 10839
+field6a_negative_test: Fail # Issue 10839
 
 
 [ $runtime == dartium ]
@@ -607,7 +615,6 @@
 compile_time_constant_arguments_test/01: fail
 compile_time_constant_arguments_test/02: fail
 compile_time_constant_arguments_test/03: fail
-compile_time_constant_arguments_test/04: fail
 compile_time_constant_arguments_test/05: fail
 compile_time_constant_arguments_test/06: fail
 compile_time_constant_b_test: fail
@@ -678,7 +685,6 @@
 implicit_this_test/04: fail
 implicit_this_test/none: fail
 import_combinators_negative_test: fail
-import_private_test/01: fail
 infinite_switch_label_test: fail
 inst_field_initializer1_negative_test: fail
 instance_call_wrong_argument_count_negative_test: fail
@@ -689,7 +695,6 @@
 interface_inherit_field_test: fail
 interface_static_non_final_fields_negative_test: fail
 interface_test/00: fail
-internal_library_test/01: fail
 is_not_class2_negative_test: fail
 library_juxtaposition_test: fail
 licm_test: fail
@@ -716,7 +721,6 @@
 mixin_type_parameters_errors_test/05: fail
 named_parameters2_test: fail
 named_parameters_aggregated_test/03: fail
-named_parameters_aggregated_test/04: fail
 named_parameters_aggregated_test/05: fail
 new_expression_type_args_test/00: fail
 new_expression_type_args_test/01: fail
@@ -765,13 +769,6 @@
 static_field_test/03: fail
 static_final_field2_negative_test: fail
 static_final_field_negative_test: fail
-super_operator_index_test/01: fail
-super_operator_index_test/02: fail
-super_operator_index_test/03: fail
-super_operator_index_test/04: fail
-super_operator_index_test/05: fail
-super_operator_index_test/06: fail
-super_operator_index_test/07: fail
 switch_label2_test: fail
 syntax_test/28: fail
 syntax_test/29: fail
diff --git a/tests/language/non_const_super_negative_test.dart b/tests/language/non_const_super_negative_test.dart
index b07fb79..17f3d5a 100644
--- a/tests/language/non_const_super_negative_test.dart
+++ b/tests/language/non_const_super_negative_test.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.
 // Check fails because const class extends from non const class.
+// VMOptions=--compile_all
 
 class Base {
   Base() {}
diff --git a/tests/language/syntax_test.dart b/tests/language/syntax_test.dart
index 462bdbd..bc2bfc2 100644
--- a/tests/language/syntax_test.dart
+++ b/tests/language/syntax_test.dart
@@ -1,6 +1,7 @@
 // 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.
+// VMOptions=--compile_all
 
 class SyntaxTest {
   // "this" cannot be used as a field name.
diff --git a/tests/language/type_argument_in_super_type_test.dart b/tests/language/type_argument_in_super_type_test.dart
new file mode 100644
index 0000000..a2638e3
--- /dev/null
+++ b/tests/language/type_argument_in_super_type_test.dart
@@ -0,0 +1,35 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+class C {
+}
+
+class A<T> {
+  var field;
+  A(this.field);
+  T foo() => field;
+  int bar() => field;
+}
+
+class B extends A<C> {
+  B() : super(new C());
+}
+
+main() {
+  B b = new B();
+  Expect.equals(b.field, b.foo());
+  bool isCheckedMode = false;
+  try {
+    String a = 42;
+  } catch (e) {
+    isCheckedMode = true;
+  }
+  if (isCheckedMode) {
+    Expect.throws(b.bar, (e) => e is TypeError);
+  } else {
+    Expect.equals(b.field, b.bar());
+  }
+}
diff --git a/tests/lib/async/stream_controller_async_test.dart b/tests/lib/async/stream_controller_async_test.dart
index 9d88104..e2aab21 100644
--- a/tests/lib/async/stream_controller_async_test.dart
+++ b/tests/lib/async/stream_controller_async_test.dart
@@ -295,6 +295,22 @@
     f.catchError(expectAsync1((error) { Expect.isTrue(error is StateError); }));
     sentEvents.replay(c);
   });
+
+  test("drain", () {
+    StreamController c = new StreamController();
+    Future f = c.stream.drain();
+    f.then(expectAsync1((v) { Expect.equals(null, v);}));
+    sentEvents.replay(c);
+  });
+
+  test("drain error", () {
+    StreamController c = new StreamController();
+    Future f = c.stream.drain();
+    f.catchError(expectAsync1((error) { Expect.equals("error", error); }));
+    Events errorEvents = new Events()..error("error")..error("error2")..close();
+    errorEvents.replay(c);
+  });
+
 }
 
 testPause() {
@@ -459,6 +475,7 @@
   testFuture("any", (s, act) => s.any(act));
   testFuture("reduce", (s, act) => s.reduce((a,b) => act(b)));
   testFuture("fold", (s, act) => s.fold(0, (a,b) => act(b)));
+  testFuture("drain", (s, act) => s.drain().then(act));
 }
 
 main() {
diff --git a/tests/lib/math/math_parse_double_test.dart b/tests/lib/math/math_parse_double_test.dart
index af77f6b..666a9e5 100644
--- a/tests/lib/math/math_parse_double_test.dart
+++ b/tests/lib/math/math_parse_double_test.dart
@@ -12,82 +12,109 @@
   Expect.throws(() => double.parse(str), (e) => e is FormatException);
 }
 
+void runTest(double expected, String input) {
+  Expect.equals(expected, double.parse(input));
+  Expect.equals(expected, double.parse(" $input "));
+  Expect.equals(expected, double.parse(" $input"));
+  Expect.equals(expected, double.parse("$input "));
+  Expect.equals(expected, double.parse("+$input"));
+  Expect.equals(expected, double.parse(" +$input "));
+  Expect.equals(expected, double.parse("+$input "));
+  Expect.equals(expected, double.parse("\xA0 $input\xA0 "));
+  Expect.equals(expected, double.parse(" \xA0$input"));
+  Expect.equals(expected, double.parse("$input \xA0"));
+  Expect.equals(expected, double.parse("\xA0 +$input\xA0 "));
+  Expect.equals(expected, double.parse("+$input\xA0 "));
+  Expect.equals(expected, double.parse("\u205F $input\u205F "));
+  Expect.equals(expected, double.parse(" \u180E$input"));
+  Expect.equals(expected, double.parse("$input \u2006"));
+  Expect.equals(expected, double.parse("\u1680 +$input\u1680 "));
+  Expect.equals(-expected, double.parse("-$input"));
+  Expect.equals(-expected, double.parse(" -$input "));
+  Expect.equals(-expected, double.parse("-$input "));
+  Expect.equals(-expected, double.parse("\xA0 -$input\xA0 "));
+  Expect.equals(-expected, double.parse("-$input\xA0 "));
+  Expect.equals(-expected, double.parse("\u1680 -$input\u1680 "));
+}
+
+final TESTS = [
+  [ 499.0, "499" ],
+  [ 499.0, "499." ],
+  [ 499.0, "499.0" ],
+  [ 0.0, "0" ],
+  [ 0.0, ".0" ],
+  [ 0.0, "0." ],
+  [ 0.1, "0.1" ],
+  [ 0.1, ".1" ],
+  [ 10.0, "010" ],
+  [ 1.5, "1.5" ],
+  [ 1.5, "001.5" ],
+  [ 1.5, "1.500" ],
+  [ 1234567.89, "1234567.89" ],
+  [ 1234567e89, "1234567e89" ],
+  [ 1234567.89e2, "1234567.89e2" ],
+  [ 1234567.89e2, "1234567.89e+2" ],
+  [ 1234567.89e-2, "1234567.89e-2" ],
+  [ 5.0, "5" ],
+  [ 123456700.0, "1234567.e2" ],
+  [ 123456700.0, "1234567.e+2" ],
+  [ double.INFINITY, "Infinity" ],
+  [ 5e-324, "5e-324" ], // min-pos.
+  // Same, without exponential.
+  [ 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625,
+    "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625" ],
+  [ 0.0, "2e-324" ],  // underflow 0.0
+  [ 0.9999999999999999, "0.9999999999999999" ],  // max below 1
+  [ 1.0, "1.00000000000000005" ], // 1.0
+  [ 1.0000000000000002, "1.0000000000000002" ],  // min above 1
+  [ 2147483647.0, "2147483647" ],  // max int32
+  [ 2147483647.0000002, "2147483647.0000002" ],  // min not int32
+  [ 2147483648.0, "2147483648" ],  // min int not int32
+  [ 4295967295.0, "4295967295" ],  // max uint32
+  [ 4295967295.000001, "4295967295.000001" ],  // min not uint-32
+  [ 4295967296.0, "4295967296" ],  // min int not-uint32
+  [ 1.7976931348623157e+308, "1.7976931348623157e+308" ],  // Max finit
+  [ 1.7976931348623157e+308, "1.7976931348623158e+308" ],  // Max finit
+  [ double.INFINITY, "1.7976931348623159e+308" ],  // Infinity
+  [ .049999999999999994, ".049999999999999994" ],  // not 0.5
+  [ .05, ".04999999999999999935" ],
+  [ 4503599627370498.0, "4503599627370497.5" ],
+  [ 1.2345678901234568e+39, "1234567890123456898981341324213421342134" ],
+  [ 9.87291183742987e+24, "9872911837429871193379121" ],
+  [ 1e21, "1e+21" ],
+];
+
+
 void main() {
-  Expect.equals(499.0, double.parse("499"));
-  Expect.equals(499.0, double.parse("499.0"));
-  Expect.equals(499.0, double.parse("499.0"));
-  Expect.equals(499.0, double.parse("+499"));
-  Expect.equals(-499.0, double.parse("-499"));
-  Expect.equals(499.0, double.parse("   499   "));
-  Expect.equals(499.0, double.parse("   +499   "));
-  Expect.equals(-499.0, double.parse("   -499   "));
-  Expect.equals(0.0, double.parse("0"));
-  Expect.equals(0.0, double.parse("+0"));
-  Expect.equals(-0.0, double.parse("-0"));
+  for (var test in TESTS) {
+    runTest(test[0], test[1]);
+  }
+
   Expect.equals(true, double.parse("-0").isNegative);
-  Expect.equals(0.0, double.parse("   0   "));
-  Expect.equals(0.0, double.parse("   +0   "));
-  Expect.equals(-0.0, double.parse("   -0   "));
   Expect.equals(true, double.parse("   -0   ").isNegative);
-  Expect.equals(1.0 * 0x1234567890, double.parse("0x1234567890"));
-  Expect.equals(1.0 * -0x1234567890, double.parse("-0x1234567890"));
-  Expect.equals(1.0 * 0x1234567890, double.parse("   0x1234567890   "));
-  Expect.equals(1.0 * -0x1234567890, double.parse("   -0x1234567890   "));
-  Expect.equals(256.0, double.parse("0x100"));
-  Expect.equals(-256.0, double.parse("-0x100"));
-  Expect.equals(256.0, double.parse("   0x100   "));
-  Expect.equals(-256.0, double.parse("   -0x100   "));
-  Expect.equals(1.0 * 0xabcdef, double.parse("0xabcdef"));
-  Expect.equals(1.0 * 0xABCDEF, double.parse("0xABCDEF"));
-  Expect.equals(1.0 * 0xabcdef, double.parse("0xabCDEf"));
-  Expect.equals(1.0 * -0xabcdef, double.parse("-0xabcdef"));
-  Expect.equals(1.0 * -0xABCDEF, double.parse("-0xABCDEF"));
-  Expect.equals(1.0 * 0xabcdef, double.parse("   0xabcdef   "));
-  Expect.equals(1.0 * 0xABCDEF, double.parse("   0xABCDEF   "));
-  Expect.equals(1.0 * -0xabcdef, double.parse("   -0xabcdef   "));
-  Expect.equals(1.0 * -0xABCDEF, double.parse("   -0xABCDEF   "));
-  Expect.equals(1.0 * 0xabcdef, double.parse("0x00000abcdef"));
-  Expect.equals(1.0 * 0xABCDEF, double.parse("0x00000ABCDEF"));
-  Expect.equals(1.0 * -0xabcdef, double.parse("-0x00000abcdef"));
-  Expect.equals(1.0 * -0xABCDEF, double.parse("-0x00000ABCDEF"));
-  Expect.equals(1.0 * 0xabcdef, double.parse("   0x00000abcdef   "));
-  Expect.equals(1.0 * 0xABCDEF, double.parse("   0x00000ABCDEF   "));
-  Expect.equals(1.0 * -0xabcdef, double.parse("   -0x00000abcdef   "));
-  Expect.equals(1.0 * -0xABCDEF, double.parse("   -0x00000ABCDEF   "));
-  Expect.equals(10.0, double.parse("010"));
-  Expect.equals(-10.0, double.parse("-010"));
-  Expect.equals(10.0, double.parse("   010   "));
-  Expect.equals(-10.0, double.parse("   -010   "));
-  Expect.equals(0.1, double.parse("0.1"));
-  Expect.equals(0.1, double.parse(" 0.1 "));
-  Expect.equals(0.1, double.parse(" +0.1 "));
-  Expect.equals(-0.1, double.parse(" -0.1 "));
-  Expect.equals(0.1, double.parse(".1"));
-  Expect.equals(0.1, double.parse(" .1 "));
-  Expect.equals(0.1, double.parse(" +.1 "));
-  Expect.equals(-0.1, double.parse(" -.1 "));
-  Expect.equals(1.5, double.parse("1.5"));
-  Expect.equals(1234567.89, double.parse("1234567.89"));
-  Expect.equals(1234567.89, double.parse(" 1234567.89 "));
-  Expect.equals(1234567.89, double.parse(" +1234567.89 "));
-  Expect.equals(-1234567.89, double.parse(" -1234567.89 "));
-  Expect.equals(1234567e89, double.parse("1234567e89"));
-  Expect.equals(1234567e89, double.parse(" 1234567e89 "));
-  Expect.equals(1234567e89, double.parse(" +1234567e89 "));
-  Expect.equals(-1234567e89, double.parse(" -1234567e89 "));
-  Expect.equals(1234567.89e2, double.parse("1234567.89e2"));
-  Expect.equals(1234567.89e2, double.parse(" 1234567.89e2 "));
-  Expect.equals(1234567.89e2, double.parse(" +1234567.89e2 "));
-  Expect.equals(-1234567.89e2, double.parse(" -1234567.89e2 "));
-  Expect.equals(1234567.89e2, double.parse("1234567.89E2"));
-  Expect.equals(1234567.89e2, double.parse(" 1234567.89E2 "));
-  Expect.equals(1234567.89e2, double.parse(" +1234567.89E2 "));
-  Expect.equals(-1234567.89e2, double.parse(" -1234567.89E2 "));
-  Expect.equals(1234567.89e-2, double.parse("1234567.89e-2"));
-  Expect.equals(1234567.89e-2, double.parse(" 1234567.89e-2 "));
-  Expect.equals(1234567.89e-2, double.parse(" +1234567.89e-2 "));
-  Expect.equals(-1234567.89e-2, double.parse(" -1234567.89e-2 "));
-  // TODO(floitsch): add tests for NaN and Infinity.
+  Expect.equals(true, double.parse("\xA0   -0   \xA0").isNegative);
+  Expect.isTrue(double.parse("NaN").isNaN);
+  Expect.isTrue(double.parse("-NaN").isNaN);
+  Expect.isTrue(double.parse("+NaN").isNaN);
+  Expect.isTrue(double.parse("NaN ").isNaN);
+  Expect.isTrue(double.parse("-NaN ").isNaN);
+  Expect.isTrue(double.parse("+NaN ").isNaN);
+  Expect.isTrue(double.parse(" NaN ").isNaN);
+  Expect.isTrue(double.parse(" -NaN ").isNaN);
+  Expect.isTrue(double.parse(" +NaN ").isNaN);
+  Expect.isTrue(double.parse(" NaN").isNaN);
+  Expect.isTrue(double.parse(" -NaN").isNaN);
+  Expect.isTrue(double.parse(" +NaN").isNaN);
+  Expect.isTrue(double.parse("NaN\xA0").isNaN);
+  Expect.isTrue(double.parse("-NaN\xA0").isNaN);
+  Expect.isTrue(double.parse("+NaN\xA0").isNaN);
+  Expect.isTrue(double.parse(" \xA0NaN\xA0").isNaN);
+  Expect.isTrue(double.parse(" \xA0-NaN\xA0").isNaN);
+  Expect.isTrue(double.parse(" \xA0+NaN\xA0").isNaN);
+  Expect.isTrue(double.parse(" \xA0NaN").isNaN);
+  Expect.isTrue(double.parse(" \xA0-NaN").isNaN);
+  Expect.isTrue(double.parse(" \xA0+NaN").isNaN);
+
   parseDoubleThrowsFormatException("1b");
   parseDoubleThrowsFormatException(" 1b ");
   parseDoubleThrowsFormatException(" 1 b ");
@@ -106,16 +133,37 @@
   parseDoubleThrowsFormatException("- 1.5");
   parseDoubleThrowsFormatException("");
   parseDoubleThrowsFormatException("   ");
-  parseDoubleThrowsFormatException("5.");
-  parseDoubleThrowsFormatException(" 5. ");
-  parseDoubleThrowsFormatException(" +5. ");
-  parseDoubleThrowsFormatException(" -5. ");
-  parseDoubleThrowsFormatException("1234567.e2");
-  parseDoubleThrowsFormatException(" 1234567.e2 ");
-  parseDoubleThrowsFormatException(" +1234567.e2 ");
-  parseDoubleThrowsFormatException(" -1234567.e2 ");
   parseDoubleThrowsFormatException("+0x1234567890");
   parseDoubleThrowsFormatException("   +0x1234567890   ");
   parseDoubleThrowsFormatException("   +0x100   ");
   parseDoubleThrowsFormatException("+0x100");
+  parseDoubleThrowsFormatException("0x1234567890");
+  parseDoubleThrowsFormatException("-0x1234567890");
+  parseDoubleThrowsFormatException("   0x1234567890   ");
+  parseDoubleThrowsFormatException("   -0x1234567890   ");
+  parseDoubleThrowsFormatException("0x100");
+  parseDoubleThrowsFormatException("-0x100");
+  parseDoubleThrowsFormatException("   0x100   ");
+  parseDoubleThrowsFormatException("   -0x100   ");
+  parseDoubleThrowsFormatException("0xabcdef");
+  parseDoubleThrowsFormatException("0xABCDEF");
+  parseDoubleThrowsFormatException("0xabCDEf");
+  parseDoubleThrowsFormatException("-0xabcdef");
+  parseDoubleThrowsFormatException("-0xABCDEF");
+  parseDoubleThrowsFormatException("   0xabcdef   ");
+  parseDoubleThrowsFormatException("   0xABCDEF   ");
+  parseDoubleThrowsFormatException("   -0xabcdef   ");
+  parseDoubleThrowsFormatException("   -0xABCDEF   ");
+  parseDoubleThrowsFormatException("0x00000abcdef");
+  parseDoubleThrowsFormatException("0x00000ABCDEF");
+  parseDoubleThrowsFormatException("-0x00000abcdef");
+  parseDoubleThrowsFormatException("-0x00000ABCDEF");
+  parseDoubleThrowsFormatException("   0x00000abcdef   ");
+  parseDoubleThrowsFormatException("   0x00000ABCDEF   ");
+  parseDoubleThrowsFormatException("   -0x00000abcdef   ");
+  parseDoubleThrowsFormatException("   -0x00000ABCDEF   ");
+  parseDoubleThrowsFormatException("   -INFINITY   ");
+  parseDoubleThrowsFormatException("   NAN   ");
+  parseDoubleThrowsFormatException("   inf   ");
+  parseDoubleThrowsFormatException("   nan   ");
 }
diff --git a/tests/lib/mirrors/mirrors_test.dart b/tests/lib/mirrors/mirrors_test.dart
index 24f3607..3c5164d 100644
--- a/tests/lib/mirrors/mirrors_test.dart
+++ b/tests/lib/mirrors/mirrors_test.dart
@@ -105,6 +105,7 @@
 }
 
 testClosureMirrors(mirrors) {
+  // TODO(ahe): Test optional parameters (named or not).
   var closure = (x, y, z) { return x + y + z; };
 
   var mirror = reflect(closure);
@@ -203,10 +204,10 @@
   test("Test reflective method invocation", () { testInvoke(mirrors); });
   test("Test instance field access", () { testInstanceFieldAccess(mirrors); });
   test('Test intercepted objects', () { testIntercepted(mirrors); });
-  if (isDart2js) return;
   test("Test field access", () { testFieldAccess(mirrors); });
   test("Test closure mirrors", () { testClosureMirrors(mirrors); });
   test("Test invoke constructor", () { testInvokeConstructor(mirrors); });
+  if (isDart2js) return;
   test("Test reflect type", () { testReflectClass(mirrors); });
   test("Test simple and qualifiedName", () { testNames(mirrors); });
   test("Test current library uri", () {
diff --git a/tests/standalone/debugger/debug_lib.dart b/tests/standalone/debugger/debug_lib.dart
index 977d824..8532ac0 100644
--- a/tests/standalone/debugger/debug_lib.dart
+++ b/tests/standalone/debugger/debug_lib.dart
@@ -15,9 +15,6 @@
 // Whether or not to print the debugger wire messages on the console.
 var verboseWire = false;
 
-// The number of attempts made to find an unused debugger port.
-var retries = 0;
-
 // Class to buffer wire protocol data from debug target and
 // break it down to individual json messages.
 class JsonBuffer {
@@ -297,7 +294,6 @@
 class Debugger {
   // Debug target process properties.
   Process targetProcess;
-  int portNumber;
   Socket socket;
   JsonBuffer responses = new JsonBuffer();
 
@@ -314,16 +310,18 @@
   int isolateId = 0;
   bool isPaused = false;
 
-  Debugger(this.targetProcess, this.portNumber, this.script) {
-    stdin.listen((_) {});
+  Debugger(this.targetProcess, this.script) {
     var stdoutStringStream = targetProcess.stdout
         .transform(new StringDecoder())
         .transform(new LineTransformer());
     stdoutStringStream.listen((line) {
-      if (line == "Debugger initialized") {
-        openConnection();
-      }
       print("TARG: $line");
+      if (line.startsWith("Debugger listening")) {
+        RegExp portExpr = new RegExp(r"\d+");
+        var port = portExpr.stringMatch(line);
+        print("Debug target found listening at port '$port'");
+        openConnection(int.parse(port));
+      }
     });
 
     var stderrStringStream = targetProcess.stderr
@@ -430,11 +428,6 @@
     }
   }
 
-  runScript(List entries) {
-    script = new DebugScript(entries);
-    openConnection();
-  }
-
   // Send a debugger command to the target VM.
   void sendMessage(Map<String,dynamic> msg) {
     if (msg["id"] != null) {
@@ -455,7 +448,7 @@
     errors.add(s);
   }
 
-  void openConnection() {
+  void openConnection(int portNumber) {
     Socket.connect("127.0.0.1", portNumber).then((s) {
         this.socket = s;
         var stringStream = socket.transform(new StringDecoder());
@@ -499,11 +492,14 @@
         error("Error while closing socket: $error");
       });
     }
+    var targetPid = targetProcess.pid;
+    print("Sending kill signal to process $targetPid...");
     targetProcess.kill();
     // If the process was already dead exitCode is already
     // available and we call exit() in the next event loop cycle.
     // Otherwise this will wait for the process to exit.
     targetProcess.exitCode.then((exitCode) {
+      print("process $targetPid terminated with exit code $exitCode.");
       if (errorsDetected) {
         print("\n===== Errors detected: =====");
         for (int i = 0; i < errors.length; i++) print(errors[i]);
@@ -523,42 +519,16 @@
   }
   verboseWire = options.arguments.contains("--wire");
 
-  // Pick a port in the upper half of the port number range.
-  var seed = new DateTime.now().millisecondsSinceEpoch;
-  Random random = new Random(seed);
-  var debugPort = random.nextInt(32000) + 32000;
-  print('using debug port $debugPort ...');
-  ServerSocket.bind('127.0.0.1', debugPort).then((ServerSocket s) {
-      s.close();
-      var targetOpts = [ "--debug:$debugPort" ];
-      // --verbose_debug is necessary so the test knows when the debuggee
-      // is initialized.
-      targetOpts.add("--verbose_debug");
-      targetOpts.add(options.script);
-      targetOpts.add("--debuggee");
-      print('args: ${targetOpts.join(" ")}');
+  // Port number 0 means debug target picks a free port dynamically.
+  var targetOpts = [ "--debug:0" ];
+  targetOpts.add(options.script);
+  targetOpts.add("--debuggee");
+  print('args: ${targetOpts.join(" ")}');
 
-      Process.start(options.executable, targetOpts).then((Process process) {
-        print("Debug target process started");
-        process.stdin.close();
-        process.exitCode.then((int exitCode) {
-          if (exitCode != 0) throw "bad exit code: $exitCode";
-          print("Debug target process exited with exit code $exitCode");
-        });
-        var debugger =
-            new Debugger(process, debugPort, new DebugScript(script));
-      });
-    },
-    onError: (e) {
-      if (++retries >= 3) {
-        print('unable to find unused port: $e');
-        var trace = getAttachedStackTrace(e);
-        if (trace != null) print("StackTrace: $trace");
-        return -1;
-      } else {
-        // Retry with another random port.
-        RunScript(script);
-      }
-    });
+  Process.start(options.executable, targetOpts).then((Process process) {
+    print("Debug target process started, pid ${process.pid}.");
+    process.stdin.close();
+    var debugger = new Debugger(process, new DebugScript(script));
+  });
   return true;
 }
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 57a922b..ee80a1d 100644
--- a/tests/standalone/io/http_server_early_client_close_test.dart
+++ b/tests/standalone/io/http_server_early_client_close_test.dart
@@ -12,62 +12,66 @@
 import "dart:io";
 import "dart:isolate";
 
-void sendData(List<int> data, int port) {
-  Socket.connect("127.0.0.1", port).then((socket) {
+Future sendData(List<int> data, int port) {
+  return Socket.connect("127.0.0.1", port).then((socket) {
     socket.listen((data) {
         Expect.fail("No data response was expected");
       });
     socket.add(data);
-    socket.close();
     socket.done.then((_) {
       socket.destroy();
     });
+    return socket.close();
   });
 }
 
 class EarlyCloseTest {
   EarlyCloseTest(this.data,
-                 String this.exception,
-                 [bool this.expectRequest = false]);
+                 [String this.exception,
+                  bool this.expectRequest = false]);
 
-  Future execute(HttpServer server) {
-    Completer c = new Completer();
+  Future execute() {
+    return HttpServer.bind("127.0.0.1", 0).then((server) {
+      Completer c = new Completer();
 
-    bool calledOnRequest = false;
-    bool calledOnError = false;
-    ReceivePort port = new ReceivePort();
-    server.listen(
-        (request) {
-          Expect.isTrue(expectRequest);
-          Expect.isFalse(calledOnError);
-          Expect.isFalse(calledOnRequest, "onRequest called multiple times");
-          calledOnRequest = true;
-          request.listen(
-              (_) {},
-              onError: (error) {
-                Expect.isFalse(calledOnError);
-                Expect.equals(exception, error.message);
-                calledOnError = true;
-                port.close();
-                c.complete(null);
-              });
-        },
-        onError: (error) {
-          Expect.isFalse(calledOnError);
-          Expect.equals(exception, error.message);
-          Expect.equals(expectRequest, calledOnRequest);
-          calledOnError = true;
-          port.close();
-          c.complete(null);
-        });
+      bool calledOnRequest = false;
+      bool calledOnError = false;
+      bool calledOnDone = false;
+      ReceivePort port = new ReceivePort();
+      server.listen(
+          (request) {
+            Expect.isTrue(expectRequest);
+            Expect.isFalse(calledOnError);
+            Expect.isFalse(calledOnRequest, "onRequest called multiple times");
+            calledOnRequest = true;
+            request.listen(
+                (_) {},
+                onError: (error) {
+                  Expect.isFalse(calledOnError);
+                  Expect.equals(exception, error.message);
+                  calledOnError = true;
+                  if (exception != null) port.close();
+                });
+            server.close();
+          },
+          onDone: () {
+            Expect.equals(expectRequest, calledOnRequest);
+            calledOnDone = true;
+            if (exception == null) port.close();
+            c.complete(null);
+          });
 
-    List<int> d;
-    if (data is List<int>) d = data;
-    if (data is String) d = data.codeUnits;
-    if (d == null) Expect.fail("Invalid data");
-    sendData(d, server.port);
+      List<int> d;
+      if (data is List<int>) d = data;
+      if (data is String) d = data.codeUnits;
+      if (d == null) Expect.fail("Invalid data");
+      sendData(d, server.port)
+         .then((_) {
+            if (!expectRequest) server.close();
+          });
 
-    return c.future;
+      return c.future;
+    });
   }
 
   final data;
@@ -77,33 +81,29 @@
 
 void testEarlyClose1() {
   List<EarlyCloseTest> tests = new List<EarlyCloseTest>();
-  void add(Object data, String exception, {bool expectRequest: false}) {
+  void add(Object data, [String exception, bool expectRequest = false]) {
     tests.add(new EarlyCloseTest(data, exception, expectRequest));
   }
   // The empty packet is valid.
 
   // Close while sending header
-  String message = "Connection closed before full header was received";
-  add("G", message);
-  add("GET /", message);
-  add("GET / HTTP/1.1", message);
-  add("GET / HTTP/1.1\r\n", message);
+  add("G");
+  add("GET /");
+  add("GET / HTTP/1.1");
+  add("GET / HTTP/1.1\r\n");
 
   // Close while sending content
   add("GET / HTTP/1.1\r\nContent-Length: 100\r\n\r\n",
       "Connection closed while receiving data",
-      expectRequest: true);
+      true);
   add("GET / HTTP/1.1\r\nContent-Length: 100\r\n\r\n1",
       "Connection closed while receiving data",
-      expectRequest: true);
+      true);
 
   void runTest(Iterator it) {
     if (it.moveNext()) {
-      HttpServer.bind("127.0.0.1", 0).then((server) {
-        it.current.execute(server).then((_) {
-          runTest(it);
-          server.close();
-        });
+      it.current.execute().then((_) {
+        runTest(it);
       });
     }
   }
diff --git a/tests/standalone/io/http_server_response_test.dart b/tests/standalone/io/http_server_response_test.dart
index d27dcc7..0e75d34 100644
--- a/tests/standalone/io/http_server_response_test.dart
+++ b/tests/standalone/io/http_server_response_test.dart
@@ -12,7 +12,9 @@
 import "dart:io";
 import "dart:typed_data";
 
-void testServerRequest(void handler(server, request), {int bytes}) {
+void testServerRequest(void handler(server, request),
+                       {int bytes,
+                        bool closeClient}) {
   HttpServer.bind("127.0.0.1", 0).then((server) {
     server.listen((request) {
       handler(server, request);
@@ -26,8 +28,16 @@
       .then((request) => request.close())
       .then((response) {
         int received = 0;
-        response.listen(
-            (data) => received += data.length,
+        var subscription;
+        subscription = response.listen(
+            (data) {
+              if (closeClient == true) {
+                subscription.cancel();
+                client.close();
+              } else {
+                received += data.length;
+              }
+            },
             onDone: () {
               if (bytes != null) Expect.equals(received, bytes);
               client.close();
@@ -42,6 +52,7 @@
   });
 }
 
+
 void testResponseDone() {
   testServerRequest((server, request) {
     request.response.close();
@@ -67,6 +78,7 @@
   });
 }
 
+
 void testResponseAddStream() {
   int bytes = new File(new Options().script).lengthSync();
 
@@ -114,6 +126,70 @@
   });
 }
 
+
+void testResponseAddStreamClosed() {
+  testServerRequest((server, request) {
+    request.response.addStream(new File(new Options().script).openRead())
+        .then((response) {
+          response.close();
+          response.done.then((_) => server.close());
+        });
+  }, closeClient: true);
+
+  testServerRequest((server, request) {
+    int count = 0;
+    write() {
+      request.response.addStream(new File(new Options().script).openRead())
+          .then((response) {
+            request.response.write("sync data");
+            count++;
+            if (count < 1000) {
+              write();
+            } else {
+              response.close();
+              response.done.then((_) => server.close());
+            }
+          });
+    }
+    write();
+  }, closeClient: true);
+}
+
+
+void testResponseAddClosed() {
+  testServerRequest((server, request) {
+    request.response.add(new File(new Options().script).readAsBytesSync());
+    request.response.close();
+    request.response.done.then((_) => server.close());
+  }, closeClient: true);
+
+  testServerRequest((server, request) {
+    for (int i = 0; i < 1000; i++) {
+      request.response.add(new File(new Options().script).readAsBytesSync());
+    }
+    request.response.close();
+    request.response.done.then((_) => server.close());
+  }, closeClient: true);
+
+  testServerRequest((server, request) {
+    int count = 0;
+    write() {
+      request.response.add(new File(new Options().script).readAsBytesSync());
+      Timer.run(() {
+        count++;
+        if (count < 1000) {
+          write();
+        } else {
+          request.response.close();
+          request. response.done.then((_) => server.close());
+        }
+      });
+    }
+    write();
+  }, closeClient: true);
+}
+
+
 void testBadResponseAdd() {
   testServerRequest((server, request) {
     request.response.contentLength = 0;
@@ -146,6 +222,7 @@
   });
 }
 
+
 void testBadResponseClose() {
   testServerRequest((server, request) {
     request.response.contentLength = 5;
@@ -165,9 +242,12 @@
   });
 }
 
+
 void main() {
   testResponseDone();
   testResponseAddStream();
+  testResponseAddStreamClosed();
+  testResponseAddClosed();
   testBadResponseAdd();
   testBadResponseClose();
 }
diff --git a/tests/standalone/io/process_environment_test.dart b/tests/standalone/io/process_environment_test.dart
index 30e523b..24cc73d 100644
--- a/tests/standalone/io/process_environment_test.dart
+++ b/tests/standalone/io/process_environment_test.dart
@@ -9,16 +9,17 @@
 
 runEnvironmentProcess(Map environment, name, callback) {
   var dartExecutable = new Options().executable;
-  var options = new ProcessOptions();
-  options.environment = environment;
   var printEnv = 'tests/standalone/io/print_env.dart';
   if (!new File(printEnv).existsSync()) {
     printEnv = '../$printEnv';
   }
-  Process.run(dartExecutable, [printEnv, name], options).then((result) {
-    Expect.equals(0, result.exitCode);
-    callback(result.stdout);
-  });
+  Process.run(dartExecutable,
+              [printEnv, name],
+              environment: environment)
+      .then((result) {
+        Expect.equals(0, result.exitCode);
+        callback(result.stdout);
+      });
 }
 
 testEnvironment() {
diff --git a/tests/standalone/io/process_invalid_arguments_test.dart b/tests/standalone/io/process_invalid_arguments_test.dart
index 8dc60d1..bbbc631 100644
--- a/tests/standalone/io/process_invalid_arguments_test.dart
+++ b/tests/standalone/io/process_invalid_arguments_test.dart
@@ -14,24 +14,15 @@
                 (e) => e is ArgumentError);
   Expect.throws(() => Process.start("true", ["asdf", 1]),
                 (e) => e is ArgumentError);
-  Expect.throws(() => Process.run(["true"], [], null),
+;
+  Expect.throws(() => Process.start("true", [], workingDirectory: 23),
                 (e) => e is ArgumentError);
-  Expect.throws(() => Process.run("true", "asdf", null),
+  Expect.throws(() => Process.run("true", [], workingDirectory: 23),
                 (e) => e is ArgumentError);
-  Expect.throws(() => Process.run("true", ["asdf", 1], null),
-                (e) => e is ArgumentError);
-  var options = new ProcessOptions();
-  options.workingDirectory = 23;
-  Expect.throws(() => Process.start("true", [], options),
-                (e) => e is ArgumentError);
-  Expect.throws(() => Process.run("true", [], options),
-                (e) => e is ArgumentError);
-  options = new ProcessOptions();
-  options.stdoutEncoding = 23;
-  Expect.throws(() => Process.run("true", [], options),
-                (e) => e is ArgumentError);
-  options = new ProcessOptions();
-  options.stderrEncoding = 23;
-  Expect.throws(() => Process.run("true", [], options),
-                (e) => e is ArgumentError);
+
+  Process.run("true", [], stdoutEncoding: 23)
+      .then((_) => Expect.fail("expected error"), onError: (_) {});
+
+  Process.run("true", [], stderrEncoding: 23)
+      .then((_) => Expect.fail("expected error"), onError: (_) {});
 }
diff --git a/tests/standalone/io/process_non_ascii_test.dart b/tests/standalone/io/process_non_ascii_test.dart
index 020b07e..92e3a8b 100644
--- a/tests/standalone/io/process_non_ascii_test.dart
+++ b/tests/standalone/io/process_non_ascii_test.dart
@@ -25,12 +25,11 @@
 """);
   var nonAsciiTxtFile = new File('${nonAsciiDir.path}/æøå.txt');
   nonAsciiTxtFile.writeAsStringSync('æøå');
-  var options = new ProcessOptions();
-  options.workingDirectory = nonAsciiDir.path;
   var script = nonAsciiFile.path;
-  Process.run(executable, [script], options).then((result) {
-    Expect.equals(0, result.exitCode);
-    tempDir.deleteSync(recursive: true);
-    port.close();
-  });
+  Process.run(executable, [script], workingDirectory: nonAsciiDir.path)
+      .then((result) {
+        Expect.equals(0, result.exitCode);
+        tempDir.deleteSync(recursive: true);
+        port.close();
+      });
 }
diff --git a/tests/standalone/io/process_path_environment_test.dart b/tests/standalone/io/process_path_environment_test.dart
index 72f5165..80ec89b 100644
--- a/tests/standalone/io/process_path_environment_test.dart
+++ b/tests/standalone/io/process_path_environment_test.dart
@@ -18,11 +18,10 @@
     args = ['/C', 'echo', '"ok"'];
   }
 
-  var options = new ProcessOptions();
-  options.environment = new Map.from(Platform.environment);
-  options.environment['whatever'] = 'something';
+  var environment = new Map.from(Platform.environment);
+  environment['whatever'] = 'something';
 
-  Process.run(executable, args, options).then((result) {
+  Process.run(executable, args, environment: environment).then((result) {
     Expect.equals(0, result.exitCode);
   });
 }
diff --git a/tests/standalone/io/process_path_test.dart b/tests/standalone/io/process_path_test.dart
index e517d9e..c830381 100644
--- a/tests/standalone/io/process_path_test.dart
+++ b/tests/standalone/io/process_path_test.dart
@@ -18,7 +18,6 @@
     args = ['/C', 'echo', '"ok"'];
   }
 
-  var options = new ProcessOptions();
   Process.run(executable, args).then((result) {
     Expect.equals(0, result.exitCode);
   });
diff --git a/tests/standalone/io/process_run_output_test.dart b/tests/standalone/io/process_run_output_test.dart
index 5dd731b..6bdbf44 100644
--- a/tests/standalone/io/process_run_output_test.dart
+++ b/tests/standalone/io/process_run_output_test.dart
@@ -29,21 +29,18 @@
     enc = Encoding.UTF_8;
   }
 
-  var options = new ProcessOptions();
   if (stream == 'stdout') {
-    options.stdoutEncoding = enc;
     Process.run(new Options().executable,
                 [scriptFile, encoding, stream],
-                options). then((result) {
+                stdoutEncoding: enc). then((result) {
       Expect.equals(result.exitCode, 0);
       Expect.equals(result.stderr, '');
       checkOutput(encoding, result.stdout);
     });
   } else {
-    options.stderrEncoding = enc;
     Process.run(new Options().executable,
                 [scriptFile, encoding, stream],
-                options).then((result) {
+                stderrEncoding: enc).then((result) {
       Expect.equals(result.exitCode, 0);
       Expect.equals(result.stdout, '');
       checkOutput(encoding, result.stderr);
diff --git a/tests/standalone/io/process_shell_test.dart b/tests/standalone/io/process_shell_test.dart
index add0c9f..fd962d9 100644
--- a/tests/standalone/io/process_shell_test.dart
+++ b/tests/standalone/io/process_shell_test.dart
@@ -3,13 +3,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "dart:io";
+import "dart:isolate";
 
 void testRunShell() {
   test(args) {
     var options = new Options();
     var path = new Path(options.script);
     path = path.directoryPath.join(new Path("process_echo_util.dart"));
-    Process.runShell(options.executable, [path.toString()]..addAll(args))
+    Process.run(options.executable,
+                [path.toString()]..addAll(args),
+                runInShell: true)
         .then((result) {
           if (Platform.operatingSystem == "windows") {
             result = result.stdout.split("\r\n");
@@ -29,44 +32,35 @@
   test(["\""]);
   test(["a b"]);
   test(["'"]);
+  test(["'", "'"]);
   test(["'\"\"'\"'\"'"]);
   test(["'\"\"'", "\"'\"'"]);
+  test(["'\\\"\\\"'\\", "\"\\'\"'"]);
   test(["'\$HOME'"]);
   test(["'\$tmp'"]);
+  test(["arg'"]);
+  test(["arg\\'", "'\\arg"]);
 }
 
-void testShell() {
-  test(args, expected) {
+void testBadRunShell() {
+  test(exe, [args = const []]) {
     var options = new Options();
     var path = new Path(options.script);
     path = path.directoryPath.join(new Path("process_echo_util.dart"));
-    var command = "${options.executable} $path $args";
-    Process.runShell(command, [])
+    Process.run(exe, args, runInShell: true)
         .then((result) {
-          if (Platform.operatingSystem == "windows") {
-            result = result.stdout.split("\r\n");
-          } else {
-            result = result.stdout.split("\n");
-          }
-          if (result.length - 1 != expected.length) {
-            throw "wrong number of args: $expected vs $result";
-          }
-          for (int i = 0; i < expected.length; i++) {
-            if (expected[i] != result[i]) {
-              throw "bad result at $i: ${expected[i]} vs ${result[i]}";
-            }
+          port.close();
+          if (result.exitCode == 0) {
+            throw "error expected";
           }
         });
   }
-  test("arg", ["arg"]);
-  test("arg1 arg2", ["arg1", "arg2"]);
-  if (Platform.operatingSystem != 'windows') {
-    test("arg1 arg2 > /dev/null", []);
-  }
+  test("'\"'");
+  test("'\$HOME'");
 }
 
 void main() {
   testRunShell();
-  testShell();
+  testBadRunShell();
 }
 
diff --git a/tests/standalone/io/process_working_directory_test.dart b/tests/standalone/io/process_working_directory_test.dart
index 9bc1d0c..eb8a9b9 100644
--- a/tests/standalone/io/process_working_directory_test.dart
+++ b/tests/standalone/io/process_working_directory_test.dart
@@ -21,39 +21,36 @@
     Directory directory = new Directory("").createTempSync();
     Expect.isTrue(directory.existsSync());
 
-    var options = new ProcessOptions();
-    options.workingDirectory = directory.path;
-    var processFuture =
-        Process.start(fullTestFilePath, const ["0", "0", "99", "0"], options);
-    processFuture.then((process) {
-      process.exitCode.then((int exitCode) {
-        Expect.equals(exitCode, 99);
-        directory.deleteSync();
-      });
-      process.stdout.listen((_) {});
-      process.stderr.listen((_) {});
-    }).catchError((error) {
-      directory.deleteSync();
-      Expect.fail("Couldn't start process");
-    });
+    Process.start(fullTestFilePath,
+                  const ["0", "0", "99", "0"],
+                  workingDirectory: directory.path)
+        .then((process) {
+          process.exitCode.then((int exitCode) {
+            Expect.equals(exitCode, 99);
+            directory.deleteSync();
+          });
+          process.stdout.listen((_) {});
+          process.stderr.listen((_) {});
+        }).catchError((error) {
+          directory.deleteSync();
+          Expect.fail("Couldn't start process");
+        });
   }
 
   static void testInvalidDirectory() {
     Directory directory = new Directory("").createTempSync();
     Expect.isTrue(directory.existsSync());
 
-    var options = new ProcessOptions();
-    options.workingDirectory = directory.path + "/subPath";
-    var future = Process.start(fullTestFilePath,
-                               const ["0", "0", "99", "0"],
-                               options);
-    future.then((process) {
-      Expect.fail("bad process completed");
-      directory.deleteSync();
-    }).catchError((e) {
-      Expect.isNotNull(e);
-      directory.deleteSync();
-    });
+    Process.start(fullTestFilePath,
+                  const ["0", "0", "99", "0"],
+                  workingDirectory: directory.path + "/subPath")
+        .then((process) {
+          Expect.fail("bad process completed");
+          directory.deleteSync();
+        }).catchError((e) {
+          Expect.isNotNull(e);
+          directory.deleteSync();
+        });
   }
 }
 
diff --git a/tests/standalone/io/regress_7679_test.dart b/tests/standalone/io/regress_7679_test.dart
index dba91ed..30b45d37 100644
--- a/tests/standalone/io/regress_7679_test.dart
+++ b/tests/standalone/io/regress_7679_test.dart
@@ -34,11 +34,10 @@
   });
 }
 """);
-  ProcessOptions options = new ProcessOptions();
-  options.workingDirectory = temp.path;
   String executable = new File(new Options().executable).fullPathSync();
-  Process.run(executable, ['script.dart'], options).then((result) {
-    temp.deleteSync(recursive: true);
-    Expect.equals(0, result.exitCode);
-  });
+  Process.run(executable, ['script.dart'], workingDirectory: temp.path)
+      .then((result) {
+        temp.deleteSync(recursive: true);
+        Expect.equals(0, result.exitCode);
+      });
 }
diff --git a/tests/standalone/status_expression_test.dart b/tests/standalone/status_expression_test.dart
index 03be619..7940c46 100644
--- a/tests/standalone/status_expression_test.dart
+++ b/tests/standalone/status_expression_test.dart
@@ -16,6 +16,7 @@
     test4();
     test5();
     test6();
+    test7();
   }
 
   static void test1() {
@@ -145,6 +146,33 @@
     environment["checked"] = true;
     Expect.isFalse(ast.evaluate(environment));
   }
+
+  static void test7() {
+    // Test the != operator.
+    Tokenizer tokenizer =
+        new Tokenizer(r"$compiler == dart2js && $runtime != ie9");
+    tokenizer.tokenize();
+    ExpressionParser parser =
+        new ExpressionParser(new Scanner(tokenizer.tokens));
+    BooleanExpression ast = parser.parseBooleanExpression();
+    Expect.equals(r"(($compiler == dart2js) && ($runtime != ie9))",
+                  ast.toString());
+
+    // Test BooleanExpression.evaluate().
+    Map environment = new Map();
+
+    environment["compiler"] = "none";
+    environment["runtime"] = "ie9";
+    Expect.isFalse(ast.evaluate(environment));
+    environment["runtime"] = "chrome";
+    Expect.isFalse(ast.evaluate(environment));
+
+    environment["compiler"] = "dart2js";
+    environment["runtime"] = "ie9";
+    Expect.isFalse(ast.evaluate(environment));
+    environment["runtime"] = "chrome";
+    Expect.isTrue(ast.evaluate(environment));
+  }
 }
 
 main() {
diff --git a/tools/VERSION b/tools/VERSION
index 9021f050..a83fb33 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 5
-BUILD 10
-PATCH 2
+BUILD 11
+PATCH 0
diff --git a/tools/bots/bot.py b/tools/bots/bot.py
index a050b42..92fec5c 100644
--- a/tools/bots/bot.py
+++ b/tools/bots/bot.py
@@ -17,9 +17,6 @@
 
 DART_PATH = dirname(dirname(dirname(abspath(__file__))))
 
-NO_COLOR_ENV = dict(os.environ)
-NO_COLOR_ENV['TERM'] = 'nocolor'
-
 BUILDER_NAME = 'BUILDBOT_BUILDERNAME'
 BUILDER_CLOBBER = 'BUILDBOT_CLOBBER'
 
@@ -229,7 +226,10 @@
   If a non-zero exit code is returned, raises an OSError with errno as the exit
   code.
   """
-  exit_code = subprocess.call(command, env=NO_COLOR_ENV)
+  no_color_env = dict(os.environ)
+  no_color_env['TERM'] = 'nocolor'
+
+  exit_code = subprocess.call(command, env=no_color_env)
   if exit_code != 0:
     raise OSError(exit_code)
 
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index 72cf2e6..fd34ac6 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -10,10 +10,11 @@
 Runs tests for the  dart2js compiler.
 """
 
-import platform
 import os
+import platform
 import re
 import shutil
+import socket
 import subprocess
 import sys
 
@@ -22,7 +23,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|mac10\.8|mac10\.7|linux)(-(all|html))?(-(csp))?(-(\d+)-(\d+))?')
+    r'dart2js-(ie9|ie10|ff|safari|chrome|chromeOnAndroid|opera)-(win7|win8|mac10\.8|mac10\.7|linux)(-(all|html))?(-(csp))?(-(\d+)-(\d+))?')
 
 
 def GetBuildInfo(builder_name, is_buildbot):
@@ -145,7 +146,7 @@
 
     # TODO(ricow): temporary hack to run on fyi with --use_browser_controller
     if (os.environ.get('BUILDBOT_SCHEDULER') == "fyi-main" and
-        (runtime == 'chrome' or runtime == 'ff')):
+        runtime in ['chrome', 'ff', 'chromeOnAndroid']):
       cmd.append('--use_browser_controller')
 
     global IsFirstTestStepCall
@@ -296,6 +297,29 @@
   return False
 
 
+def GetLocalIPAddress():
+  hostname = socket.gethostname()
+  # '$ host chromeperf02' results for example in
+  # 'chromeperf02.perf.chromium.org has address 172.22.28.55'
+  output = subprocess.check_output(["host", hostname])
+  match = re.match(r'.*\s+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\s+.*', output)
+  if not match:
+    raise Exception("Could not determine local ip address "
+                    "(hostname: '%s', host command output: '%s')."
+                    % (hostname, output))
+  return match.group(1)
+
+def AddAndroidToolsToPath():
+  par_dir = os.path.pardir
+  join = os.path.join
+
+  dart_dir = join(os.path.dirname(__file__), par_dir, par_dir)
+  android_sdk = join(dart_dir, 'third_party', 'android_tools', 'sdk')
+  tools_dir = os.path.abspath(join(android_sdk, 'tools'))
+  platform_tools_dir = os.path.abspath(join(android_sdk, 'platform-tools'))
+  os.environ['PATH'] = os.pathsep.join(
+      [os.environ['PATH'], tools_dir, platform_tools_dir])
+
 def RunCompilerTests(build_info):
   test_flags = []
   if build_info.shard_index:
@@ -310,6 +334,12 @@
 
   if build_info.csp: test_flags += ['--csp']
 
+  if build_info.runtime == 'chromeOnAndroid':
+    test_flags.append('--local_ip=%s' % GetLocalIPAddress())
+    # test.py expects the android tools directories to be in PATH
+    # (they contain for example 'adb')
+    AddAndroidToolsToPath()
+
   TestCompiler(build_info.runtime, build_info.mode, build_info.system,
                list(test_flags), build_info.is_buildbot, build_info.test_set)
 
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index cc9935d..4c2dc62 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -459,12 +459,14 @@
       "getPropertyPriority": {},
       "getPropertyShorthand": {
         "comment": "http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface",
-        "support_level": "nonstandard"
+        "dart_action": "suppress",
+        "support_level": "deprecated"
       },
       "getPropertyValue": {},
       "isPropertyImplicit": {
         "comment": "http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface",
-        "support_level": "nonstandard"
+        "dart_action": "suppress",
+        "support_level": "deprecated"
       },
       "item": {},
       "length": {},
@@ -614,9 +616,7 @@
       "globalAlpha": {},
       "globalCompositeOperation": {},
       "isPointInPath": {},
-      "isPointInStroke": {
-        "support_level": "nonstandard"
-      },
+      "isPointInStroke": {},
       "lineCap": {},
       "lineDashOffset": {},
       "lineJoin": {},
@@ -1435,19 +1435,19 @@
       "onsuspend": {},
       "ontimeupdate": {},
       "ontouchcancel": {
-        "comment": "http://www.w3.org/TR/touch-events/",
+        "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
       "ontouchend": {
-        "comment": "http://www.w3.org/TR/touch-events/",
+        "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
       "ontouchmove": {
-        "comment": "http://www.w3.org/TR/touch-events/",
+        "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
       "ontouchstart": {
-        "comment": "http://www.w3.org/TR/touch-events/",
+        "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
       "ontransitionend": {},
@@ -1828,11 +1828,11 @@
       "createRange": {},
       "createTextNode": {},
       "createTouch": {
-        "comment": "http://www.w3.org/TR/touch-events/",
+        "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
       "createTouchList": {
-        "comment": "http://www.w3.org/TR/touch-events/",
+        "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
       "createTreeWalker": {},
@@ -1942,19 +1942,19 @@
       "onselectstart": {},
       "onsubmit": {},
       "ontouchcancel": {
-        "comment": "http://www.w3.org/TR/touch-events/",
+        "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
       "ontouchend": {
-        "comment": "http://www.w3.org/TR/touch-events/",
+        "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
       "ontouchmove": {
-        "comment": "http://www.w3.org/TR/touch-events/",
+        "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
       "ontouchstart": {
-        "comment": "http://www.w3.org/TR/touch-events/",
+        "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
       "onwebkitfullscreenchange": {
@@ -2323,27 +2323,27 @@
       },
       "onsubmit": {},
       "ontouchcancel": {
-        "comment": "http://www.w3.org/TR/touch-events/",
+        "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
       "ontouchend": {
-        "comment": "http://www.w3.org/TR/touch-events/",
+        "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
       "ontouchenter": {
-        "comment": "http://www.w3.org/TR/touch-events/",
+        "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
       "ontouchleave": {
-        "comment": "http://www.w3.org/TR/touch-events/",
+        "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
       "ontouchmove": {
-        "comment": "http://www.w3.org/TR/touch-events/",
+        "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
       "ontouchstart": {
-        "comment": "http://www.w3.org/TR/touch-events/",
+        "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
       "onwebkitTransitionEnd": {
@@ -2366,7 +2366,7 @@
       "querySelector": {},
       "querySelectorAll": {},
       "remove": {
-        "dart_action": "suppress",
+        "dart_action": "stable",
         "support_level": "nonstandard"
       },
       "removeAttribute": {},
@@ -2970,10 +2970,6 @@
     },
     "support_level": "experimental"
   },
-  "FormData": {
-    "members": {},
-    "support_level": "untriaged"
-  },
   "GainNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#GainNode",
     "members": {
@@ -3045,8 +3041,7 @@
         "support_level": "deprecated"
       },
       "download": {
-        "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#attr-hyperlink-download",
-        "support_level": "experimental"
+        "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#attr-hyperlink-download"
       },
       "hash": {},
       "host": {},
@@ -3953,10 +3948,7 @@
         "support_level": "deprecated"
       },
       "sheet": {},
-      "sizes": {
-        "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#rel-icon",
-        "support_level": "experimental"
-      },
+      "sizes": {},
       "target": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLLinkElement-partial",
         "dart_action": "suppress",
@@ -4324,12 +4316,8 @@
     "members": {
       "length": {},
       "namedItem": {},
-      "numericIndexGetter": {
-        "support_level": "untriaged"
-      },
-      "numericIndexSetter": {
-        "support_level": "untriaged"
-      },
+      "numericIndexGetter": {},
+      "numericIndexSetter": {},
       "remove": {},
       "selectedIndex": {}
     },
@@ -5190,29 +5178,6 @@
     },
     "support_level": "stable"
   },
-  "JavaScriptCallFrame": {
-    "dart_action": "suppress",
-    "members": {
-      "CATCH_SCOPE": {},
-      "CLOSURE_SCOPE": {},
-      "GLOBAL_SCOPE": {},
-      "LOCAL_SCOPE": {},
-      "WITH_SCOPE": {},
-      "caller": {},
-      "column": {},
-      "evaluate": {},
-      "functionName": {},
-      "line": {},
-      "restart": {},
-      "scopeChain": {},
-      "scopeType": {},
-      "setVariableValue": {},
-      "sourceID": {},
-      "thisObject": {},
-      "type": {}
-    },
-    "support_level": "nonstandard"
-  },
   "KeyboardEvent": {
     "comment": "http://www.w3.org/TR/DOM-Level-3-Events/#events-KeyboardEvent",
     "members": {
@@ -5298,6 +5263,10 @@
     },
     "support_level": "untriaged"
   },
+  "MIDIErrorCallback": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "MIDIInput": {
     "members": {},
     "support_level": "untriaged"
@@ -5668,7 +5637,6 @@
   },
   "MutationEvent": {
     "comment": "http://www.w3.org/TR/DOM-Level-3-Events/#events-mutationevents",
-    "dart_action": "experimental",
     "members": {
       "ADDITION": {},
       "MODIFICATION": {},
@@ -5787,7 +5755,7 @@
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorid"
       },
       "plugins": {
-        "dart_action": "unstable",
+        "dart_action": "suppress",
         "support_level": "nonstandard"
       },
       "product": {
@@ -10483,7 +10451,7 @@
     "support_level": "stable"
   },
   "Touch": {
-    "comment": "http://www.w3.org/TR/touch-events/",
+    "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
     "members": {
       "clientX": {},
       "clientY": {},
@@ -10509,7 +10477,7 @@
     "support_level": "experimental"
   },
   "TouchEvent": {
-    "comment": "http://www.w3.org/TR/touch-events/",
+    "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
     "members": {
       "altKey": {},
       "changedTouches": {},
@@ -10523,7 +10491,7 @@
     "support_level": "experimental"
   },
   "TouchList": {
-    "comment": "http://www.w3.org/TR/touch-events/",
+    "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
     "members": {
       "item": {},
       "length": {}
diff --git a/tools/dom/scripts/dartdomgenerator.py b/tools/dom/scripts/dartdomgenerator.py
index 1292920..2ba67aa 100755
--- a/tools/dom/scripts/dartdomgenerator.py
+++ b/tools/dom/scripts/dartdomgenerator.py
@@ -49,7 +49,7 @@
   return common_database
 
 def GenerateFromDatabase(common_database, dart2js_output_dir,
-                         dartium_output_dir):
+                         dartium_output_dir, update_dom_metadata=False):
   current_dir = os.path.dirname(__file__)
   auxiliary_dir = os.path.join(current_dir, '..', 'src')
   template_dir = os.path.join(current_dir, '..', 'templates')
@@ -140,7 +140,9 @@
 
   _logger.info('Flush...')
   emitters.Flush()
-  metadata.Flush()
+
+  if update_dom_metadata:
+    metadata.Flush()
 
   monitored.FinishMonitoring(dart2js_output_dir)
 
@@ -175,6 +177,10 @@
                     default=False,
                     help='''Use the cached database from the previous run to
                     improve startup performance''')
+  parser.add_option('--update-dom-metadata', dest='update_dom_metadata',
+                    action='store_true',
+                    default=False,
+                    help='''Update the metadata list of DOM APIs''')
   (options, args) = parser.parse_args()
 
   current_dir = os.path.dirname(__file__)
@@ -199,7 +205,8 @@
   else:
     # Load the previously generated database.
     database = LoadDatabase(database_dir, options.use_database_cache)
-  GenerateFromDatabase(database, dart2js_output_dir, dartium_output_dir)
+  GenerateFromDatabase(database, dart2js_output_dir, dartium_output_dir,
+      options.update_dom_metadata)
 
   if 'htmldart2js' in systems:
     _logger.info('Generating dart2js single files.')
diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py
index 0012b76..9daed68 100644
--- a/tools/dom/scripts/dartmetadata.py
+++ b/tools/dom/scripts/dartmetadata.py
@@ -392,6 +392,8 @@
   ],
 })
 
+# TODO(blois): minimize noise and enable by default.
+_monitor_type_metadata = False
 
 class DartMetadata(object):
   def __init__(self, api_status_path, doc_comments_path):
@@ -404,6 +406,20 @@
     self._doc_comments = json.load(comments_file)
     comments_file.close()
 
+    if _monitor_type_metadata:
+      monitored_interfaces = {}
+      for interface_id, interface_data in self._types.iteritems():
+        monitored_interface = interface_data.copy()
+        monitored_interface['members'] = monitored.Dict(
+            'dartmetadata.%s' % interface_id, interface_data['members'])
+
+        monitored_interfaces[interface_id] = monitored_interface
+
+      self._monitored_types = monitored.Dict('dartmetadata._monitored_types',
+          monitored_interfaces)
+    else:
+      self._monitored_types = self._types
+
   def GetFormattedMetadata(self, library_name, interface, member_id=None,
       indentation=''):
     """ Gets all comments and annotations for an interface or member.
@@ -473,8 +489,12 @@
     if source_member_name:
       member_name = source_member_name
 
-    # TODO(blois): Emit support level annotations
-    self._GetSupportLevelAnnotation(interface.id, member_name)
+    support_annotations = self._GetSupportLevelAnnotations(
+        interface.id, member_name)
+
+    for annotation in support_annotations:
+      if annotation not in annotations:
+        annotations.append(annotation)
 
     return annotations
 
@@ -534,12 +554,12 @@
     ann2 = _dart2js_annotations.get(idl_type)
     return ann2
 
-  def _GetSupportLevel(self, interface_id, member_id=None):
+  def _GetSupportInfo(self, interface_id, member_id=None):
     """ Looks up the interface or member in the DOM status list and returns the
     support level for it.
     """
-    if interface_id in self._types:
-      type_info = self._types[interface_id]
+    if interface_id in self._monitored_types:
+      type_info = self._monitored_types[interface_id]
     else:
       type_info = {
         'members': {},
@@ -548,7 +568,7 @@
       self._types[interface_id] = type_info
 
     if not member_id:
-      return type_info.get('support_level')
+      return type_info
 
     members = type_info['members']
 
@@ -561,28 +581,60 @@
         member_info = {'support_level': 'untriaged'}
       members[member_id] = member_info
 
-    support_level = member_info.get('support_level')
-    # If unset then it inherits from the type.
-    if not support_level:
-      support_level = type_info.get('support_level')
-    return support_level
+    return member_info
 
-  def _GetSupportLevelAnnotation(self, interface_id, member_id=None):
-    support_level = self._GetSupportLevel(interface_id, member_id)
+  def _GetSupportLevelAnnotations(self, interface_id, member_id=None):
+    """ Gets annotations for API support status.
+    """
+    support_info = self._GetSupportInfo(interface_id, member_id)
 
-    if support_level == 'untriaged':
-      return '@Experimental'
+    dart_action = support_info.get('dart_action')
+    support_level = support_info.get('support_level')
+    comment = support_info.get('comment')
+    annotations = []
+    # TODO(blois): should add an annotation for the comment, but keeping out
+    # to keep the initial diff a bit more localized.
+    #if comment:
+    #  annotations.append('// %s' % comment)
+
+    if dart_action:
+      if dart_action == 'unstable':
+        annotations.append('@Unstable')
+      elif dart_action == 'experimental':
+        if comment:
+          annotations.append('// %s' % comment)
+        annotations.append('@Experimental // %s' % support_level)
+      elif dart_action == 'suppress':
+        if comment:
+          annotations.append('// %s' % comment)
+        annotations.append('@deprecated // %s' % support_level)
+        # TODO (blois): suppress generation of these APIs as a separate CL.
+        pass
+      else:
+        _logger.warn('Unknown dart_action - %s:%s' % (interface_id, member_id))
+    elif support_level == 'untriaged':
+      annotations.append('@Experimental // untriaged')
     elif support_level == 'experimental':
-      return '@Experimental'
+      if comment:
+        annotations.append('// %s' % comment)
+      annotations.append('@Experimental')
     elif support_level == 'nonstandard':
-      return '@Experimental'
+      if comment:
+        annotations.append('// %s' % comment)
+      annotations.append('@Experimental // non-standard')
     elif support_level == 'stable':
-      return
+      pass
     elif support_level == 'deprecated':
-      return '@Deprecated'
+      if comment:
+        annotations.append('// %s' % comment)
+      annotations.append('@deprecated')
+    elif support_level is None:
+      pass
     else:
       _logger.warn('Unknown support_level - %s:%s' % (interface_id, member_id))
 
+    return annotations
+
   def Flush(self):
     json_file = open(self._api_status_path, 'w+')
     json.dump(self._types, json_file, indent=2, separators=(',', ': '), sort_keys=True)
diff --git a/tools/dom/scripts/go.sh b/tools/dom/scripts/go.sh
index deda00c..efb01b6 100755
--- a/tools/dom/scripts/go.sh
+++ b/tools/dom/scripts/go.sh
@@ -45,8 +45,10 @@
 
 if [[ $CACHED ]] ; then
   reset &&
-  ./dartdomgenerator.py --use-database-cache --systems="$SYSTEMS"
+  ./dartdomgenerator.py --use-database-cache --systems="$SYSTEMS" \
+  --update-dom-metadata
 else
   reset &&
-  ./dartdomgenerator.py --rebuild --parallel --systems="$SYSTEMS"
+  ./dartdomgenerator.py --rebuild --parallel --systems="$SYSTEMS" \
+  --update-dom-metadata
 fi
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 0dc1054..266bc20 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -240,11 +240,20 @@
         argument = signatures[signature_index][i]
         parameter_name = parameter_names[i]
         test_type = self._DartType(argument.type.id)
+
         if test_type in ['dynamic', 'Object']:
           checks.append('?%s' % parameter_name)
         elif not can_omit_type_check(test_type, i):
           checks.append('(%s is %s || %s == null)' % (
               parameter_name, test_type, parameter_name))
+        else:
+          for signature in signatures:
+            if (len(signature) <= i or signature[i].id not in
+                parameter_name.split('_OR_')):
+
+              checks.append('?%s' % parameter_name)
+              break
+
       # There can be multiple presence checks.  We need them all since a later
       # optional argument could have been passed by name, leaving 'holes'.
       checks.extend(['!?%s' % name for name in parameter_names[argument_count:]])
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index c6463e1..ada9609 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -451,8 +451,11 @@
         self._library_name)
     code.Emit(self._template_loader.Load('callback.darttemplate'))
 
-    code.Emit('typedef void $NAME($PARAMS);\n',
-              LIBRARYNAME='dart.dom.%s' % self._library_name,
+    annotations = self._metadata.GetFormattedMetadata(self._library_name,
+        self._interface)
+
+    code.Emit('$(ANNOTATIONS)typedef void $NAME($PARAMS);\n',
+              ANNOTATIONS=annotations,
               NAME=typedef_name,
               PARAMS=info.ParametersDeclaration(self._DartType))
     self._backend.GenerateCallback(info)
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index c5c8219..fb659f4 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -514,9 +514,7 @@
       self._EmitNativeIndexSetter(dart_element_type)
 
   def _HasNativeIndexGetter(self):
-    ext_attrs = self._interface.ext_attrs
-    return ('CustomIndexedGetter' in ext_attrs or
-        'NumericIndexedGetter' in ext_attrs)
+    return 'CustomIndexedGetter' in self._interface.ext_attrs
 
   def _EmitNativeIndexGetter(self, element_type):
     dart_declaration = '%s operator[](int index)' % \
diff --git a/tools/test.dart b/tools/test.dart
index 71a3e78..089a721 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -130,7 +130,7 @@
       var servers = new TestingServers(new Path(TestUtils.buildDir(conf)),
                                        useContentSecurityPolicy,
                                        conf['runtime']);
-      serverFutures.add(servers.startServers('127.0.0.1'));
+      serverFutures.add(servers.startServers(conf['local_ip']));
       conf['_servers_'] = servers;
     }
 
diff --git a/tools/testing/dart/android.dart b/tools/testing/dart/android.dart
new file mode 100644
index 0000000..328cd07
--- /dev/null
+++ b/tools/testing/dart/android.dart
@@ -0,0 +1,327 @@
+// 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 android;
+
+import "dart:io";
+import "dart:async";
+import "dart:core";
+import "dart:utf";
+
+import "utils.dart";
+
+Future _executeCommand(String executable,
+                       List<String> args,
+                       [String stdin = ""]) {
+  return _executeCommandRaw(executable, args, stdin).then((results) => null);
+}
+
+Future _executeCommandGetOutput(String executable,
+                                List<String> args,
+                                [String stdin = ""]) {
+  return _executeCommandRaw(executable, args, stdin)
+      .then((output) => output);
+}
+
+/**
+ * [_executeCommandRaw] will write [stdin] to the standard input of the created
+ * process and will return a tuple (stdout, stderr).
+ *
+ * If the exit code of the process was nonzero it will complete with an error.
+ * If starting the process failed, it will complete with an error as well.
+ */
+Future _executeCommandRaw(String executable,
+                          List<String> args,
+                          [String stdin = ""]) {
+  Future<String> getOutput(Stream<List<int>> stream) {
+    return stream.transform(new StringDecoder())
+        .reduce(new StringBuffer(), (buf, data) {
+          buf.write(data);
+          return buf;
+    }).then((buf) => buf.toString());
+  }
+
+  DebugLogger.info("Running: '\$ $executable ${args.join(' ')}'");
+  return Process.start(executable, args).then((Process process) {
+    if (stdin != null && stdin != '') {
+      process.stdin.write(stdin);
+    }
+    process.stdin.close();
+
+    var futures = [getOutput(process.stdout),
+                   getOutput(process.stderr),
+                   process.exitCode];
+    return Future.wait(futures).then((results) {
+      bool success = results[2] == 0;
+      if (!success) {
+        var error = "Running: '\$ $executable ${args.join(' ')}' failed:"
+                    "stdout: \n ${results[0]}"
+                    "stderr: \n ${results[1]}"
+                    "exitCode: \n ${results[2]}";
+        throw new Exception(error);
+      }
+      return results[0];
+    });
+  });
+}
+
+/**
+ * Helper class to loop through all adb ports.
+ *
+ * The ports come in pairs:
+ *  - even number: console connection
+ *  - odd number: adb connection
+ * Note that this code doesn't check if the ports are used.
+ */
+class AdbServerPortPool {
+  static int MIN_PORT = 5554;
+  static int MAX_PORT = 5584;
+
+  static int _nextPort = MIN_PORT;
+
+  static int next() {
+    var port = _nextPort;
+    if (port > MAX_PORT) {
+      throw new Exception("All ports are used.");
+    }
+    _nextPort += 2;
+    return port;
+  }
+}
+
+/**
+ * Represents the interface to the emulator.
+ * New emulators can be launched by calling the static [launchNewEmulator]
+ * method.
+ */
+class AndroidEmulator {
+  int _port;
+  Process _emulatorProcess;
+  AdbDevice _adbDevice;
+
+  int get port => _port;
+
+  AdbDevice get adbDevice => _adbDevice;
+
+  static Future<AndroidEmulator> launchNewEmulator(String avdName) {
+    var portNumber = AdbServerPortPool.next();
+    var args = ['-avd', '$avdName', '-port', "$portNumber" /*, '-gpu', 'on'*/];
+    return Process.start("emulator64-arm", args).then((Process process) {
+      var adbDevice = new AdbDevice('emulator-$portNumber');
+      return new AndroidEmulator._private(portNumber, adbDevice, process);
+    });
+  }
+
+  AndroidEmulator._private(this._port, this._adbDevice, this._emulatorProcess) {
+    Stream<String> getLines(Stream s) {
+      return s.transform(new StringDecoder()).transform(new LineTransformer());
+    }
+
+    getLines(_emulatorProcess.stdout).listen((line) {
+      log("stdout: ${line.trim()}");
+    });
+    getLines(_emulatorProcess.stderr).listen((line) {
+      log("stderr: ${line.trim()}");
+    });
+    _emulatorProcess.exitCode.then((exitCode) {
+      log("emulator exited with exitCode: $exitCode.");
+    });
+  }
+
+  Future<bool> kill() {
+    var completer = new Completer();
+    if (_emulatorProcess.kill()) {
+      _emulatorProcess.exitCode.then((exitCode) {
+        // TODO: Should we use exitCode to do something clever?
+        completer.complete(true);
+      });
+    } else {
+      log("Sending kill signal to emulator process failed");
+      completer.complete(false);
+    }
+    return completer.future;
+  }
+
+  void log(String msg) {
+    DebugLogger.info("AndroidEmulator(${_adbDevice.deviceId}): $msg");
+  }
+}
+
+/**
+ * Helper class to create avd device configurations.
+ */
+class AndroidHelper {
+  static Future createAvd(String name, String target) {
+    var args = ['--silent', 'create', 'avd', '--name', '$name',
+                '--target', '$target', '--force', '--abi', 'armeabi-v7a'];
+    // We're adding newlines to stdin to simulate <enter>.
+    return _executeCommand("android", args, "\n\n\n\n");
+  }
+}
+
+/**
+ * Used for communicating with an emulator or with a real device.
+ */
+class AdbDevice {
+  static const _adbServerStartupTime = const Duration(seconds: 3);
+  String _deviceId;
+
+  String get deviceId => _deviceId;
+
+  AdbDevice(this._deviceId);
+
+  /**
+   * Blocks execution until the device is online
+   */
+  Future waitForDevice() {
+    return _adbCommand(['wait-for-device']);
+  }
+
+  /**
+   * Polls the 'sys.boot_completed' property. Returns as soon as the property is
+   * 1.
+   */
+  Future waitForBootCompleted() {
+    var timeout = const Duration(seconds: 2);
+    var completer = new Completer();
+
+    checkUntilBooted() {
+      _adbCommandGetOutput(['shell', 'getprop', 'sys.boot_completed'])
+          .then((String stdout) {
+            stdout = stdout.trim();
+            if (stdout == '1') {
+              completer.complete();
+            } else {
+              new Timer(timeout, checkUntilBooted);
+            }
+          }).catchError((error) {
+            new Timer(timeout, checkUntilBooted);
+          });
+    }
+    checkUntilBooted();
+    return completer.future;
+  }
+
+  /**
+   * Put adb in root mode.
+   */
+  Future adbRoot() {
+    var adbRootCompleter = new Completer();
+    return _adbCommand(['root']).then((_) {
+      // TODO: Figure out a way to wait until the adb daemon was restarted in
+      // 'root mode' on the device.
+      new Timer(_adbServerStartupTime, () => adbRootCompleter.complete(true));
+    }).catchError((error) => adbRootCompleter.completeError(error));
+    return adbRootCompleter.future;
+  }
+
+  /**
+   * Download data form the device.
+   */
+  Future pullData(Path remote, Path local) {
+    return _adbCommand(['pull', '$remote', '$local']);
+  }
+
+  /**
+   * Upload data to the device.
+   */
+  Future pushData(Path local, Path remote) {
+    return _adbCommand(['push', '$local', '$remote']);
+  }
+
+  /**
+   * Change permission of directory recursively.
+   */
+  Future chmod(String mode, Path directory) {
+    var arguments = ['shell', 'chmod', '-R', mode, '$directory'];
+    return _adbCommand(arguments);
+  }
+
+  /**
+   * Install an application on the device.
+   */
+  Future installApk(Path filename) {
+    return _adbCommand(
+        ['install', '-i', 'com.google.android.feedback', '-r', '$filename']);
+  }
+
+  /**
+   * Start the given intent on the device.
+   */
+  Future startActivity(Intent intent) {
+    var arguments = ['shell', 'am', 'start', '-W',
+                     '-a', intent.action,
+                     '-n', "${intent.package}/${intent.activity}"];
+    if (intent.dataUri != null) {
+      arguments.addAll(['-d', intent.dataUri]);
+    }
+    return _adbCommand(arguments);
+  }
+
+  /**
+   * Force to stop everything associated with [package].
+   */
+  Future forceStop(String package) {
+    var arguments = ['shell', 'am', 'force-stop', package];
+    return _adbCommand(arguments);
+  }
+
+  /**
+   * Kill all background processes.
+   */
+  Future killAll() {
+    var arguments = ['shell', 'am', 'kill-all'];
+    return _adbCommand(arguments);
+  }
+
+  Future _adbCommand(List<String> adbArgs) {
+    if (_deviceId != null) {
+      var extendedAdbArgs = ['-s', _deviceId];
+      extendedAdbArgs.addAll(adbArgs);
+      adbArgs = extendedAdbArgs;
+    }
+    return _executeCommand("adb", adbArgs);
+  }
+
+  Future<String> _adbCommandGetOutput(List<String> adbArgs) {
+    if (_deviceId != null) {
+      var extendedAdbArgs = ['-s', _deviceId];
+      extendedAdbArgs.addAll(adbArgs);
+      adbArgs = extendedAdbArgs;
+    }
+    return _executeCommandGetOutput("adb", adbArgs);
+  }
+}
+
+/**
+ * Helper to list all adb devicess available.
+ */
+class AdbHelper {
+  static RegExp _deviceLineRegexp =
+      new RegExp(r'^([a-zA-Z0-9_-]+)[ \t]+device$', multiLine: true);
+
+  static Future<List<String>> listDevices() {
+    return Process.run('adb', ['devices']).then((ProcessResult result) {
+      if (result.exitCode != 0) {
+        throw new Exception("Could not list devices [stdout: ${result.stdout},"
+                            "stderr: ${result.stderr}]");
+      }
+      return _deviceLineRegexp.allMatches(result.stdout)
+          .map((Match m) => m.group(1)).toList();
+    });
+  }
+}
+
+/**
+ * Represents an android intent.
+ */
+class Intent {
+  String action;
+  String package;
+  String activity;
+  String dataUri;
+
+  Intent(this.action, this.package, this.activity, [this.dataUri]);
+}
+
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index 549508c..911d86d 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -7,9 +7,11 @@
 import "dart:core";
 import "dart:io";
 
+import 'android.dart';
+import 'utils.dart';
 
 /** Class describing the interface for communicating with browsers. */
-class Browser {
+abstract class Browser {
   // Browsers actually takes a while to cleanup after itself when closing
   // Give it sufficient time to do that.
   static final Duration killRepeatInternal = const Duration(seconds: 10);
@@ -103,7 +105,7 @@
 
 
     _logEvent("calling kill function");
-    if (killFunction()) {
+    if (process != null && killFunction()) {
       // We successfully sent the signal.
       _logEvent("killing signal sent");
     } else {
@@ -140,8 +142,7 @@
       }, onError: (error) {
         // This should _never_ happen, but we really want this in the log
         // if it actually does due to dart:io or vm bug.
-        _usageLog.add(
-            "An error occured in the process stdout handling: $error");
+        _logEvent("An error occured in the process stdout handling: $error");
       });
 
       process.stderr.transform(new StringDecoder()).listen((data) {
@@ -149,8 +150,7 @@
       }, onError: (error) {
         // This should _never_ happen, but we really want this in the log
         // if it actually does due to dart:io or vm bug.
-        _usageLog.add(
-            "An error occured in the process stderr handling: $error");
+        _logEvent("An error occured in the process stderr handling: $error");
       });
 
       process.exitCode.then((exitCode) {
@@ -161,7 +161,7 @@
       });
       return true;
     }).catchError((error) {
-      _logEvent("Running $binary $arguments failed with $error");
+      _logEvent("Running $command $arguments failed with $error");
       return false;
     });
   }
@@ -178,7 +178,6 @@
   Future<bool> start(String url);
 }
 
-
 class Chrome extends Browser {
   /**
    * The binary used to run chrome - changing this can be nececcary for
@@ -215,6 +214,82 @@
   String toString() => "Chrome";
 }
 
+class AndroidChrome extends Browser {
+  const String viewAction = 'android.intent.action.VIEW';
+  const String mainAction = 'android.intent.action.MAIN';
+  const String chromePackage = 'com.android.chrome';
+  const String browserPackage = 'com.android.browser';
+  const String firefoxPackage = 'org.mozilla.firefox';
+  const String turnScreenOnPackage = 'com.google.dart.turnscreenon';
+
+  AndroidEmulator _emulator;
+  AdbDevice _adbDevice;
+
+  AndroidChrome(this._adbDevice);
+
+  Future<bool> start(String url) {
+    var browserIntent = new Intent(
+        viewAction, browserPackage, '.BrowserActivity', url);
+    var chromeIntent = new Intent(viewAction, chromePackage, '.Main', url);
+    var firefoxIntent = new Intent(viewAction, firefoxPackage, '.App', url);
+    var turnScreenOnIntent =
+        new Intent(mainAction, turnScreenOnPackage, '.Main');
+
+    // FIXME(kustermann): Remove this hack as soon as we've got a v8 mirror in
+    // golo
+    var testing_resources_dir =
+        new Path('third_party/android_testing_resources');
+    var testing_resources_dir_tmp = 
+        new Path('/tmp/android_testing_resources');
+    if (!new Directory.fromPath(testing_resources_dir).existsSync()) {
+      DebugLogger.warning("$testing_resources_dir doesn't exist, "
+                          "trying to use $testing_resources_dir_tmp");
+      testing_resources_dir = testing_resources_dir_tmp;
+      if (!new Directory.fromPath(testing_resources_dir).existsSync()) {
+        DebugLogger.error("$testing_resources_dir_tmp doesn't exist either. "
+                          " This is a fatal error. Exiting now.");
+        exit(1);
+      }
+    }
+
+    var chromeAPK = testing_resources_dir.append('com.android.chrome-1.apk');
+    var turnScreenOnAPK = testing_resources_dir.append('TurnScreenOn.apk');
+    var chromeConfDir = testing_resources_dir.append('chrome_configuration');
+    var chromeConfDirRemote = new Path('/data/user/0/com.android.chrome/');
+
+    return _adbDevice.waitForBootCompleted().then((_) {
+      return _adbDevice.forceStop(chromeIntent.package);
+    }).then((_) {
+      return _adbDevice.killAll();
+    }).then((_) {
+      return _adbDevice.adbRoot();
+    }).then((_) {
+      return _adbDevice.installApk(turnScreenOnAPK);
+    }).then((_) {
+      return _adbDevice.installApk(chromeAPK);
+    }).then((_) {
+      return _adbDevice.pushData(chromeConfDir, chromeConfDirRemote);
+    }).then((_) {
+      return _adbDevice.chmod('777', chromeConfDirRemote);
+    }).then((_) {
+      return _adbDevice.startActivity(turnScreenOnIntent).then((_) => true);
+    }).then((_) {
+      return _adbDevice.startActivity(chromeIntent).then((_) => true);
+    });
+  }
+
+  Future<bool> close() {
+    if (_adbDevice != null) {
+      return _adbDevice.forceStop(chromePackage).then((_) {
+        return _adbDevice.killAll().then((_) => true);
+      });
+    }
+    return new Future.immediate(true);
+  }
+
+  String toString() => "chromeOnAndroid";
+}
+
 class Firefox extends Browser {
   /**
    * The binary used to run firefox - changing this can be nececcary for
@@ -223,12 +298,15 @@
   const String binary = "firefox";
 
   const String enablePopUp =
-      "user_pref(\"dom.disable_open_during_load\", false);";
+      'user_pref("dom.disable_open_during_load", false);';
+  const String disableDefaultCheck =
+      'user_pref("browser.shell.checkDefaultBrowser", false);';
 
   Future _createPreferenceFile(var path) {
     var file = new File("${path.toString()}/user.js");
     var randomFile = file.openSync(FileMode.WRITE);
     randomFile.writeStringSync(enablePopUp);
+    randomFile.writeStringSync(disableDefaultCheck);
     randomFile.close();
   }
 
@@ -270,7 +348,6 @@
 // TODO(ricow): Add prefetching to the browsers. We spend a lot of time waiting
 // for the next test. Handling timeouts is the hard part of this!
 
-
   Browser browser;
   BrowserTest currentTest;
   // This is currently not used for anything except for error reporting.
@@ -312,14 +389,17 @@
  * whenever a test completes.
  */
 class BrowserTestRunner {
-  int maxNumBrowsers;
+  String local_ip;
   String browserName;
+  int maxNumBrowsers;
 
   bool underTermination = false;
 
   List<BrowserTest> testQueue = new List<BrowserTest>();
   Map<String, BrowserTestingStatus> browserStatus =
       new Map<String, BrowserTestingStatus>();
+
+  var adbDeviceMapping = new Map<String, AdbDevice>();
   // This cache is used to guarantee that we never see double reporting.
   // If we do we need to provide developers with this information.
   // We don't add urls to the cache until we have run it.
@@ -328,34 +408,68 @@
 
   BrowserTestingServer testingServer;
 
-  BrowserTestRunner(String this.browserName, int this.maxNumBrowsers);
+  BrowserTestRunner(this.local_ip, this.browserName, this.maxNumBrowsers);
 
   Future<bool> start() {
-    testingServer = new BrowserTestingServer();
+    testingServer = new BrowserTestingServer(local_ip);
     return testingServer.start().then((_) {
       testingServer.testDoneCallBack = handleResults;
       testingServer.nextTestCallBack = getNextTest;
-      var futures = [];
-      for (int i = 0; i < maxNumBrowsers; i++) {
-        var browser = getInstance();
-        var id = "BROWSER$i";
-        // We store this in case we need to kill the browser.
-        browser.id = id;
-        var future =
-            browser.start(testingServer.getDriverUrl(id)).then((success) {
-              if (success) {
-                browserStatus[id] = new BrowserTestingStatus(browser);
-              }
-              return success;
-            });
-        futures.add(future);
-      }
-      return Future.wait(futures).then((values) {
-        return !values.contains(false);
+      return getBrowsers().then((browsers) {
+        var futures = [];
+        for (var browser in browsers) {
+          var url = testingServer.getDriverUrl(browser.id);
+          var future = browser.start(url).then((success) {
+            if (success) {
+              browserStatus[browser.id] = new BrowserTestingStatus(browser);
+            }
+            return success;
+          });
+          futures.add(future);
+        }
+        return Future.wait(futures).then((values) {
+          return !values.contains(false);
+        });
       });
     });
   }
 
+  Future<List<Browser>> getBrowsers() {
+    // TODO(kustermann): This is a hackisch way to accomplish it and should
+    // be encapsulated
+    var browsersCompleter = new Completer();
+    if (browserName == 'chromeOnAndroid') {
+      AdbHelper.listDevices().then((deviceIds) {
+        if (deviceIds.length > 0) {
+          var browsers = [];
+          for (int i = 0; i < deviceIds.length; i++) {
+            var id = "BROWSER$i";
+            var device = new AdbDevice(deviceIds[i]);
+            adbDeviceMapping[id] = device;
+            var browser = new AndroidChrome(device);
+            browsers.add(browser);
+            // We store this in case we need to kill the browser.
+            browser.id = id;
+          }
+          browsersCompleter.complete(browsers);
+        } else {
+          throw new StateError("No android devices found.");
+        }
+      });
+    } else {
+      var browsers = [];
+      for (int i = 0; i < maxNumBrowsers; i++) {
+        var id = "BROWSER$i";
+        var browser = getInstance();
+        browsers.add(browser);
+        // We store this in case we need to kill the browser.
+        browser.id = id;
+      }
+      browsersCompleter.complete(browsers);
+    }
+    return browsersCompleter.future;
+  }
+
   var timedOut = [];
 
   void handleResults(String browserId, String output, int testId) {
@@ -404,8 +518,12 @@
         print("could not kill browser $id");
         return;
       }
-      // Start the new browser first
-      var browser = getInstance();
+      var browser;
+      if (browserName == 'chromeOnAndroid') {
+        browser = new AndroidChrome(adbDeviceMapping[id]);
+      } else {
+        browser = getInstance();
+      }
       browser.start(testingServer.getDriverUrl(id)).then((success) {
         // We may have started terminating in the mean time.
         if (underTermination) {
@@ -493,14 +611,13 @@
       return new Chrome();
     } else if (browserName == "ff") {
       return new Firefox();
+    } else {
+      throw "Non supported browser for browser controller";
     }
-    throw "Non supported browser for browser controller";
   }
 }
 
 class BrowserTestingServer {
-  const String server = "127.0.0.1";
-
   /// Interface of the testing server:
   ///
   /// GET /driver/BROWSER_ID -- This will get the driver page to fetch
@@ -513,6 +630,7 @@
   /// POST /report/BROWSER_ID?id=NUM -- sends back the dom of the executed
   ///                                   test
 
+  final String local_ip;
 
   const String driverPath = "/driver";
   const String nextTestPath = "/next_test";
@@ -527,8 +645,10 @@
   Function testDoneCallBack;
   Function nextTestCallBack;
 
+  BrowserTestingServer(this.local_ip);
+
   Future start() {
-    return HttpServer.bind(server, 0).then((createdServer) {
+    return HttpServer.bind(local_ip, 0).then((createdServer) {
       httpServer = createdServer;
       void handler(HttpRequest request) {
         if (request.uri.path.startsWith(reportPath)) {
@@ -600,7 +720,7 @@
       exit(1);
       // This should never happen - exit immediately;
     }
-    return "http://$server:${httpServer.port}/driver/$browserId";
+    return "http://$local_ip:${httpServer.port}/driver/$browserId";
   }
 
 
@@ -612,8 +732,11 @@
   <script type='text/javascript'>
     var number_of_tests = 0;
     var current_id;
-    var testing_window;
     var last_reported_id;
+    var testing_window;
+    // We use this to determine if we did actually get back a start event
+    // from the test we just loaded.
+    var did_start = false;
 
     function newTaskHandler() {
       if (this.readyState == this.DONE) {
@@ -630,6 +753,7 @@
             var split = this.responseText.split('#');
             var nextTask = split[0];
             current_id = split[1];
+            did_start = false;
             run(nextTask);
           }
         } else {
@@ -656,17 +780,26 @@
     }
 
     function reportMessage(msg) {
+      if (msg == 'STARTING') {
+        did_start = true;
+        return;
+      }
       var client = new XMLHttpRequest();
       function handleReady() {
         if (this.readyState == this.DONE) {
-          if (current_id != last_reported_id) {
+          if (last_reported_id != current_id && did_start) {
             getNextTask();
             last_reported_id = current_id;
           }
         }
       }
       client.onreadystatechange = handleReady;
-      client.open('POST', '$reportPath/${browserId}?id=' + current_id);
+      // If did_start is false it means that we did actually set the url on
+      // the testing_window, but this is a report left in the event loop or
+      // a callback because the page did not load yet.
+      // In both cases this is a double report from the last test.
+      var posting_id = did_start ? current_id : last_reported_id;
+      client.open('POST', '$reportPath/${browserId}?id=' + posting_id);
       client.setRequestHeader('Content-type',
                               'application/x-www-form-urlencoded');
       client.send(msg);
diff --git a/tools/testing/dart/http_server.dart b/tools/testing/dart/http_server.dart
index 5b503c4..986bd53 100644
--- a/tools/testing/dart/http_server.dart
+++ b/tools/testing/dart/http_server.dart
@@ -52,7 +52,7 @@
       help: 'Print this usage information.');
   parser.addOption('build-directory', help: 'The build directory to use.');
   parser.addOption('network', help: 'The network interface to use.',
-      defaultsTo: '127.0.0.1');
+      defaultsTo: '0.0.0.0');
   parser.addFlag('csp', help: 'Use Content Security Policy restrictions.',
       defaultsTo: false);
   parser.addOption('runtime', help: 'The runtime we are using (for csp flags).',
@@ -89,6 +89,16 @@
  * test framework, such as dealing with package-root.
  */
 class TestingServers {
+  static final _HARMLESS_REQUEST_PATH_ENDINGS = [
+    "/apple-touch-icon.png",
+    "/apple-touch-icon-precomposed.png",
+    "/favicon.ico",
+    "/foo",
+    "/bar",
+    "/NonExistingFile",
+    "/hahaURL",
+  ];
+
   List _serverList = [];
   Path _buildDirectory = null;
   final bool useContentSecurityPolicy;
@@ -349,10 +359,12 @@
   }
 
   void _sendNotFound(HttpRequest request, HttpResponse response) {
-    // NOTE: Since some tests deliberately try to access non-existent files.
-    // We might want to remove this warning (otherwise it will show
-    // up in the debug.log every time).
-    if (request.uri.path != "/favicon.ico") {
+    bool isHarmlessPath(String path) {
+      return _HARMLESS_REQUEST_PATH_ENDINGS.any((ending) {
+        return path.endsWith(ending);
+      });
+    }
+    if (!isHarmlessPath(request.uri.path)) {
       DebugLogger.warning('HttpServer: could not find file for request path: '
                           '"${request.uri.path}"');
     }
diff --git a/tools/testing/dart/status_expression.dart b/tools/testing/dart/status_expression.dart
index 95f175c..8fae9e1 100644
--- a/tools/testing/dart/status_expression.dart
+++ b/tools/testing/dart/status_expression.dart
@@ -8,8 +8,8 @@
  * Parse and evaluate expressions in a .status file for Dart and V8.
  * There are set expressions and Boolean expressions in a .status file.
  * The grammar is:
- *   BooleanExpression := $variableName == value | $variableName |
- *                        (BooleanExpression) |
+ *   BooleanExpression := $variableName == value | $variableName != value |
+ *                        $variableName | (BooleanExpression) |
  *                        BooleanExpression && BooleanExpression |
  *                        BooleanExpression || BooleanExpression
  *
@@ -37,6 +37,7 @@
   static const String DOLLAR_SYMBOL = r"$";
   static const String UNION = ",";
   static const String EQUALS = "==";
+  static const String NOT_EQUALS = "!=";
   static const String AND = "&&";
   static const String OR = "||";
 }
@@ -49,10 +50,10 @@
   Tokenizer(String this.expression)
     : tokens = new List<String>();
 
-  //  Tokens are : "(", ")", "$", ",", "&&", "||", "==", and (maximal) \w+.
+  // Tokens are : "(", ")", "$", ",", "&&", "||", "==", "!=", and (maximal) \w+.
   static final testRegexp =
-      new RegExp(r"^([()$\w\s,]|(\&\&)|(\|\|)|(\=\=))+$");
-  static final regexp = new RegExp(r"[()$,]|(\&\&)|(\|\|)|(\=\=)|\w+");
+      new RegExp(r"^([()$\w\s,]|(\&\&)|(\|\|)|(\=\=)|(\!\=))+$");
+  static final regexp = new RegExp(r"[()$,]|(\&\&)|(\|\|)|(\=\=)|(\!\=)|\w+");
 
   List<String> tokenize() {
     if (!testRegexp.hasMatch(expression)) {
@@ -77,12 +78,17 @@
 class Comparison implements BooleanExpression {
   TermVariable left;
   TermConstant right;
+  bool negate;
 
-  Comparison(this.left, this.right);
+  Comparison(this.left, this.right, this.negate);
 
-  bool evaluate(environment) =>
-      left.termValue(environment) == right.termValue(environment);
-  String toString() => "(\$${left.name} == ${right.value})";
+  bool evaluate(environment) {
+    return
+        negate != (left.termValue(environment) == right.termValue(environment));
+  }
+
+  String toString() =>
+      "(\$${left.name} ${negate ? '!=' : '=='} ${right.value})";
 }
 
 
@@ -290,7 +296,9 @@
     }
     TermVariable left = new TermVariable(scanner.current);
     scanner.advance();
-    if (scanner.current == Token.EQUALS) {
+    if (scanner.current == Token.EQUALS ||
+        scanner.current == Token.NOT_EQUALS) {
+      bool negate = scanner.current == Token.NOT_EQUALS;
       scanner.advance();
       if (!new RegExp(r"^\w+$").hasMatch(scanner.current)) {
         throw new RuntimeError(
@@ -298,7 +306,7 @@
       }
       TermConstant right = new TermConstant(scanner.current);
       scanner.advance();
-      return new Comparison(left, right);
+      return new Comparison(left, right, negate);
     } else {
       return new BooleanVariable(left);
     }
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index a31b093..bda38e0 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -74,7 +74,8 @@
 
    dart2js: Compile dart code to JavaScript by running dart2js.
          (only valid with the following runtimes: d8, drt, chrome,
-         safari, ie9, ie10, firefox, opera, none (compile only)),
+         safari, ie9, ie10, firefox, opera, chromeOnAndroid,
+         none (compile only)),
 
    dartc: Perform static analysis on Dart code by running dartc.
           (only valid with the following runtimes: none),
@@ -98,14 +99,15 @@
 
     dartium: Run Dart or JavaScript in Dartium.
 
-    [ff | chrome | safari | ie9 | ie10 | opera]: Run JavaScript in the specified
-         browser.
+    [ff | chrome | safari | ie9 | ie10 | opera | chromeOnAndroid]:
+        Run JavaScript in the specified browser.
 
     none: No runtime, compile only (for example, used for dartc static analysis
           tests).''',
               ['-r', '--runtime'],
               ['vm', 'd8', 'jsshell', 'drt', 'dartium', 'ff', 'firefox',
-               'chrome', 'safari', 'ie9', 'ie10', 'opera', 'none'],
+               'chrome', 'safari', 'ie9', 'ie10', 'opera', 'chromeOnAndroid',
+               'none'],
               'vm'),
           new _TestOptionSpecification(
               'arch',
@@ -309,7 +311,14 @@
               [],
               false,
               'bool'
-              ),];
+              ),
+          new _TestOptionSpecification(
+              'local_ip',
+              'IP address the http servers should listen on.'
+              'This address is also used for browsers to connect.',
+              ['--local_ip'],
+              [],
+              '127.0.0.1'),];
   }
 
 
@@ -447,7 +456,7 @@
         // with dart2js, we should remove it from here.
         validRuntimes = const ['d8', 'jsshell', 'drt', 'none', 'dartium',
                                'ff', 'chrome', 'safari', 'ie9', 'ie10',
-                               'opera'];
+                               'opera', 'chromeOnAndroid'];
         break;
       case 'dartc':
       case 'dartanalyzer':
@@ -615,7 +624,6 @@
           if (configuration['checked']) {
             timeout *= 2;
           }
-
           break;
         default:
           if (configuration['mode'] == 'debug') {
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index 94c33bb..93c38e9 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -30,8 +30,6 @@
 
 const int CRASHING_BROWSER_EXITCODE = -10;
 
-const int NUMBER_OF_BROWSERCONTROLLER_BROWSERS = 4;
-
 typedef void TestCaseEvent(TestCase testCase);
 typedef void ExitCodeEvent(int exitCode);
 typedef void EnqueueMoreWork(ProcessQueue queue);
@@ -1117,7 +1115,6 @@
   String _status;
   DateTime _startTime;
   Timer _timer;
-
   bool _isWebDriver;
 
   BatchRunnerProcess(TestCase testCase) {
@@ -1264,9 +1261,7 @@
         } else if (line.startsWith('>>> BATCH')) {
           // ignore
         } else if (line.startsWith('>>> ')) {
-          throw new Exception(
-              'Unexpected command from ${testCase.configuration['compiler']} '
-              'batch runner.');
+          throw new Exception("Unexpected command from batch runner: '$line'.");
         } else {
           _testStdout.addAll(encodeUtf8(line));
           _testStdout.addAll("\n".codeUnits);
@@ -1601,17 +1596,19 @@
   }
 
   Future<BrowserTestRunner> _getBrowserTestRunner(TestCase test) {
+    var local_ip = test.configuration['local_ip'];
     var runtime = test.configuration['runtime'];
+    var num_browsers = test.configuration['tasks'];
     if (_browserTestRunners[runtime] == null) {
       var testRunner =
-        new BrowserTestRunner(runtime, NUMBER_OF_BROWSERCONTROLLER_BROWSERS);
+        new BrowserTestRunner(local_ip, runtime, num_browsers);
       _browserTestRunners[runtime] = testRunner;
       return testRunner.start().then((started) {
         if (started) {
           return testRunner;
         }
         print("Issue starting browser test runner");
-        exit(1);
+        io.exit(1);
       });
     }
     return new Future.immediate(_browserTestRunners[runtime]);
@@ -1719,7 +1716,6 @@
           _tryRunTest();
         };
         test.completedHandler = testCompleted;
-
         if (test.usesBrowserController) {
           _startBrowserControllerTest(test);
         } else {
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 329d087..38fd5ee 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -468,7 +468,7 @@
         recursive: true);
   }
 
-  Collection<Uri> get dart2JsBootstrapDependencies {
+  List<Uri> get dart2JsBootstrapDependencies {
     if (!useSdk) return [];
 
     var snapshotPath = TestUtils.absolutePath(new Path(buildDir).join(
@@ -853,7 +853,8 @@
       crossOriginPort = configuration['_servers_'].crossOriginPort;
     }
 
-    var url= 'http://127.0.0.1:$serverPort$pathComponent'
+    var local_ip = configuration['local_ip'];
+    var url= 'http://$local_ip:$serverPort$pathComponent'
         '?crossOriginPort=$crossOriginPort';
     if (info.optionsFromFile['isMultiHtmlTest'] && subtestNames.length > 0) {
       url= '${url}&group=${subtestNames[subtestIndex]}';
@@ -872,6 +873,7 @@
     dartWrapper.closeSync();
   }
 
+
   /**
    * The [StandardTestSuite] has support for tests that
    * compile a test from Dart to JavaScript, and then run the resulting
@@ -975,6 +977,7 @@
         }
       }
 
+
       // Variables for browser multi-tests.
       List<String> subtestNames = info.optionsFromFile['subtestNames'];
       TestCase multitestParentTest;
@@ -1679,7 +1682,7 @@
       _cache[uri.path] = file.existsSync() ? file.lastModifiedSync() : null;
       return _cache[uri.path];
     }
-    return new Date.now();
+    return new DateTime.now();
   }
 }
 
@@ -1812,7 +1815,8 @@
       'safari',
       'opera',
       'chrome',
-      'ff'
+      'ff',
+      'chromeOnAndroid',
     ];
     return BROWSERS.contains(runtime);
   }
diff --git a/tools/testing/perf_testing/run_perf_tests.py b/tools/testing/perf_testing/run_perf_tests.py
index 8639452..5ce3f85 100755
--- a/tools/testing/perf_testing/run_perf_tests.py
+++ b/tools/testing/perf_testing/run_perf_tests.py
@@ -26,8 +26,8 @@
                                              '..', '..', '..',
                                              'dart_checkout_for_perf_testing',
                                              'dart'))
-# The earliest stored version of Dartium. Don't try to test earlier than this.
-EARLIEST_REVISION = 4285
+# How far back in time we want to test.
+EARLIEST_REVISION = 6285
 FIRST_CHROMEDRIVER = 7823
 sys.path.append(TOOLS_PATH)
 sys.path.append(os.path.join(TOP_LEVEL_DIR, 'internal', 'tests'))
@@ -80,7 +80,7 @@
     return output, stderr
 
   def TimeCmd(self, cmd):
-    """Determine the amount of (real) time it takes to execute a given 
+    """Determine the amount of (real) time it takes to execute a given
     command."""
     start = time.time()
     self.RunCmd(cmd)
@@ -95,7 +95,7 @@
         if line.startswith('?'):
           to_remove = line.split()[1]
           if os.path.isdir(to_remove):
-            shutil.rmtree(to_remove, ignore_errors=True)
+            shutil.rmtree(to_remove, onerror=TestRunner._OnRmError)
           else:
             os.remove(to_remove)
         elif any(line.startswith(status) for status in ['A', 'M', 'C', 'D']):
@@ -128,15 +128,28 @@
       self.RunCmd(['gclient', 'sync'])
     else:
       self.RunCmd(['gclient', 'sync', '-r', str(revision_num), '-t'])
-    
+
     shutil.copytree(os.path.join(TOP_LEVEL_DIR, 'internal'),
                     os.path.join(DART_REPO_LOC, 'internal'))
+    shutil.rmtree(os.path.join(DART_REPO_LOC, 'third_party', 'gsutil'),
+                  onerror=TestRunner._OnRmError)
+    shutil.copytree(os.path.join(TOP_LEVEL_DIR, 'third_party', 'gsutil'),
+                    os.path.join(DART_REPO_LOC, 'third_party', 'gsutil'))
     shutil.copy(os.path.join(TOP_LEVEL_DIR, 'tools', 'get_archive.py'),
                     os.path.join(DART_REPO_LOC, 'tools', 'get_archive.py'))
     shutil.copy(
         os.path.join(TOP_LEVEL_DIR, 'tools', 'testing', 'run_selenium.py'),
         os.path.join(DART_REPO_LOC, 'tools', 'testing', 'run_selenium.py'))
 
+  @staticmethod
+  def _OnRmError(func, path, exc_info):
+    """On Windows, the output directory is marked as "Read Only," which causes
+    an error to be thrown when we use shutil.rmtree. This helper function
+    changes the permissions so we can still delete the directory."""
+    if os.path.exists(path):
+      os.chmod(path, stat.S_IWRITE)
+      os.unlink(path)
+
   def SyncAndBuild(self, suites, revision_num=None):
     """Make sure we have the latest version of of the repo, and build it. We
     begin and end standing in DART_REPO_LOC.
@@ -154,23 +167,17 @@
     success, stdout, stderr = self.GetArchive('sdk')
     if (not os.path.exists(os.path.join(
         DART_REPO_LOC, 'tools', 'get_archive.py')) or not success
-        or 'InvalidUriError' in stderr or "Couldn't download" in stdout):
+        or 'InvalidUriError' in stderr or "Couldn't download" in stdout or
+        'Unable to download' in stdout):
       # Couldn't find the SDK on Google Storage. Build it locally.
 
-      # On Windows, the output directory is marked as "Read Only," which causes
-      # an error to be thrown when we use shutil.rmtree. This helper function
-      # changes the permissions so we can still delete the directory.
-      def on_rm_error(func, path, exc_info):
-        if os.path.exists(path):
-          os.chmod(path, stat.S_IWRITE)
-          os.unlink(path)
-      # TODO(efortuna): Currently always building ia32 architecture because we 
-      # don't have test statistics for what's passing on x64. Eliminate arch 
+      # TODO(efortuna): Currently always building ia32 architecture because we
+      # don't have test statistics for what's passing on x64. Eliminate arch
       # specification when we have tests running on x64, too.
       shutil.rmtree(os.path.join(os.getcwd(),
                     utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32')),
-                    onerror=on_rm_error)
-      lines = self.RunCmd([os.path.join('.', 'tools', 'build.py'), '-m', 
+                    onerror=TestRunner._OnRmError)
+      lines = self.RunCmd([os.path.join('.', 'tools', 'build.py'), '-m',
                             'release', '--arch=ia32', 'create_sdk'])
 
       for line in lines:
@@ -187,7 +194,7 @@
 
     Args:
       dir_name: the directory we will create if it does not exist."""
-    dir_path = os.path.join(TOP_LEVEL_DIR, 'tools', 
+    dir_path = os.path.join(TOP_LEVEL_DIR, 'tools',
                             'testing', 'perf_testing', dir_name)
     if not os.path.exists(dir_path):
       os.makedirs(dir_path)
@@ -284,7 +291,7 @@
             UpdateSetOfDoneCls(last_done_cl)
           last_done_cl += 1
       return (False, None)
-    
+
   def GetOsDirectory(self):
     """Specifies the name of the directory for the testing build of dart, which
     has yet a different naming convention from utils.getBuildRoot(...)."""
@@ -299,7 +306,7 @@
     parser = optparse.OptionParser()
     parser.add_option('--suites', '-s', dest='suites', help='Run the specified '
                       'comma-separated test suites from set: %s' % \
-                      ','.join(TestBuilder.AvailableSuiteNames()), 
+                      ','.join(TestBuilder.AvailableSuiteNames()),
                       action='store', default=None)
     parser.add_option('--forever', '-f', dest='continuous', help='Run this scri'
                       'pt forever, always checking for the next svn checkin',
@@ -311,7 +318,7 @@
                       help='Do not post the results of the run.', default=False)
     parser.add_option('--notest', '-t', dest='no_test', action='store_true',
                       help='Do not run the tests.', default=False)
-    parser.add_option('--verbose', '-v', dest='verbose', 
+    parser.add_option('--verbose', '-v', dest='verbose',
                       help='Print extra debug output', action='store_true',
                       default=False)
     parser.add_option('--backfill', '-b', dest='backfill',
@@ -402,27 +409,27 @@
     self.revision_dict = dict()
     self.values_dict = dict()
     self.extra_metrics = extra_metrics
-    # Initialize our values store.		
-    for platform in platform_list:		
-      self.revision_dict[platform] = dict()		
-      self.values_dict[platform] = dict()		
-      for f in variants:		
-        self.revision_dict[platform][f] = dict()		
-        self.values_dict[platform][f] = dict()		
-        for val in values_list:		
-          self.revision_dict[platform][f][val] = []		
-          self.values_dict[platform][f][val] = []		
-        for extra_metric in extra_metrics:		
-          self.revision_dict[platform][f][extra_metric] = []		
+    # Initialize our values store.
+    for platform in platform_list:
+      self.revision_dict[platform] = dict()
+      self.values_dict[platform] = dict()
+      for f in variants:
+        self.revision_dict[platform][f] = dict()
+        self.values_dict[platform][f] = dict()
+        for val in values_list:
+          self.revision_dict[platform][f][val] = []
+          self.values_dict[platform][f][val] = []
+        for extra_metric in extra_metrics:
+          self.revision_dict[platform][f][extra_metric] = []
           self.values_dict[platform][f][extra_metric] = []
 
   def IsValidCombination(self, platform, variant):
     """Check whether data should be captured for this platform/variant
     combination.
     """
-    # TODO(vsm): This avoids a bug in 32-bit Chrome (dartium)
-    # running JS dromaeo.
-    if platform == 'dartium' and variant == 'js':
+    if platform == 'dartium' and (variant == 'js' or variant == 'dart2js_html'):
+      # Testing JavaScript performance on Dartium is a waste of time. Should be
+      # same as Chrome.
       return False
     if (platform == 'safari' and variant == 'dart2js' and
         int(self.test_runner.current_revision_num) < 10193):
@@ -439,7 +446,7 @@
     """
     for visitor in [self.tester, self.file_processor]:
       visitor.Prepare()
-    
+
     os.chdir(TOP_LEVEL_DIR)
     self.test_runner.EnsureOutputDirectory(self.result_folder_name)
     self.test_runner.EnsureOutputDirectory(os.path.join(
@@ -465,7 +472,7 @@
 
 
 class Tester(object):
-  """The base level visitor class that runs tests. It contains convenience 
+  """The base level visitor class that runs tests. It contains convenience
   methods that many Tester objects use. Any class that would like to be a
   TesterVisitor must implement the RunTests() method."""
 
@@ -481,10 +488,21 @@
     def get_dartium_revision():
       version_file_name = os.path.join(DART_REPO_LOC, 'client', 'tests',
                                        'dartium', 'LAST_VERSION')
-      version_file = open(version_file_name, 'r')
-      version = version_file.read().split('.')[-2]
-      version_file.close()
-      return version
+      try:
+        version_file = open(version_file_name, 'r')
+        version = version_file.read().split('.')[-3].split('-')[-1]
+        version_file.close()
+        return version
+      except IOError as e:
+        dartium_dir = os.path.join(DART_REPO_LOC, 'client', 'tests', 'dartium')
+        if (os.path.exists(os.path.join(dartium_dir, 'Chromium.app', 'Contents',
+            'MacOS', 'Chromium') or os.path.exists(os.path.join(dartium_dir,
+            'chrome.exe'))) or
+            os.path.exists(os.path.join(dartium_dir, 'chrome'))):
+          print "Error: VERSION file wasn't found."
+          return SearchForRevision()
+        else:
+          raise
 
     if browser and browser == 'dartium':
       revision = get_dartium_revision()
@@ -495,7 +513,7 @@
 
 
 class Processor(object):
-  """The base level vistor class that processes tests. It contains convenience 
+  """The base level vistor class that processes tests. It contains convenience
   methods that many File Processor objects use. Any class that would like to be
   a ProcessorVisitor must implement the ProcessFile() method."""
 
@@ -512,7 +530,7 @@
 
   def OpenTraceFile(self, afile, not_yet_uploaded):
     """Find the correct location for the trace file, and open it.
-    Args: 
+    Args:
       afile: The tracefile name.
       not_yet_uploaded: True if this file is to be found in a directory that
          contains un-uploaded data.
@@ -522,7 +540,7 @@
       file_path = os.path.join('old', file_path)
     return open(file_path)
 
-  def ReportResults(self, benchmark_name, score, platform, variant, 
+  def ReportResults(self, benchmark_name, score, platform, variant,
                      revision_number, metric):
     """Store the results of the benchmark run.
     Args:
@@ -533,7 +551,7 @@
           combination of both, or Dart depending on the test.
       revision_number: The revision of the code (and sometimes the revision of
           dartium).
-  
+
     Returns: True if the post was successful file."""
     return post_results.report_results(benchmark_name, score, platform, variant,
                                        revision_number, metric)
@@ -541,7 +559,7 @@
   def CalculateGeometricMean(self, platform, variant, svn_revision):
     """Calculate the aggregate geometric mean for JS and dart2js benchmark sets,
     given two benchmark dictionaries."""
-    geo_mean = 0		
+    geo_mean = 0
     if self.test.IsValidCombination(platform, variant):
       for benchmark in self.test.values_list:
         if not self.test.values_dict[platform][variant][benchmark]:
@@ -589,7 +607,7 @@
     self.platform_list = platform_list
     self.platform_type = platform_type
     self.versions = versions
-    self.benchmarks = benchmarks 
+    self.benchmarks = benchmarks
 
 
 class BrowserTester(Tester):
@@ -617,10 +635,10 @@
     super(CommonBrowserTest, self).__init__(
         self.Name(), BrowserTester.GetBrowsers(False),
         'browser', ['js', 'dart2js'],
-        self.GetStandaloneBenchmarks(), test_runner, 
+        self.GetStandaloneBenchmarks(), test_runner,
         self.CommonBrowserTester(self),
         self.CommonBrowserFileProcessor(self))
-  
+
   @staticmethod
   def Name():
     return 'browser-perf'
@@ -653,8 +671,8 @@
               'V8vDart_page_%s.html' % version)
           self.test.test_runner.RunCmd(
               ['python', os.path.join('tools', 'testing', 'run_selenium.py'),
-              '--out', file_path, '--browser', browser,
-              '--timeout', '600', '--mode', 'perf'], self.test.trace_file, 
+              '--out', '"file:///%s"' % file_path, '--browser', browser,
+              '--timeout', '600', '--mode', 'perf'], self.test.trace_file,
               append=True)
 
   class CommonBrowserFileProcessor(Processor):
@@ -748,17 +766,17 @@
           'childNodes'])
   }
 
-  # Use filenames that don't have unusual characters for benchmark names.	
-  @staticmethod	
+  # Use filenames that don't have unusual characters for benchmark names.
+  @staticmethod
   def LegalizeFilename(str):
-    remap = {	
-        ' ': '_',	
-        '(': '_',	
-        ')': '_',	
-        '*': 'ALL',	
-        '=': 'ASSIGN',	
-        }	
-    for (old, new) in remap.iteritems():	
+    remap = {
+        ' ': '_',
+        '(': '_',
+        ')': '_',
+        '*': 'ALL',
+        '=': 'ASSIGN',
+        }
+    for (old, new) in remap.iteritems():
       str = str.replace(old, new)
     return str
 
@@ -777,13 +795,13 @@
     valid = DromaeoTester.GetValidDromaeoTags()
     benchmarks = reduce(lambda l1,l2: l1+l2,
                         [tests for (tag, tests) in
-                         DromaeoTester.DROMAEO_BENCHMARKS.values() 
+                         DromaeoTester.DROMAEO_BENCHMARKS.values()
                          if tag in valid])
     return map(DromaeoTester.LegalizeFilename, benchmarks)
 
   @staticmethod
   def GetDromaeoVersions():
-    return ['js', 'dart2js_html']
+    return ['js', 'dart2js_html', 'dart_html']
 
 
 class DromaeoTest(RuntimePerformanceTest):
@@ -793,7 +811,7 @@
         self.Name(),
         BrowserTester.GetBrowsers(True),
         'browser',
-        DromaeoTester.GetDromaeoVersions(), 
+        DromaeoTester.GetDromaeoVersions(),
         DromaeoTester.GetDromaeoBenchmarks(), test_runner,
         self.DromaeoPerfTester(self),
         self.DromaeoFileProcessor(self))
@@ -804,7 +822,7 @@
 
   class DromaeoPerfTester(DromaeoTester):
     def MoveChromeDriverIfNeeded(self, browser):
-      """Move the appropriate version of ChromeDriver onto the path. 
+      """Move the appropriate version of ChromeDriver onto the path.
       TODO(efortuna): This is a total hack because the latest version of Chrome
       (Dartium builds) requires a different version of ChromeDriver, that is
       incompatible with the release or beta Chrome and vice versa. Remove these
@@ -853,9 +871,9 @@
             if os.path.exists(orig_chromedriver_path):
               MoveChromedriver(loc)
           elif browser == 'dartium':
-            if (int(self.test.test_runner.current_revision_num) < 
+            if (int(self.test.test_runner.current_revision_num) <
                 FIRST_CHROMEDRIVER):
-              # If we don't have a stashed a different chromedriver just use
+              # If we don't have a stashed different chromedriver just use
               # the regular chromedriver.
               if not os.path.exists(os.path.dirname(orig_chromedriver_path)):
                 os.makedirs(os.path.dirname(orig_chromedriver_path))
@@ -878,7 +896,6 @@
 
     def RunTests(self):
       """Run dromaeo in the browser."""
-      
       success, _, _ = self.test.test_runner.GetArchive('dartium')
       if not success:
         # Unable to download dartium. Try later.
@@ -912,11 +929,12 @@
               'tools', 'testing', 'perf_testing', self.test.result_folder_name,
               'dromaeo-%s-%s-%s' % (self.test.cur_time, browser, version_name))
           self.AddSvnRevisionToTrace(self.test.trace_file, browser)
-          file_path = '"%s"' % os.path.join(os.getcwd(), dromaeo_path,
-              'index-js.html?%s' % version)
+          file_path = os.path.join(os.getcwd(), dromaeo_path,
+              'index%s.html?%s' % (
+              '' if version_name == 'dart_html' else '-js', version))
           self.test.test_runner.RunCmd(
               ['python', os.path.join('tools', 'testing', 'run_selenium.py'),
-               '--out', file_path, '--browser', browser,
+               '--out', '"file:///%s"' % file_path, '--browser', browser,
                '--timeout', '900', '--mode', 'dromaeo'], self.test.trace_file,
                append=True)
       # Put default Chromedriver back in.
@@ -1042,13 +1060,13 @@
   """Fill in back history performance data. This is done one of two ways, with
   equal probability of trying each way (falling back on the sequential version
   as our data becomes more densely populated)."""
-  has_run_extra = False
   revision_num = int(SearchForRevision(DART_REPO_LOC))
+  has_run_extra = False
 
   def TryToRunAdditional(revision_number):
     """Determine the number of results we have stored for a particular revision
     number, and if it is less than 10, run some extra tests.
-    Args: 
+    Args:
       - revision_number: the revision whose performance we want to potentially
         test.
     Returns: True if we successfully ran some additional tests."""
@@ -1076,44 +1094,14 @@
       return False
     return True
 
-  if random.choice([True, False]):
-    # Select a random CL number, with greater likelihood of selecting a CL in
-    # the more recent history than the distant past (using a simplified weighted
-    # bucket algorithm). If that CL has less than 10 runs, run additional. If it
-    # already has 10 runs, look for another CL number that is not yet have all
-    # of its additional runs (do this up to 15 times).
-    tries = 0
-    # Select which "thousands bucket" we're going to run additional tests for.
-    bucket_size = 1000
-    thousands_list = range(EARLIEST_REVISION/bucket_size,
-                           int(revision_num)/bucket_size + 1)
-    weighted_total = sum(thousands_list)
-    generated_random_number = random.randint(0, weighted_total - 1)
-    for i in list(reversed(thousands_list)):
-      thousands = i
-      weighted_total -= i
-      if weighted_total <= generated_random_number:
-        break
-    while tries < 15 and not has_run_extra:
-      # Now select a particular revision in that bucket.
-      if thousands == int(revision_num)/bucket_size:
-        max_range = 1 + revision_num % bucket_size
-      else:
-        max_range = bucket_size
-      rev = thousands * bucket_size + random.randrange(0, max_range)
-      if rev not in results_set:
-        has_run_extra = TryToRunAdditional(rev)
-      tries += 1
-
-  if not has_run_extra:
-    # Try to get up to 10 runs of each CL, starting with the most recent
-    # CL that does not yet have 10 runs. But only perform a set of extra
-    # runs at most 2 at a time before checking to see if new code has been
-    # checked in.
-    while revision_num > EARLIEST_REVISION and not has_run_extra:
-      if revision_num not in results_set:
-        has_run_extra = TryToRunAdditional(revision_num)
-      revision_num -= 1
+  # Try to get up to 10 runs of each CL, starting with the most recent
+  # CL that does not yet have 10 runs. But only perform a set of extra
+  # runs at most 2 at a time before checking to see if new code has been
+  # checked in.
+  while revision_num > EARLIEST_REVISION and not has_run_extra:
+    if revision_num not in results_set:
+      has_run_extra = TryToRunAdditional(revision_num)
+    revision_num -= 1
   if not has_run_extra:
     # No more extra back-runs to do (for now). Wait for new code.
     time.sleep(200)